1

C++ でコネクト 4 ゲームを作成しています。私は人間対 AI の対戦相手になるようにゲームを作成しているので、勝利パラメータについては、人間が勝ったか AI が勝ったかをチェックします。これまでのところ、行にある勝利と列にある行に対してこれを行うことができました。私が問題を抱えているのは、斜めに4つ並んでいるのを検出することだけです。

編集: 私のボードは 7x6 グリッドです

行をチェックするために私が持っているものは次のとおりです。

for (int i = 0; i < board.size(); ++i)
    {
        if ((board[i][0] == PLAYER_TOKEN && board[i][1] == PLAYER_TOKEN && board[i][2] == PLAYER_TOKEN && board[i][3] == PLAYER_TOKEN) ||
            (board[i][1] == PLAYER_TOKEN && board[i][2] == PLAYER_TOKEN && board[i][3] == PLAYER_TOKEN && board[i][4] == PLAYER_TOKEN) ||
            (board[i][2] == PLAYER_TOKEN && board[i][3] == PLAYER_TOKEN && board[i][4] == PLAYER_TOKEN && board[i][5] == PLAYER_TOKEN) ||
            (board[i][3] == PLAYER_TOKEN && board[i][4] == PLAYER_TOKEN && board[i][5] == PLAYER_TOKEN && board[i][6] == PLAYER_TOKEN))
        {
            gameover = true;
            human.setWins(human.getWins()+1);
            cout<<"Congratulations You have Won"<<endl;
            system("PAUSE");
        }
    }

そして列の場合、私はこれを持っています:

for (int j = 0; j < board[0].size(); ++j)
{
    if ((board[0][j] == PLAYER_TOKEN && board[1][j] == PLAYER_TOKEN && board[2][j] == PLAYER_TOKEN && board[3][j] == PLAYER_TOKEN) ||
        (board[1][j] == PLAYER_TOKEN && board[2][j] == PLAYER_TOKEN && board[3][j] == PLAYER_TOKEN && board[4][j] == PLAYER_TOKEN) ||
        (board[2][j] == PLAYER_TOKEN && board[3][j] == PLAYER_TOKEN && board[4][j] == PLAYER_TOKEN && board[5][j] == PLAYER_TOKEN))
    {
        gameover = true;
        human.setWins(human.getWins()+1);
        cout<<"Congratulations You have Won"<<endl;
        system("PAUSE");
    }
}

私は斜めの勝利のためにこれを行うための同様の方法を取得しようとしていますが、うまくいくものを思い付くことができません. 私がたどり着いたのはこれだけで、率直に言って、何の役にも立ちません!

//for (int rows = 0; rows<4; ++rows){
//  for (int columns = 0; columns<3; ++columns){
//      if ((board[rows][columns]     == PLAYER_TOKEN && board[rows+1][columns+1]   == PLAYER_TOKEN && board[rows+2][columns+2]     == PLAYER_TOKEN && board[rows+3][columns+3] == PLAYER_TOKEN) || 
//      (board[rows+1][columns+1] == PLAYER_TOKEN && board[rows+2][columns+2] == PLAYER_TOKEN && board[rows+3][columns+3] == PLAYER_TOKEN && board[rows+1][columns+4] == PLAYER_TOKEN) || 
//      (board[rows+2][columns+2] == PLAYER_TOKEN && board[rows+3][columns+3] == PLAYER_TOKEN && board[rows+4][columns+4] == PLAYER_TOKEN && board[rows+5][columns+5] == PLAYER_TOKEN))
//      {
//          gameover = true;
//          human.setWins(human.getWins()+1);
//          cout<<"Congratulations you have Won"<<endl;
//          system("PAUSE");
//      }
//  }
//}

誰でもこれを手伝ってもらえますか?

前もって感謝します。

4

1 に答える 1

1

各セルを個別に処理し、このセルから始まる勝者の対角線があるかどうかを確認する必要があります。ここに再帰的な解決策があります

bool isWinnerRight(int row, int column, int count) {
  if (row < rows && column < columns && board[row][column] == PLAYERTOKEN) {
    if (count == 4) {
      return true;
    } else {
      return isWinnerRight(row+1.column+1, count+1);
    }
  } else return false;
}

bool isWinnerLeft(int row, int column, int count) {
  if (row < rows && column >= 0 && board[row][column] == PLAYERTOKEN) {
    if (count == 4) {
      return true;
    } else {
      return isWinnerRight(row+1.column-1, count+1);
    }
  } else return false;
}

int main() {
   //do the initialization here
   for (int i = 0; i < rows, i++) {
     for (int j = 0; j < columns; j++) {
       if (isWinnerRight(i,j,0)){/*WINNER FOUND*/}
       if (isWinnerLeft(i,columns-j,0)){/*WINNER FOUND*/}
     }
   }
}

isWinnerLeft() は isWinnerRight に似ていますが、再帰呼び出しの場合を除きます。

于 2013-03-06T16:21:45.120 に答える