2015-11-03 9 views
17

私はこの作業溶液が見つかりました:jGraphTを使ってTicTacToeのゲームの勝利条件を確認することは可能ですか?

private int[] winningPatterns = { 0b111000000, 0b000111000, 0b000000111, // rows 
     0b100100100, 0b010010010, 0b001001001, // cols 
     0b100010001, 0b001010100 // diagonals 
}; 

/** Returns true if thePlayer wins */ 
private boolean hasWon(int thePlayer) { 
    int pattern = 0b000000000; // 9-bit pattern for the 9 cells 
    for (int row = 0; row < 3; ++row) { 
     for (int col = 0; col < 3; ++col) { 
      if (cells[row][col].content == thePlayer) { 
       pattern |= (1 << (row * 3 + col)); 
      } 
     } 
    } 
    for (int winningPattern : winningPatterns) { 
     if ((pattern & winningPattern) == winningPattern) 
      return true; 
    } 
    return false; 
} 

を私はグラフのロジックを使用して、よりエレガントな解決策があるかどうかを知りたいです。

更新:3x3ボードのさまざまなバリエーションで自分の知識を使用することも検討していますが、このアプローチは審美的に拡張できないと私は考えています。例えば

:25 25によるボードのhttps://en.wikipedia.org/wiki/Teeko

+4

それは十分にエレガントなようです探している? –

+0

私はグラフの設定にもっと投資し、次にmyGraph.isItWon()を呼び出すことができます。 –

+0

このアプローチは、64セル(つまり8x8)のボードを簡単にスケールアップするのに便利です –

答えて

2

私はあなたが持っているメソッドが実行可能であるが、以下のようにそれを改善するためにいくつかの方法があると思います。

  1. それが唯一それがwinningPatterns配列を通過するのにかかる時間がかかりますので、ユーザは、作品を追加している間パターンを作成します。

  2. 2番目の部分を改善するには、それをより効果的に保存することができます。あなたが同時に複数のものをチェックできるような方法で勝つパターンを保管してください。 たとえば、最初の位置が0の場合は、1つだけでなく3つの可能性を削除することができます(111 000 000、100 100、100 010 001)。

  3. 平均確率が高い可能性が最も高い位置を確認することで、平均的なケースを改善できます。例えば、途中に置いてから4つの方法がありますので、その順番で確認してください。

  4. プレーヤの位置を別々の配列に格納すると、p1Tilesとp2Tilesがあります。ほとんどの場合、ボードがかなり空になるので、平均ケースが大幅に増加する可能性があります。ボードがリセットされる前は、このゲームの1つのインスタンスでのみフルになります。

  5. あなたは実際には、現在のユーザーが置く作品が勝つかどうかを確認する必要があるだけで勝っているプレーヤーのすべての部分をチェックする必要はありません。だから、この方法ではボードのサイズが99〜999 x 99〜999であっても、最悪のケースの他の12個のスポットをチェックする必要があります。 (現在のスロットPLUSの周りのすべてのスロットのために、同じ色の2つがお互いにあるので、次のスロットを見なければならないので、

関連する問題