我正在为一项作业制作一个Checkers游戏。除了一件奇怪的事情之外,整个过程都是应该的。这是我的董事会:
我通过给出源行和列,然后是目标行和列来移动。
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),那么它正在移动该部分,而不是给我错误信息。
我被困住了!任何想法为什么会这样?如果需要,我可以发布更多代码。
答案 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)
你的逻辑表达是错误的。
如果有疑问,请始终使用括号:
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))