2012-04-30 10 views
2

私は、ゲームが終了したか描画されたのか、それともまだ再生可能かを理解したいと思います。しかし、私は動的なコードでそれをやりたいtictactoeゲームでcheck_game_stateメソッドを実行する方法は?

私はそれがこのような3 * 3三目並べゲームのための静的なん例えば

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以上ボードのために動的にしたいです。しかし、どうやってそれをすることができますか?出来ますか?

+2

この宿題ですか? – Jivings

+0

アンドロイドの中期プロジェクトのちょっとした作品:)私はminimax alg –

答えて

1

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

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

のあなたはlengthは、基板の大きさである

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

のようなものだろう(例えば5、6)の平方根と同じboard.lengthあなたはからこれを計算するのいずれかの必要があります配列の長さを渡すか、配列自体と共に関数に渡す

これは、すべての要素がcSymbol,falseに等しい場合にのみ、testをtrueに設定します。

更新:私はあなたに行の計算を与えます。 、メインdialonal(インデックス:i*length+i)とサブ対角線(インデックス:i*length+(length-1-i)):あなたは(インデックスi+j*lengthを計算するヒント)にこれを採用する必要があります。インデックスi*length + jは、i行目にj番目の列を変換します。

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... 
    } 
} 
+0

で3 * 3の静的ですが、5 * 5 - 6 * 6 - 7 * 7のために動的です... –

+0

更新された回答を参照 – Attila

+0

仕事ですすべてのコード?私は私の質問で同じことをしたいのですが、私はそれを静的に書いています。私はdnyamicしたい。 check_game_state()メソッドを編集して動的にしてください。お返事ありがとう –

1

あなたはハード、あなたのチェック条件をコーディングすることはできません。あなたが実行するすべてのこれらのケースでは、単純なループを使用することができます対角線

を確認するには、列

  • をチェックするために行
  • を確認するには

    1. :あなたは3別の例を持っている必要があります0からN(あなたのゲームのサイズ)私は、充填されている現在のセルのトラックを維持すると言うでしょう。 x,yと言ってください。今度はこの座標を使用して、特定のrowcolumnを確認してください。そしてx == yの場合は前方対角線上にあるので、それを確認してください。同様に逆対角をチェックします。

  • 0

    ハードコードしたくない場合は、勝利ポジションなどを検索するアルゴリズムを実装する必要があります。たとえば、http://www.codeproject.com/Articles/43622/Solve-Tic-Tac-Toe-with-the-MiniMax-algorithmをご覧ください。

    +0

    {0,1,2}、{3,4,5}、 {6,7,8}、{0,3,6}、 {1,4,7} {2,5,8}、 {0、4,8}、{2,4,6}これも静的です }; –

    +1

    あなたの投票を理解していない。静的データと静的ロジックには違いがあります。 1つのことは、静的に何かを定義することです - ボードなど。しかしもう1つは、IF文をハードコードすることです。これはコードが悪いことです。しかし、静的な初期データはOKです。 –

    関連する問題