2014-03-27 64 views
1
public boolean checkWin() { 
    if(states[0][0][0] == 1 && states[0][0][1] == 1 && states[0][0][2] ==1 && states[0][0][3] ==1) { // Checks 0th layer, 0th row 
     return true; 
    } 
    else if (states[0][1][0] == 1 && states[0][1][1] == 1 && states[0][1][2] ==1 && states[0][1][3] ==1) { // Checks 0th layer, 1st row 
     return true; 
    } 
    else if (states[0][2][0] == 1 && states[0][2][1] == 1 && states[0][2][2] ==1 && states[0][2][3] ==1) { // Checks 0th layer, 2nd row 
     return true; 
    } 
    else if (states[0][3][0] == 1 && states[0][3][1] == 1 && states[0][3][2] ==1 && states[0][3][3] ==1) { // Checks 0th layer, 3rd row 
     return true; 
    } 
} 

此代碼被硬編碼以檢查第0層和該層上的4行。我可以硬編碼其餘的,但當然這將是非常耗時和糟糕的代碼。當我試圖使它停止循環後三次點擊檢查四行四行,四行四行的遊戲中的行

public boolean checkWin() { 

    for (int i=0; i<=3; i++) { 
     if(states[0][0][i] == 1){ // Checks 0th layer, all rows 
      return true; 
     } 
    } 
    return false; 
} 

這是我試圖使循環,但它不工作。

+0

請澄清你的問題到底是什麼? – ProgrammerDan

+0

這應該是一個3D井字遊戲,4單位寬* 4單位高* 4單位深? – mttdbrd

+0

它是一個4x4x4的tic tac腳趾,當點擊令牌狀態變成1(對於玩家1)或2(對於玩家2)時,我需要編寫檢查棋盤的循環以查看玩家是否贏得了遊戲(填滿一行,一列等)。最上面的代碼工作,但它是硬編碼只檢查底層的4行。 – user3457171

回答

-1

您當前的代碼僅檢查第三維中的行。您應該檢查其他維:

for(int i = 0;i < 4;i++) { 
    for(int j = 0;j < 4;j++) { 
     if(
      (states[i][j][0] == 1 && states[i][j][1] == 1 && states[i][j][2] == 1 && states[i][j][3] == 1) || 
      (states[i][0][j] == 1 && states[i][1][j] == 1 && states[i][2][j] == 1 && states[i][3][j] == 1) || 
      (states[0][i][j] == 1 && states[1][i][j] == 1 && states[2][i][j] == 1 && states[3][i][j] == 1)) { 
      return true; 
     } 
    } 
} 

你可以把它比這更抽象的循環也是在過去的層面,但會要求布爾變量或折斷/ continue語句,所以我認爲這是關於如代碼將要獲得的那樣清晰。

+2

不要忘記,有4個主體對角線,還有24個對角線與立方體的一個維度正交。我認爲你沒有佔到這些。 –

-1

你需要重寫你循環,像這樣:

public boolean checkWin() { 

    for (int layer=0; layer<=3; layer++) { 
     for (int row=0; row<=3; row++) { 
      if(states[layer][row][0] == 1){ 
       return true; 
      } 
     } 
    } 
    return false; 
} 

僅適用於基於行勝此邏輯檢查。但是請注意,在TicTacToe中,您還需要檢查基於列的勝利和對角線勝利。

+2

如果行中的任何單個元素爲「1」,則它會過早地返回true,但它不會檢查以確保該行中的所有元素均爲「1」。 – ProgrammerDan

+0

好的。這比檢查行,列和對角線更復雜。如果跨層有一個獲勝場景會怎樣?或者更糟的是z軸上的對角線。 – msound

+0

正確,在4x4x4井字棋板上進行測試並不重要。 – ProgrammerDan

1

這個遊戲是數據驅動方法如何簡化我們的代碼的一個很好的例子。考慮:

  • 有64個單元,可以是空的或包含一個標記;令牌的數量取決於玩家的數量。這可以表示爲64個元素的一維數組。

  • 單元格在76行。這可以表示爲76個4行的數組,每個單元格包含第一個數組中的元素的下標。 (在C或C++中,你也可以存儲指針,在Java中你可以存儲引用)。

要檢查入選行,那麼你可以遍歷76行,並檢查是否在第一陣列的一行每一個細胞都有你分配到一個播放器或其他價值。

+0

是的,但如何? –

+0

這種類型的問題對於早期編程作業來說是完美的。因此,我認爲最好讓OP的工作微不足道。 – andy256