[英]If statements not working as intended
基本上,我目前正在嘗試為Android開發一款黑白棋游戲,而我的if語句讓我有些頭疼,看來如果條件適合多個以上,它只會通過其中一條語句的動作而已另一個。 我的代碼如下:
if (check[position] == 0
&& (check[position - 8] == 2
|| check[position + 8] == 2
|| check[position + 1] == 2
|| check[position - 1] == 2
|| check[position - 9] == 2
|| check[position + 9] == 2
|| check[position - 7] == 2 || check[position + 7] == 2)) {
if (check[position + 8] == 2) {
for (int i = position; i < 56; i += 8) {
if (check[i] == 1) {
for (int j = position; j < i; j += 8) {
check[j] = 1;
}
playerno = 2;
break;
} else
break;
}
} else if (check[position - 8] == 2) {
for (int i = position; i > 8; i -= 8) {
if (check[i] == 1) {
for (int j = position; j > i; j -= 8) {
check[j] = 1;
}
playerno = 2;
break;
} else
break;
}
} else if (check[position + 1] == 2) {
for (int i = position; i < board.length; i++) {
if (check[i] == 1) {
for (int j = position; j < i; j++) {
check[j] = 1;
}
playerno = 2;
break;
}
if (i == 7 || i == 15 || i == 23 || i == 31
|| i == 39 || i == 47 || i == 55
|| i == 63) {
break;
}
}
} else if (check[position - 1] == 2) {
for (int i = position; i > 0; i--) {
if (check[i] == 1) {
for (int j = position; j > i; j--) {
check[j] = 1;
}
playerno = 2;
break;
}
if (i == 0 || i == 8 || i == 16 || i == 24
|| i == 32 || i == 40 || i == 48
|| i == 56) {
break;
}
}
}
Check只是一個int數組,用於說明哪個玩家在棋盤上握有該特定棋子。現在由於某種原因,如果我的職位滿足上述兩個條件,那么它只會通過一個if語句,而且經常會產生這種情況將其視為無效舉動,我想知道如何解決該問題?
如果我的職位滿足以下兩個條件,則僅通過if語句之一
您是在說這句話嗎?
if (conditionA) {
BlockA
} else if (conditionB) {
BlockB
} else if (conditionC) {
BlockC
} else if (conditionD) {
BlockD
}
如果這樣做,也就不足為奇了,如果執行了if塊之一。 僅執行第一個條件評估為true
的塊。
如果要允許執行多個塊,請將其更改為:
if (conditionA) {
BlockA
}
if (conditionB) {
BlockB
}
if (conditionC) {
BlockC
}
if (conditionD) {
BlockD
}
首先,您的條件極其復雜且難以閱讀。 嘗試簡化它們。 嘗試將一個復雜的條件分為幾個簡單的表達式。 並使用調試器。
AlexR是正確的,您的邏輯過於復雜,而且格式設置使您的代碼極難閱讀,因此難以調試。
我不會為您解決整個問題,但是這里有一些建議的更改。 通常,您應該將邏輯分解為一口大小的塊。
編輯:根據我上面的評論,將董事會作為一個類實施:
class Board {
private final int[] check = new int[BOARD_WIDTH*BOARD_HEIGHT];
public Board() { for (int i=0; i < BOARD_WIDTH*BOARD_HEIGHT; check[i++] = 0); }
public final int get(int x, int y) { return check[y*BOARD_WIDTH + x]; }
public final void set(int x, int y, int val) { check[y*BOARD_WIDTH+x] = val; }
/**
* Return true if this square is free
*/
public final boolean isFree(int x, int y) {
if (x < 0 || x >= BOARD_WIDTH || y < 0 || y >= BOARD_HEIGHT) return false;
int position = y*BOARD_WIDTH + x;
return check[position] == 0;
}
/**
* Return true if this square is occupied by opponent
*/
public final boolean isOccupiedBy2(int x, int y) {
if (x < 0 || x >= BOARD_WIDTH || y < 0 || y >= BOARD_HEIGHT) return false;
int position = y*BOARD_WIDTH + x;
return check[position] == 2;
}
/**
* Return true if any neighboring square is occupied by opponent
*/
final boolean isNeighborOccupied(int x, int y) {
for (int i=x-1; i >= x+1; ++i)
for (int j=y-1; j >= y+1; ++j)
if ((i != x || j != y) && isOccupiedBy2(i,j)) return true;
return false;
}
// etc.
}
現在,從那里,重新編寫上面的邏輯:
if (board.isFree(x,y) && board.isNeighborOccupied(x,y)) {
if (board.isOccupiedBy2(x,y+1)) {
...
}
else if (board.isOccupiedBy2(x,y-1)) {
...
}
else if (board.isOccupiedBy2(x+1,y)) {
...
}
else if (board.isOccupiedBy2(x-1,y)) {
...
}
}
看到這讀起來容易多了嗎? 調試也將變得更加容易。
最后,看看Eran的帖子是否不能解決您的錯誤。 這四個條件中只有一個將被執行。 由於您僅測試八個鄰居正方形中的四個,所以我猜您打算向上,向左,向下,向右進行測試,因此第二個“ else”可能是一個錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.