条件语句未按预期工作

3

我目前正在编写贪吃蛇游戏。简单来说,我遇到了一个关于if语句的问题。让我困扰的部分是检查蛇是否与自身碰撞的方法。

if语句如下:

public void checkCol(){
    for(int i = 0; i < snake.getLength(); i++){
        if((snake.getXPosArray()[snake.getLength() - 1] == snake.getXPosArray()[i])
                && (snake.getYPosArray()[snake.getLength() - 1] == snake.getYPosArray()[i])){
            gameOver();
        }

    }
}

请耐心阅读以下的文字。这段代码的意思是,如果蛇头与蛇身的任何其他部分具有相同的坐标,则游戏结束。

最初,蛇的长度为3,并由坐标数组控制。因此,在循环的第一轮中将检查:

xPos[2] == xPos[0] and the same with yPos[2] == yPos[0]
xPos[2] = 88 , xPos[0] = 66 , yPos[2] = 55 , yPos[0] = 55.

当我运行程序时,蛇立即停止。这很奇怪,因为我检查了方法将要获取的值。上面显示的值是我的if语句检查的值。现在我相信88和66不相等。
我在论坛上寻找更好的关于"&&"运算符的解释,并且一篇帖子告诉我,如果第一个语句为true,"&&"仅会检查两个语句。而单个"&"将检查是否两个参数都为true。但我使用"&"和“&&”得到了相同的结果。
我是否忽略了某些微小的东西?我太累了吗?您能否看出这个语句有什么问题?并告诉我它为什么认为88 == 66?
谢谢您抽出时间!

你尝试过在“if”语句内打印值吗? - Christian Tapia
1
你的想法很好,但是你不能将头与自身进行比较。 - Ingo
我在数组的长度上加了一个-1。现在它运行得非常好。非常感谢!现在应该去睡觉了.. :D - Surangie
2个回答

5
您正在循环遍历蛇的每个单元格,包括头部。由于头部与头部重叠,因此蛇会吃掉自己的头并死亡。请不要在循环中包括头部。

1
宝贵的人生经验教训:不要吃自己的脸。 - roippi
我在数组的长度上加了一个-1。现在它运行得非常好。非常感谢!现在应该去睡觉了.. :D - Surangie

1
“&”和“&&”的区别在于,一个是逻辑运算符,另一个是短路运算符。“&”和“&&”的区别
此外,看起来你最终会将头与头本身进行比较,除非你的“getLength”函数将头位置减一。

我在数组的长度上加了一个-1。现在它运行得非常好。非常感谢!现在应该去睡觉了.. :D - Surangie
如果你想了解它们之间的区别,请查看关于 & 和 && 的链接。同时,请确保给那些有帮助的答案点赞。 - Ion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接