2016-07-21 13 views
-3

3x3 Tic tac toeゲームで勝者を見つける最良の最適な方法は、ボードが行列で表されるゲームですか?提案してくださいtic tac toeの勝者を見つけるアルゴリズム

+2

とIFSの束を最初の行とすべての==上の2つのBooleansを変更する必要があります... – user1121883

+0

[Tic Tac Toe java](http://stackoverflow.com/questions/10961749/tic-tac-toe-java)の可能な複製 –

答えて

2

Booleansの二次元配列を使用しているとします。ブール値は3つの値(null、true、false)を持つことができるためです。常に2人のプレイヤーしかプレイできないので、3つの値が必要です。未定義のプレーヤー1とプレーヤー2

Booleanの配列は、1以上のサイズであれば動作します。 の場合はtruefalseの場合はfalse、勝者がいない場合はnullが返されます。

public static Boolean getWinner(Boolean[][] grid) { 
    if (grid == null) 
     return null; 
    int size = grid.length; 
    if (size == 0) 
     return null; 
    if (size == 1 && (grid[0][0] != null)) { 
     return grid[0][0]; 
    } 
    boolean flag = true; 
    // checks horizontal 
    for (int index = 0; index <= size - 1; index++) { 
     flag = true; 
     for (int i = 1; i <= size - 1; i++) { 
      if (grid[index][i] != grid[index][i - 1]) { 
       flag = false; 
       break; 
      } 
     } 
     if (flag) 
      return grid[index][0]; 
    } 
    // checks vertical 
    for (int index = 0; index <= size - 1; index++) { 
     flag = true; 
     for (int i = 1; i <= size - 1; i++) { 
      if (grid[i][index] != grid[i - 1][index]) { 
       flag = false; 
       break; 
      } 
     } 
     if (flag) 
      return grid[0][index]; 
    } 
    // checks diagonal 
    flag = true; 
    for (int index = 1; index <= size - 1; index++) { 
     if (grid[index][index] != grid[index - 1][index - 1]) { 
      flag = false; 
      break; 
     } 
    } 
    if (flag) 
     return grid[0][0]; 
    flag = true; 
    for (int index = 1; index <= size - 1; index++) { 
     if (grid[size - index - 1][index] != grid[size - index][index - 1]) { 
      flag = false; 
      break; 
     } 
    } 
    if (flag) 
     return grid[size - 1][0]; 
    return null; 
} 

追記: あなたがEnum代わりのBooleanを使用している場合は、あなただけのequals

+0

ありがとう私はそれを正常に実装! –

1

これらの機能はそれを行う必要があります。私はチックタックつま先を作ったときに文字配列を使いました。

int rowcheck(char ch[3][3]) 
{ 
    int i; 
    char ans; 
    for(i=0;i<3;i++) 
    { 
     if(ch[i][0]==ch[i][1] && ch[i][1]==ch[i][2]) 
     { 
      ans=ch[i][0]; 
      break; 
     } 
    } 
    if(ans=='O') 
    return 1; 
    else if(ans=='X') 
    return 2; 
    else 
    return 0; 
} 
int colcheck(char ch[3][3]) 
{ 
    int i; 
    char ans; 
    for(i=0;i<3;i++) 
    { 
     if(ch[0][i]==ch[1][i] && ch[1][i]==ch[2][i]) 
     { 
      ans=ch[0][i]; 
      break; 
     } 
    } 
    if(ans=='O') 
    return 1; 
    else if(ans=='X') 
    return 2; 
    else 
    return 0; 
} 
int diagcheck(char ch[3][3]) 
{ 
    char ans; 
    if(ch[0][0]==ch[1][1] && ch[1][1]==ch[2][2]) 
    ans=ch[0][0]; 
    if(ch[0][2]==ch[1][1] && ch[1][1]==ch[2][0]) 
    ans=ch[0][2]; 
    if(ans=='O') 
    return 1; 
    else if(ans=='X') 
    return 2; 
    else 
    return 0; 
} 

プレーヤー1が返された場合は勝者2が勝ちます。詳細は、このリンクをチェックアウト :

https://keepkoding.wordpress.com/2015/12/12/everybody-knows-tic-tac-toe/

心にあなたを、このリンクはCである++が、ロジックが理解するのは簡単です。

+0

はい私は論理感謝を理解しました! –

+0

しかし、時間の複雑さが少ないなど、より良い方法はありますか? –

+2

平等をチェックする必要がある場合は、これよりも良い方法はありません。また、Tic Tac Toeをプレイしていると考えると、時間の複雑さを減らす理由はありません。しかし、もし必要ならば、最も簡単な方法は、少なくとも6回の移動が完了するまで、そのようなチェックを行わないことです。わずか9回の移動しか行えないと考えると、これは時間の2/3以上を短縮します。あなたが私の答えが好きだったら、それをupvoteしてください。 –