2

ゲームが終了したのか、引き分けなのか、まだプレイできるのかを知りたい. しかし、動的コードでそれを行いたいです。

たとえば、次のように 3*3 tictactoe ゲームに対して静的に実行します。

private static boolean check_game_state(char[] board)
{
    if (    (board[0]==cSymbol && board[1]==cSymbol && board[2]==cSymbol) 
         || (board[3]==cSymbol && board[4]==cSymbol && board[5]==cSymbol) 
         || (board[6]==cSymbol && board[7]==cSymbol && board[8]==cSymbol)
         || (board[0]==cSymbol && board[3]==cSymbol && board[6]==(cSymbol))
         || (board[1]==(cSymbol) && board[4]==(cSymbol) && board[7]==(cSymbol))
         || (board[2]==(cSymbol) && board[5]==(cSymbol) && board[8]==(cSymbol))
         || (board[0]==(cSymbol) && board[4]==(cSymbol) && board[8]==(cSymbol))
         || (board[2]==(cSymbol) && board[4]==(cSymbol) && board[6]==(cSymbol)))
    {
        if (cSymbol == 'X')
        {
            state = 5;  //player 1 win
        }
        else if (cSymbol == 'O')
        {
            state = 4; player 2 win
        } 
    }
}

4*4 または 5*5 以上のボードで動的に実行したい。しかし、どうすればそれができますか?出来ますか?

4

3 に答える 3

1

インデックスをハードコーディングする代わりに、ループ内の要素にアクセスする必要があります。たとえば、代わりに

boolean test = (board[0]==cSymbol && board[1]==cSymbol && board[2]==cSymbol);

あなたは次のようなことをします

boolean test = true;
for (int i = 0; i < length; ++i) {
  test = test && board[i] == cSymbol ;
}

lengthボードのサイズ (例: 5、6) でboard.length 、配列の長さからこれを計算するか、配列自体と共に関数に渡す必要があります。

これはtest、すべての要素が に等しい場合にのみ trueに設定されcSymbol、そうでない場合に設定されますfalse

更新: 行の計算を行います。これを列(ヒント: calculate index i+j*length)、メインダイアロン(index: i*length+i)、およびサブダイアゴナル(index: )に適用する必要がありますi*length+(length-1-i)。インデックスはth 行 th 列にi*length + j変換されます。ij

private static boolean check_game_state(char[] board, int length) 
{ 
  bool row = false;
  for (int i = 0; i < length; ++i) {
    bool innerRow = true;
    for (int j = 0; j < length; ++j) { // calculate the ith row
      innerRow = innerRow && board[i*length+j] == cSymbol;
    }
    row = row || innerRow;
  }
  if (row) 
  { 
    // somebody won...
  } 
} 
于 2012-04-30T17:58:52.413 に答える
1

その場合、チェック条件をハードコーディングすることはできません。3別のケースが必要になります。

  1. 行を確認するには
  2. 列を確認するには
  3. 対角線をチェックするには

(ゲームのサイズ)0から実行されるすべてのケースで単純なループを使用できます。N塗りつぶされている現在のセルを追跡します。だと言うx,y。この座標を使用して、特定rowの とを確認しcolumnます。そして、x == yそれが前方対角線上にある場合は、それを確認します. 同様に、逆対角線を確認します。

于 2012-04-30T17:59:13.473 に答える
0

ハードコーディングしたくない場合は、勝利位置などを検索するアルゴリズムを実装する必要があります。 http://www.codeproject.com/Articles/43622/Solve-Tic-Tac-Toe-with-たとえば、MiniMax アルゴリズム

于 2012-04-30T18:13:27.290 に答える