2011-01-08 4 views
3

私はランダムな値1から5で入力された5x10の配列を持っています。私は、3つの数字が水平または垂直に一致するときにチェックできるようにしたい。 if文を大量に書くことなくこれを行う方法を理解できません。私はあなたが接続4のようなゲームの勝利条件

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

を意味すると他の人がコードを掲載以来、どのように私は希望、ここだと思う

:ここ

はランダム人口配列レコードの

 

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

+0

宿題ではありませんが、基本的には、50行以上のif文でrow [0] == row [1] && row [2]と言っていますが、まだすべての組み合わせがありません。より良い方法です。 – FrozenWasteland

答えて

9

いくつかの特定の開始点(x、y)があり、この時点で開始する行に3つの等しい番号がある場合は、好奇心が強いとします。あなたが水平方向を見ている場合だけを考えてみましょう。そして、この(無視境界チェック)を行うための一つの方法は、次のようになります:

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; 
} 

そして対角線のための最後に、1 :

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; 
} 

これは機能しますが、それほどエレガントではありません。これら3つの機能はすべて非常によく似ています!幸いにも、あなたは単一の統合機能の点でそれらすべてを書き換えることができます。アイデアはこれです。あなたが気付くなら、3つの機能はすべて、どの方向に移動するかを示す「ステップサイズ」を定義することで機能します。水平の場合、ステップは(+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 
} 

を書き込むことができます。これを考えると、次の3つの値が行に一致するかどうかを確認するために、1つの関数を書くことができますすべての可能な出発点を超えて。

希望すると便利です。

編集:私の愚かなバグを修正するのを手伝ってくれたコメント者のおかげです。 :-)

+0

番号がランダムに生成された場合の開始位置はどのようにわかりますか? – FrozenWasteland

+0

考え方は、これをすべての開始位置を試してループに入れることです。この関数がtrueを返すときは、開始位置があり、ループを停止できることがわかります。数字がランダムであるという事実は、ここで大きな違いはありません。 – templatetypedef

+1

1つの対角線がありません: -/ –

0

のコードですする:

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 ; 
}    
関連する問題