java递归调用,stackoverflow执行选项?
我正在用Java编写一个蛇游戏。作为游戏的一部分,我必须随机分配一个标记,蛇将“吃”以增加分数。所以这里我使用一个随机生成器,但为了不在蛇体内生成一个标记,我使用以下逻辑:
token_x = (tokenPositionGenerator.nextInt(40)*10)+30;
token_y = (tokenPositionGenerator.nextInt(40)*10)+30;
// check if token is generated in place of snake head
if (token_x == head_x || token_y == head_y)
{
generateNewToken();
}
// check if token is generated within rest of snakes body
for (int i=0;i<tail_x.size();i++){
if (token_x == tail_x.get(i) || token_y == tail_y.get(i))
{
generateNewToken();
}
}
head_x
,head_y
是蛇头的(x,y)位置李>tail_x
和tail_y
是包含尾部对象(x,y)位置的列表李>generateNewToken()
正在递归调用该方法李>
现在,当在蛇体内生成令牌时,我得到一个stackoverflow异常。我不知道如何避免
对此有什么想法,也许我可以用不同的逻辑来实现
# 1 楼答案
我建议您重写代码,在不使用递归的情况下解决问题,因为这里不需要递归
如果我没弄错的话,你可以在随机位置生成一个标记,然后检查蛇(头或尾)是否已经占据了这个位置
以下是我将如何解决您的任务
嗯,还有一个问题:你的支票对吗?您将检查什么以查看磁头和令牌在x/y坐标中是否处于同一位置?此时,您正在检查x坐标是否相同(头部和标记位于同一行)或y坐标。但两者必须匹配,还是?因此,我将用条件and替换条件or
||
# 2 楼答案
您缺少退出递归方法的基本情况。如果没有基本情况,您的方法将递归地调用自身,并且永远不会终止,直到机器变得不堪重负。我怀疑你的
head
检查是基本情况试试这个: