2017-11-19 6 views
1

私の割り当ては、基本的にゲームConnect-4ですが、ユーザーが行と列の数を指定するConnect-N用のプログラムを書くことです(doesn ' tは正方形でなければなりません)、連続するピースの数を指定します(これはボードに収まる必要はありません)。たとえば、ユーザーが3x3ボードを指定した場合、勝つために4つの連続した部分が必要であると言うこともできます。cで行のn連続した同じ文字を確認する方法

私は、ゲームが完全に水平にゲームに勝つ行勝利をチェックするプログラムを書くのに問題があります。ここで私がこれまで持っているものです。

bool horizontalWin(char **board, const int numRows, 
const int numCols, const char blankSpace, const int numToWin) { 
    if((numCols - numToWin) < 0) { 
     return false; 
    } 
    else { 
    for (int row = 0; row < numRows; ++row) { 
     for (int col = 0; col <= numCols-numToWin; ++col) { 
     ///This is where I need help 
     } 
    } 
    } 
return false; 
} 

ただ、参考のために:変数blankSpaceは「*」で、ボード上の空白を示すために使用されます。

私の考えでは、彼らがすべて同じ文字だったかどうかを確認するために十分前方を確認した後、列0で開始し、ループの入れ子のを持っていることでしたが、私はこれを実現する方法を見つけ出すように見えることはできません。誰かが私を正しい方向に向けることができますか?

+0

となり、ユーザは3x3のボードを指定した場合、彼らがすることもできます勝つためには4連勝が必要だ」と語った。 ???3つの連続した作品を意味しましたか? – chux

+0

'board [0] [0]'で始まり、N個の同じ色の部分については、右上、右上、上、右下になります。次に、 'board [1] [0]'、 'board [2] [0]'、、... 'board [numCols-1] [0]'、次に 'numRows-1'行までの次の行。 – chux

+0

'if((numCols - numToWin)<0)'は 'if(numCols

答えて

1

は、一致の数をカウントし、または一致しないとき、カウントをリセットします。

board[row][col]と仮定すると、あなたがチェックした色は、あなたが(あなたは、このことが読みやすいと感じた場合)行を保存するためにif (++match >= numToWin) return true;を行うことができuser1

for (int row = 0; row < numRows; ++row) { 
    int match = 0; 
    for (int col = 0; col <= numCols-numToWin; ++col) { 
     if (board[row][col] != user1) match = 0; 
     else { 
      match++; 
      if (match >= numToWin) return true; 
     } 
    } 
} 

注意であること。

これは問題の説明ではありませんが、2人のプレイヤーがいる場合は、blankSpace,user1user2の3色が必要です。上のプログラムは、user1が勝ったかどうかをチェックします。

ですから、あなたが勝利(colorCheck言う)のためにテストされている色伝えるために関数に引数を追加することができ、全体の機能は、「

bool horizontalWin(char **board, const int numRows, 
const int numCols, const char blankSpace, const int numToWin, const in colorCheck) { 
    if((numCols - numToWin) < 0) { 
     return false; 
    } 
    else { 
    for (int row = 0; row < numRows; ++row) { 
     for (int col = 0; col <= numCols-numToWin; ++col) { 
      if (board[row][col] != colorCheck) match = 0; 
      else { 
       match++; 
       if (match >= numToWin) return true; 
      } 
     } 
    } 
    } 
    return false; 
} 
0

赤いディスク用と黄色用の2つのカウンターを設定できます。 rに赤いディスクカウンタを1だけインクリメントすると、ネストされたループの本体の内部で黄色のディスクにも同じことが起こります。これらのカウンタのいずれかがゲームに勝つために必要な特定のNに等しい場合

その後、各行の繰り返しの後に確認することができます。

あなたはそれをあなたがyrと黄色のディスクと赤のディスクを表し想定この方法を行うことができます。

else 
{ 
    int red_c, yellow_c; 
    for (int row = 0; row < numRows; ++row) 
    { 
      red_c=0; yellow_c=0; 
      for (int col = 0; col < numCols; ++col) 
      { 
       if(board[r][c]=='r') red_c++; 
       else if (board[r][c]=='y') yellow_c++; 

       if(red_c == numToWin) 
       { 
        //Red wins 
       } 

       else if(yellow_c == numToWin) 
       { 
        //Yellow wins 
       } 
      } 
    } 
} 
0

誰かがのボードに勝つかどうかを知りたい場合は、コードが異なりますあなたが特定の動きの後に勝つならば。

これにより、各移動後か、ボード内のすべてのポジションのために実行することができ、一般的で簡単なコードです:

アイデアは、中心(曲の新しい位置)からあらゆる方向に移動することです作り(スター文字のような)スター「*」のようなもの

consecutivesInHorizontal =0 
consecutivesInVertical = 0 
consecutivesDiagLeft =0 
consecutiveDiagRight = 0 

for i =1 ; i < height && i<width && i<= 4 ; i++ 
if(board[centerX][centerY+i] == myPieceColor) 
    consecutivesInVertical++; 
if(board[centerX][centerY-i] == myPieceColor) 
    consecutivesInVertical++; 

if(board[centerX+i][centerY] == myPieceColor) 
    consecutivesInHorizontal++; 
if(board[centerX-i][centerY] == myPieceColor) 
    consecutivesInHorizontal++; 

if(board[centerX+i][centerY-i] == myPieceColor) 
    consecutivesDiagLeft++; 
if(board[centerX-i][centerY+i] == myPieceColor) 
    consecutivesDiagLeft++; 

if(board[centerX-i][centerY+i] == myPieceColor) 
    consecutiveDiagRight++; 
if(board[centerX+i][centerY-i] == myPieceColor) 
    consecutiveDiagRight 

if any of the consecutive variables == 4 
    return true 
関連する問題