递归调用,堆栈溢出异常?

时间:2014-03-16 19:27:14

标签: java recursion stack-overflow

我正在用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_xhead_y是蛇头的(x,y)位置。
  • tail_xtail_y是包含尾对象(x,y)位置的列表。
  • generateNewToken()以递归方式调用方法。

现在当生成一个令牌时,在蛇体内,我得到一个stackoverflow异常。不知道如何避免这种情况。

对此有任何想法,也许我可以用不同的逻辑来实现?

2 个答案:

答案 0 :(得分:1)

我建议您重写代码并在没有递归的情况下解决问题 - 因为这里不需要。

如果我理解你,你可以在随机位置生成代币并检查蛇(头部或尾部)是否已经占据了这个位置。

以下是我尝试解决您的任务的方法

  • 生成随机令牌
  • 检查头部或尾部位置是否与令牌位置匹配
  • 如果是,请重新生成令牌(while-loop?)
  • 如果没有,你就完成了

另一个问题:你的支票是否正确?你会检查头和令牌是否在x / y-ccordinates中处于同一位置?目前,您正在检查x坐标是否相同(头部和标记位于同一行)或y坐标。但两者必须匹配,或?所以我会用条件和||替换条件或&&

答案 1 :(得分:0)

您缺少退出递归方法的基本案例。如果没有基本情况,您的方法将递归调用自身,并且永远不会终止,直到机器变得不堪重负。我怀疑你的head检查是基本情况。

试试这个:

if (token_x == head_x || token_y == head_y)
{
  return;
}