8

我正在为一项任务制作跳棋游戏。整个事情都按照它应该的方式运行,除了一件奇怪的事情。这是我的板:

跳棋板

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

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),它会移动这块而不给我错误消息。

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

4

6 回答 6

7

According to your logic, if

destC == srcC-1

is true, the whole expression will be true. You have to pay attention to the order that Java evaluate the boolean operations~ Add () when necessary~

于 2013-08-05T15:22:38.140 回答
5

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

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

当然,这个检查允许向后移动。但是后退的方向取决于比赛的颜色以及棋子是否通过到达另一端而得到提升。

于 2013-08-05T15:18:18.413 回答
3

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

于 2013-08-07T05:18:07.667 回答
2

你的逻辑表达是错误的。

看看Java 运算符的优先级

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

if((destR == srcR+1 || destR == srcR-1) &&
    (destC == srcC+1 || destC == srcC-1))
于 2013-08-05T15:24:36.037 回答
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 boolean 比较两个表达式,或者前一个表达式和下一个表达式的结果。

于 2013-08-05T15:28:10.823 回答
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=> 的评估(destR == srcR+1 || (destR == srcR-1 && destC == srcC+1) || destC == srcC-1)

要解决您的问题,您需要将if语句更改为:

if((destR == srcR+1 || destR == srcR-1) && (destC == srcC+1 || destC == srcC-1))
于 2013-08-05T15:31:33.873 回答