2013-08-05 76 views
8

我正在爲一個任務做一個跳棋遊戲。整個事情正在按照它應該的方式運行,除了一件奇怪的事情。這裏是我的板:跳棋遊戲:錯誤檢查是否正確?

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)它的移動的一塊,而不是讓我的錯誤消息。

我被卡住了!任何想法,爲什麼這可能會發生?如果需要,我可以發佈更多代碼。

+0

難道有效的動作取決於哪種顏色在移動? – arshajii

+1

@ErikPragt永遠不會驗證,因爲destR不能同時等於srcR +/- 1。 – Deactivator2

+0

desrR不能是== srcR + 1 && srcR-1 –

回答

7

按照你的邏輯,如果

destC == srcC-1 

爲真,則整個表達式爲真。您必須注意Java在必要時評估布爾操作〜Add()的順序〜

+0

你是對的!另一組括號固定它。謝謝! – alundy

+0

謝謝編輯@arshajii –

5

這很簡單,我想。只有四個允許的移動。

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

當然,這種檢查允許向後移動。但是,向後移動的方向取決於演奏的顏色,並且通過到達另一端來促進該片段。

+2

+1從'dx'和'dy'的角度考慮它會更清晰。 – arshajii

2

您的邏輯表達式是錯誤的。

看看Java operators precedence

如有疑問請始終使用括號:

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

糟糕!我應該注意到。附加的括號固定它。謝謝! – alundy

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)和(destC = SRCC +/- 1),此舉是有效的。

原來的方式會出現一些的時候,因爲Java布爾比較兩個表達式,或者前一個表達式的結果和下一個表達式的結果。

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)的評價是true

解決您的問題,您需要更改if聲明:

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

看起來不錯。您只是忘記在複合if語句周圍添加右括號。所以,它不應該返回。