2013-03-17 2 views
5

私は現在、自分自身の行為の基本的な4つの作業に取り組んでいますが、その背後にある論理にはむしろ固執しています。 12はプレーヤーを表して4列論理で

現在、私は

[ 
    [0, 0, 0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0, 0, 0] 
] 

0ボードを表し、この多次元配列は、空きスロットに相当するであろうしています。 それでは、しばらくした後に、この配列を取得しましょう:

[ 
    [0, 0, 0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0, 0, 0], 
    [0, 0, 0, 1, 1, 0, 0], 
    [0, 0, 0, 1, 1, 0, 0], 
    [0, 0, 1, 2, 2, 2, 0], 
    [0, 1, 2, 2, 1, 2, 0] 
] 

どのように私は、行の4があるかどうかを確認するためのロジックを書くことができますか? 水平と垂直の値を計算するのは簡単ですが(まだ最良の方法を考えていますが)、対角線に対してどのようにしたらいいですか?

+3

あなたはそれを水平または垂直に行うのと同じように、両方の座標を増減しますただ1つの代わりに。 –

+0

@ H2CO3編集/タグ付けをさらに進めて、それを完全に言語にとらわれないようにすることもできました。私はそれについて考えていました。 – Till

+0

@Till Yeah、それも妥当です。 –

答えて

12

最善の策は、おそらく4つに探索空間を分割することである:垂直

  • 水平;
  • 右下。
  • 右上。

次に、方向に基づいて開始座標と終了座標を制限します。

たとえば、配列がboard[row=0-5][col=0-6]で、左上がboard[0][0]であるとします。

まず垂直(ループが両方この擬似コードで終了に含まれています):

for row = 0 to 2: 
    for col = 0 to 6: 
     if board[row][col] != 0 and 
      board[row][col] == board[row+1][col] and 
      board[row][col] == board[row+2][col] and 
      board[row][col] == board[row+3][col]: 
       return board[row][col] 

これはボードの縁からはみ出していないもの、問題のみに可能性を制限ほとんどのソリューションは、各セルをチェックしてそこからすべての方向に出ていくことで、単純に開始するときに発生します。それで、3行目、3行目、4行目、5行目、6行目(存在しない後者)という3行の開始行をチェックする点はありません。水平方向のための同様

、:

for row = 0 to 5: 
    for col = 0 to 3: 
     if board[row][col] != 0 and 
      board[row][col] == board[row][col+1] and 
      board[row][col] == board[row][col+2] and 
      board[row][col] == board[row][col+3]: 
       return board[row][col] 

権利については、下、右によっておよびフォローアップ:

for row = 0 to 2: 
    for col = 0 to 3: 
     if board[row][col] != 0 and 
      board[row][col] == board[row+1][col+1] and 
      board[row][col] == board[row+2][col+2] and 
      board[row][col] == board[row+3][col+3]: 
       return board[row][col] 

for row = 3 to 5: 
    for col = 0 to 3: 
     if board[row][col] != 0 and 
      board[row][col] == board[row-1][col+1] and 
      board[row][col] == board[row-2][col+2] and 
      board[row][col] == board[row-3][col+3]: 
       return board[row][col] 

さて、あなたが実際にfor col = 0 to 3外側のループを作ることによってこれら二つを組み合わせることができ2度ではなく1度だけ行うのですが、私は実際に分かりやすくするために、適切なコメントを付けて分けておきます。あなたはパフォーマンスにはまっている場合しかし、あなたは試すことができます:何の勝利は4つの可能な方向に見つからなかった場合

for col = 0 to 3: 
    for row = 0 to 2: 
     if board[row][col] != 0 and 
      board[row][col] == board[row+1][col+1] and 
      board[row][col] == board[row+2][col+2] and 
      board[row][col] == board[row+3][col+3]: 
       return board[row][col] 
    for row = 3 to 5: 
     if board[row][col] != 0 and 
      board[row][col] == board[row-1][col+1] and 
      board[row][col] == board[row-2][col+2] and 
      board[row][col] == board[row-3][col+3]: 
       return board[row][col] 

その後、単に勝者1または2の代わりに0を返します。

だから、例えば、あなたのサンプルボード:

row 
0 [0, 0, 0, 0, 0, 0, 0] 
1 [0, 0, 0, 0, 0, 0, 0] 
2 [0, 0, 0, 1, 1, 0, 0] 
3 [0, 0, 0, 1, 1, 0, 0] 
4 [0, 0, 1, 2, 2, 2, 0] 
5 > [0, 1, 2, 2, 1, 2, 0] 
     ^
     0 1 2 3 4 5 6 <- col 

は右内と{5,1}{4,2}{3,3}{2,4}が全て1に設定されているので、出発細胞が{5,1}たループアップ勝者を検出します。

+0

すごく面白かったです。 –

2

私は4回連続してゲームを開発しました。ここでは、行の条件で4つの勝利条件を確認するためのコードスニペットです:(これはC言語で)

int checkWinOrLose(int grid[][7],int result,int rowNum) { 
// For checking whether any win or lose condition is reached. Returns 1 if win or lose is reached. else returns 0 
// grid[][] is the 6X7 matrix 
// result is the column number where the last coin was placed 
// rowNum is the row number where the last coin was placed 

    int player=grid[rowNum][result]; 
    if(rowNum<=2 && grid[rowNum+1][result]==player && grid[rowNum+2][result]==player && grid[rowNum+3][result]==player) // 4 in a row vertically 
     return 1; 
    else { 
     int count=1,i,j; 
     for(i=result+1;i<7;i++) { // 4 in a row horizontally 
      if(grid[rowNum][i]!=player) 
       break; 
      count++; 
     } 
     for(i=result-1;i>=0;i--) { // 4 in a row horizontally 
      if(grid[rowNum][i]!=player) 
       break; 
      count++; 
     } 
     if(count>=4) 
      return 1; 
     count=1; 
     for(i=result+1,j=rowNum+1;i<7 && j<6;i++,j++) { // 4 in a row diagonally 
      if(grid[j][i]!=player) 
       break; 
      count++; 
     } 
     for(i=result-1,j=rowNum-1;i>=0 && j>=0;i--,j--) { // 4 in a row diagonally 
      if(grid[j][i]!=player) 
       break; 
      count++; 
     } 
     if(count>=4) 
      return 1; 
     count=1; 
     for(i=result+1,j=rowNum-1;i<7 && j>=0;i++,j--) { // 4 in a row diagonally 
      if(grid[j][i]!=player) 
       break; 
      count++; 
     } 
     for(i=result-1,j=rowNum+1;i>=0 && j<6;i--,j++) { // 4 in a row diagonally 
      if(grid[j][i]!=player) 
       break; 
      count++; 
     } 
     if(count>=4) 
      return 1; 
    } 
    return 0; 
}