有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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


共 (2) 个答案

  1. # 1 楼答案

    我建议您重写代码,在不使用递归的情况下解决问题,因为这里不需要递归

    如果我没弄错的话,你可以在随机位置生成一个标记,然后检查蛇(头或尾)是否已经占据了这个位置

    以下是我将如何解决您的任务

    • 生成一个随机令牌
    • 检查头部或尾部位置是否与标记位置匹配
    • 如果是,则重新生成令牌(while循环?)
    • 如果没有,你就完了

    嗯,还有一个问题:你的支票对吗?您将检查什么以查看磁头和令牌在x/y坐标中是否处于同一位置?此时,您正在检查x坐标是否相同(头部和标记位于同一行)或y坐标。但两者必须匹配,还是?因此,我将用条件and替换条件or||

  2. # 2 楼答案

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

    试试这个:

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