2011-01-08 63 views
3

我有一個5x10數組,填充隨機值1-5。我希望能夠檢查3個數字(水平或垂直)是否匹配。如果不寫一大堆if語句,我無法想出辦法做到這一點。贏得連接4類遊戲的贏條件

下面是隨機填充陣列

 

int i; 
int rowincrement = 10; 
int row = 0; 
int col = 5; 
int board[10][5]; 
int randomnum = 5; 


int main(int argc, char * argv[]) 
{ 
    srand(time(NULL)); 

    cout << "============\n"; 

    while(row < rowincrement) 
    { 

     for(i = 0; i < 5; i++) 
     { 
      board[row][col] = rand()%5 + 1; 
      cout << board[row][col] << " "; 
     } 
     cout << endl; 
     cout << "============\n"; 
     row++; 
    } 
    cout << endl; 
    return 0; 
} 
 
+1

這功課嗎?你有什麼嘗試? – marcog 2011-01-08 22:43:50

+0

它不是家庭作業,但基本上我有超過50如果陳述如果行[0] ==行[1] &&行[2],然後...但我仍然沒有所有的組合,我知道必須是更好的方法。 – FrozenWasteland 2011-01-08 22:47:29

回答

9

假設你有一些特定的起點(x,y),並且你很好奇這一行中是否有三個相同的數字開始。讓我們考慮一下你在水平方向上看的情況。然後有辦法做到這一點(忽略邊界檢查)會是這樣的:

bool IsHorizontalMatch(int x, int y) { 
    /* Get the value of the start position. */ 
    const int startValue = board[x][y]; 

    /* Confirm the two values after it match. */ 
    for (int i = 1; i < 3; ++i) 
     if (board[x + i][y] != startValue) 
      return false; 

    /* If we got here, then they all match! */ 
    return true; 
} 

你可以同樣寫這樣的功能對於垂直檢查:

bool IsVerticalMatch(int x, int y) { 
    /* Get the value of the start position. */ 
    const int startValue = board[x][y]; 

    /* Confirm the two values after it match. */ 
    for (int i = 1; i < 3; ++i) 
     if (board[x][y + i] != startValue) 
      return false; 

    /* If we got here, then they all match! */ 
    return true; 
} 

最後,一個對角線:

bool IsDiagonalDownMatch(int x, int y) { 
    /* Get the value of the start position. */ 
    const int startValue = board[x][y]; 

    /* Confirm the two values after it match. */ 
    for (int i = 1; i < 3; ++i) 
     if (board[x + i][y + i] != startValue) 
      return false; 

    /* If we got here, then they all match! */ 
    return true; 
} 

bool IsDiagonalUpMatch(int x, int y) { 
    /* Get the value of the start position. */ 
    const int startValue = board[x][y]; 

    /* Confirm the two values after it match. */ 
    for (int i = 1; i < 3; ++i) 
     if (board[x + i][y - i] != startValue) 
      return false; 

    /* If we got here, then they all match! */ 
    return true; 
} 

這個工程,但它不是很優雅;所有這三個功能看起來都非常相似!幸運的是,你可以用一個單一的統一函數來重寫它們。這個想法是這樣的 - 如果你會注意到,所有這三個函數的工作都是通過定義一些「步長」來指示你移動的方向。在水平情況下,步驟爲(+1,+0),在垂直情況下爲(+0,+1),在對角線中爲(+1,+1)或(+1,-1)。鑑於此,您可以編寫一個函數來檢查,如果三個值中的線匹配:

bool IsLinearMatch(int x, int y, int stepX, int stepY) { 
    /* Get the value of the start position. */ 
    const int startValue = board[x][y]; 

    /* Confirm the two values after it match. */ 
    for (int i = 1; i < 3; ++i) 
     if (board[x + i * stepX][y + i * stepY] != startValue) 
      return false; 

    /* If we got here, then they all match! */ 
    return true; 
} 

然後,您可以編寫

bool IsLineStartingAt(int x, int y) { 
    return IsLinearMatch(x, y, 1, 0) || // Horizontal 
      IsLinearMatch(x, y, 0, 1) || // Vertical 
      IsLinearMatch(x, y, 1, 1) || // Diagonal Down 
      IsLinearMatch(x, y, 1, -1) || // Diagonal Up 
} 

鑑於這種原始的,你可以只遍歷檢查所有可能的匹配在所有可能的起點上。

希望這會有所幫助!

編輯:感謝評論者幫助解決我的愚蠢的錯誤。 :-)

0

備案代碼:我想你的意思

for(i = 0; i < 5; i++) 
{ 
    board[row][i] = rand()%5 + 1; 
    cout << board[row][i] << " "; 
} 

而且因爲別人張貼代碼

,這裏是我會怎樣做到這一點:

for(int i = 0 ; i < 8 ; i++) 
{ 
    for(int j = 0 ; j < 3 ; j++) 
    { 

     if(((board[i][j] == board[i][j+1]) && (board[i][j+1] == board[i][j+2]))) 
      std::cout << "Found a horizontal match on " << i << " " << j << std::endl; 

     if((board[i][j] == board[i+1][j]) && (board[i+1][j] == board[i+2][j])) 
      std::cout << "Found a vertical match on " << i << " " << j << std::endl; 
    } 
} 
0

我認爲這應該工作;如果有人指出這個錯誤,我會很樂意糾正。

for(int row = 0; row<8 ; ++row) 
{ 
    bool outerLoopBreakFlag = false ; 
    for(int col=0 ; col<3; ++col) 
    { 
     // check for the winning conditions 
     // i.e., board[row][col] == board[row][col+1] == board[row][col+2] 
     //  board[row][col] == board[row+1][col] == board[row+2][col] 
     //  if any one is satisfied, set the outerLoopBreakFlag to true 
     else 
      break ; 
    } 
    if(outerLoopBreakFlag == true) 
     break ; 
}