2017-07-01 15 views
0

tic-tac-toeゲームのルールは次のとおりです。 3つの連続するxまたはoがある場合、またはすべての場所が占有されている場合、ゲームは終了しています。Tic-tac-toeゲームが終了したかどうかを判断する方法は?

たとえば次のイメージは、このルールを示し:

this picture

これは、最初にそれぞれの列、行、対角、抗diagnalを検査するループに使用して、その後、基板全体かどうかをチェックすることによって達成することができます満員でした。しかし、これによってコードが非常に長く続くことがあります。もっと良い解決策はありますか?

+0

これには2種類の回答があります。最初は実装ベースです。どのような実装を使用していますか? 2番目は一般的な答えです。私はあなたが少なくとも1回は各ブロックを横断しなければならないと思います –

答えて

1

勝利は、1人のプレイヤーがターンをした後にのみ起こります。そこでは、行と列、時には対角線にのみ影響します。つまり、すべての行、列、および対角線の代わりに、行、列、および対角線の一部を確認するだけです。

0

計算時間の面では、各勝者の位置を直接チェックすることです。もちろん、ラウンドを修正することでこれをスピードアップし、ユーザーがこのラウンドにマークを置いた位置を含む勝者の位置のみをチェックすることができます。ここで

すべての勝ち位置や加工方法されています

public boolean hasWinner() { 
    return 
     (board[0] != null && board[0] == board[1] && board[0] == board[2]) 
     ||(board[3] != null && board[3] == board[4] && board[3] == board[5]) 
     ||(board[6] != null && board[6] == board[7] && board[6] == board[8]) 
     ||(board[0] != null && board[0] == board[3] && board[0] == board[6]) 
     ||(board[1] != null && board[1] == board[4] && board[1] == board[7]) 
     ||(board[2] != null && board[2] == board[5] && board[2] == board[8]) 
     ||(board[0] != null && board[0] == board[4] && board[0] == board[8]) 
     ||(board[2] != null && board[2] == board[4] && board[2] == board[6]); 
} 

指標としてボードを識別する:

0 1 2 
3 4 5 
6 7 8 

としてはそれがある(プレイヤーがboard[4]でそのマークを配置した場合、言いましたあなたがチェックする必要があるでしょう:

(board[3] != null && board[3] == board[4] && board[3] == board[5]) 
||(board[1] != null && board[1] == board[4] && board[1] == board[7]) 
||(board[0] != null && board[0] == board[4] && board[0] == board[8]) 
||(board[2] != null && board[2] == board[4] && board[2] == board[6]) 

それは2つのstrai ghtと2つの対角の勝利シナリオ。その他の勝利シナリオはboard[4]の影響を受けず、このラウンドでは勝利を収めることはできません。

Map<Index, Set<WinningScenarios>>を使用すると、インデックスなどを確認してすべてのシナリオにアクセスできます。あなたのボードが大きい場合は、チェックする必要のある他のポジションを直接計算することもできます。

ゲームが停止し、両方が緩んでいるかどうかを確認するために、配置されたマーク(またはラウンド)の数を覚えて、毎回増加させることができます。カウンタがboard.lengthに達すると、すべてのフィールドが設定されます。

関連する問題