跳棋游戏:没有错误正确检查?

时间:2013-08-05 15:14:41

标签: java

我正在为一项作业制作一个Checkers游戏。除了一件奇怪的事情之外,整个过程都是应该的。这是我的董事会:

Checkers Board

我通过给出源行和列,然后是目标行和列来移动。

move(int srcR, int srcC, int destR, int destC)

如果我尝试将一个片段移动到一个无效点(不是对角线),我应该打印出错误。所以,如果我试图从5 2移动一块 - > 4 2,它给我一个错误信息。

if(destR == srcR+1 || destR == srcR-1 &&
    destC == srcC+1 || destC == srcC-1){
        // code code code
}else
    message = "Invalid Move! Can only move diagonally one space.";

对于大多数事情都有效,但如果我尝试直接向下移动一个空格(例如,2 3 - > 3 3),那么它正在移动该部分,而不是给我错误信息。

我被困住了!任何想法为什么会这样?如果需要,我可以发布更多代码。

6 个答案:

答案 0 :(得分:7)

根据你的逻辑,如果

destC == srcC-1

是真的,整个表达式都是真的。你必须注意Java在必要时评估布尔操作~Add()的顺序〜

答案 1 :(得分:5)

我认为很简单。只有四个允许的动作。

int deltaX = Math.abs(srcR - destR);
int deltaY = Math.abs(srcC - destC);
boolean validMove = deltaX == 1 && deltaY == 1;

当然,这种检查允许向后移动。但是向后移动的方向取决于播放的颜色,而且通过到达另一端来促进片段的推进。

答案 2 :(得分:3)

看起来不错。您只是忘了在复合if语句周围添加右括号。所以,它应该在不应该的时候返回。

答案 3 :(得分:2)

你的逻辑表达是错误的。

查看Java operators precedence

如果有疑问,请始终使用括号:

if((destR == srcR+1 || destR == srcR-1) &&
    (destC == srcC+1 || destC == srcC-1))

答案 4 :(得分:2)

if(destR == srcR+1 || destR == srcR-1 && destC == srcC+1 || destC == srcC-1)

我认为你在这里需要一些括号,因为这个评估很棘手,因为你试图一次比较两个表达式。尝试

if((destR == srcR+1 || destR == srcR-1) && (destC == srcC+1 || destC == srcC-1))

这样,如果(destR = srcR +/- 1)AND(destC = srcC +/- 1),则移动有效。

原始方式可以解决某些的问题,因为Java布尔会比较两个表达式,或者前一个表达式和下一个表达式的结果。

答案 5 :(得分:1)

if(destR == srcR+1 || destR == srcR-1 && destC == srcC+1 || destC == srcC-1)

相当于

if(destR == srcR+1 || (destR == srcR-1 && destC == srcC+1) || destC == srcC-1)

在你的第二个例子中:

srcR  = 2
srcC  = 3
destR = 3
destC = 3

destr(= 3)等于srcR(= 2)+ 1 => destR == srcR+1 true => (destR == srcR+1 || (destR == srcR-1 && destC == srcC+1) || destC == srcC-1)的评估为 true

要解决您的问题,您需要将if声明更改为:

if((destR == srcR+1 || destR == srcR-1) && (destC == srcC+1 || destC == srcC-1))