2015-09-30 45 views
0

我從頭開始創建一個連接四個程序的良好實踐,我遇到了checkAlignment()方法的問題,或者什麼是勝利條件。它適用於一些行,但不是全部,它不適用於任何其他方向(垂直,對角向前,對角向後)。Connect中的Java程序問題

public char checkAlignment(int row, int column) { 
char color = board[row][column]; 
char[][] current = getBoard(); 

// Horizontal Left-to-Right Check - - - - - - - - - - 
if (column + 4 <= columns) { 
    for (int i = 1; i < 4; i++) { 
     if (current[row][column + i] != color) { 
      return NONE; 
     } 
    } 
    return color; 
} 

// Horizontal Right-To-Left Check - - - - - - - - 
if (column - 4 > -1) { 
    for (int i = 1; i < 4; i++) { 
     if (current[row][column - i] != color) { 
      return NONE; 
     } 
    } 
    return color; 
} 

// Vertical Top-To-Bottom Check - - - - - - - 
if (row + 4 <= rows) { 
    for (int i = 1; i < 4; i++) { 
     if (current[row + i][column] != color) { 
      return NONE; 
     } 
    } 
    return color; 
} 

// Vertical Bottom-To-Top Check - - - - - - - - 
if (row - 4 > -1) { 
    for (int i = 1; i < 4; i++) { 
     if (current[row - i][column] != color) { 
      return NONE; 
     } 
    } 
    return color; 
} 

// Main Diagonal Backwards Check - - - - - - - - - - 
if (column - 4 > -1 && row - 4 > -1) { 
    for (int i = 1; i < 4; i++) { 
     for (int j = 1; j < 4; j++) { 
      if (current[row - i][column - j] != color) { 
       return NONE; 
      } 
     } 
    } 
    return color; 
} 

// Main Diagonal Forwards Check - - - - - - - - - - 
if (column + 4 <= columns && row + 4 <= rows) { 
    for (int i = 1; i < 4; i++) { 
     for (int j = 1; j < 4; j++) { 
      if (current[row + i][column + j] != color) { 
       return NONE; 
      } 
     } 
    } 
    return color; 
} 

// Secondary Diagonal Backwards Check - - - - - - - - - 
if (column - 4 > -1 && row + 4 <= rows) { 
    for (int i = 1; i < 4; i++) { 
     for (int j = 1; j < 4; j++) { 
      if (current[row + i][column - j] != color) { 
       return NONE; 
      } 
     } 
    } 
    return color; 
} 
// Secondary Diagonal Forwards Check - - - - - - - - - - 
if (column + 4 <= columns && row - 4 > -1) { 
    for (int i = 1; i < 4; i++) { 
     for (int j = 1; j < 4; j++) { 
      if (current[row - i][column + j] != color) { 
       return NONE; 
      } 
     } 
    } 
    return color; 
} 
return NONE; 

}

任何人都可以幫我嗎?

編輯/調整後:

public char checkAlignment(int row, int column) { 
    char color = board[row][column]; 
    char[][] current = getBoard(); 

    // Horizontal Left-to-Right Check 
    if (column + 4 <= NUM_COLS) { 
     for (int i = 0; i < 4; i++) { 
      if (current[row][column + i] != color) { 
       return NONE; 
      } 
     } 
     return color; 
    } 

    // Horizontal Right-To-Left Check 
    if (column - 4 > -1) { 
     for (int i = 0; i < 4; i++) { 
      if (current[row][column - i] != color) { 
       return NONE; 
      } 
     } 
     return color; 
    } 

    // Vertical Top-To-Bottom Check 
    if (row + 4 <= NUM_ROWS) { 
     for (int i = 0; i < 4; i++) { 
      if (current[row + i][column] != color) { 
       return NONE; 
      } 
     } 
     return color; 
    } 

    // Vertical Bottom-To-Top Check 
    if (row - 4 > -1) { 
     for (int i = 0; i < 4; i++) { 
      if (current[row - i][column] != color) { 
       return NONE; 
      } 
     } 
     return color; 
    } 

    // Main Diagonal Backwards Check 
    if (column - 4 > -1 && row - 4 > -1) { 
     for (int i = 0; i < 4; i++) { 
      for (int j = 0; j < 4; j++) { 
       if (current[row - i][column - j] != color) { 
        return NONE; 
       } 
      } 
     } 
     return color; 
    } 

    // Main Diagonal Forwards Check - - - - - - - - - - 
    if (column + 4 <= NUM_COLS && row + 4 <= NUM_ROWS) { 
     for (int i = 0; i < 4; i++) { 
      for (int j = 0; j < 4; j++) { 
       if (current[row + i][column + j] != color) { 
        return NONE; 
       } 
      } 
     } 
     return color; 
    } 

    // Secondary Diagonal Backwards Check - - - - - - - - - 
    if (column - 4 > -1 && row + 4 <= NUM_ROWS) { 
     for (int i = 0; i < 4; i++) { 
      for (int j = 0; j < 4; j++) { 
       if (current[row + i][column - j] != color) { 
        return NONE; 
       } 
      } 
     } 
     return color; 
    } 
    // Secondary Diagonal Forwards Check - - - - - - - - - - 
    if (column + 4 <= NUM_COLS && row - 4 > -1) { 
     for (int i = 0; i < 4; i++) { 
      for (int j = 0; j < 4; j++) { 
       if (current[row - i][column + j] != color) { 
        return NONE; 
       } 
      } 
     } 
     return color; 
    } 
    return NONE; 
} 

回答

1

通過它的外觀你的循環中的每一個使用i=1然後再去高達4,運行的每個四倍。但是,您的行和列總是與current之間的+/- 4相隔。如果我正確閱讀這些內容,則在某些情況下,您正在檢查一個以上的內容。所以或者讓i = 0或者上升到3(因爲你已經用當前的方法檢查了你自己的方形)。

編輯:我給這個第二次看

上面我的第一個聲明是不是一個真正的問題。我認爲真正的問題在於,對於每件商品,您只能從遠離「當前」商品的單一方向檢查4件商品。這並不總是如以下示例所示,其中'y'是放入網格的最後一塊。

x x y x 

所以在這種情況下,你可以嘗試下面的代碼,檢查'當前'選擇的令牌的左側和右側的總數。如果在兩個方向上有4個或更多togeather其連接-4:

//Horizantal check 
//Right side 
int connected = 0; 
int i = 1; 
while (column + i <= columns) { 
    if (current[row + i][column] != color) { 
     break; 
    }else{ 
     connected++; 
    } 
    i++; 
} 
i = 1; 
//left side 
while (column - i <= columns) { 
    if (current[row - i][column] != color) { 
     break; 
    }else{ 
     connected++; 
    } 
    i++; 
} 
if(connected >= 4){//total connected 
    return color; 
}else{ 
    return NONE; 
} 

在審查您的垂直普通檢查看起來不錯。回想一下,在connect-4中,您將令牌放下網格,因此您永遠不能將新令牌放入其上有另一個令牌的槽中(在回合中,您將其丟棄),這意味着無需向上進行垂直檢查。

//Vertical plain check - The one dropped must always be on top 
if (row - 4 > -1) { 
    for(int i=1; i<4;i++){ 
     if (current[row - i][column] != color) { 
      return NONE; 
     } 
    } 
    return color; 
} 

希望這有助於讓這兩個方向正確。對於對角線,你需要做一些類似於水平平原的事情。

+1

我會試一試。我是否也會將「j = 1」更改爲「j = 0」? –

+0

是的,你也需要。 – Chris

+0

我已經添加了調整/編輯版本。它看起來如何? –