我正在用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异常。不知道如何避免这种情况。
对此有任何想法,也许我可以用不同的逻辑来实现?
答案 0 :(得分:1)
我建议您重写代码并在没有递归的情况下解决问题 - 因为这里不需要。
如果我理解你,你可以在随机位置生成代币并检查蛇(头部或尾部)是否已经占据了这个位置。
以下是我尝试解决您的任务的方法
另一个问题:你的支票是否正确?你会检查头和令牌是否在x / y-ccordinates中处于同一位置?目前,您正在检查x坐标是否相同(头部和标记位于同一行)或y坐标。但两者必须匹配,或?所以我会用条件和||
替换条件或&&
。
答案 1 :(得分:0)
您缺少退出递归方法的基本案例。如果没有基本情况,您的方法将递归调用自身,并且永远不会终止,直到机器变得不堪重负。我怀疑你的head
检查是基本情况。
试试这个:
if (token_x == head_x || token_y == head_y)
{
return;
}