0

こんにちは、9 つ​​の要素と enum マーク (O,X) を保持できる 1 次元配列を持つプログラムを作成しました。このエンコーディング スキームは、最初の動きを x に設定し、次に o を配列に設定します。私の問題は、勝者を計算する getWinner() メソッドをより効率的にしたいということです。現在、if else ステートメントがたくさんありますが、どうすればコード行を減らして、より「スマートな方法」で作成できますか。

4

3 に答える 3

1

まず、三目並べが見つかった後も検索を続けるのではなく、見つけたらすぐに getWinner() の実行を停止する方がよいでしょう。最後のステートメントを含め、各 if ステートメント内でそれを行うことができますreturn result;

とにかく、ここに効率のためのアイデアがあります: プレーヤーが移動 (たとえば X) を行うたびに、他の X のために三目並べを行うことができる他の正方形のみをチェックします。ロジックを実装する方法について考える必要がありますが、ボード上の 3 つの正方形のすべてのセットを毎回チェックする必要がなくなります。

于 2013-09-14T23:50:25.820 に答える
1

縦方向と横方向のチェックをループのペアにグループ化するのは非常に簡単です。例えば:

// Horizontal test
for (int i = 0; i < 3; i++) {
    if (getMark(i, 0) == getMark(i, 1)
        && getMark(i, 1) == getMark(i, 2) && getMark(i, 2) != null)
        result = getMark(i, 0)

// ...

// Vertical test
for (int i = 0; i < 3; i++) {
    if (getMark(0, i) == getMark(1, i)
        && getMark(1, i) == getMark(2, i) && getMark(2, i) != null)
        result = getMark(0, i)

これ自体で 6 つの if ステートメントが必要であり、それらを 2 つに減らします。

于 2013-09-14T23:53:27.013 に答える
0

このゲームを実装しているページを見つけました。 http://www.lightbluelab.com/enjoy/ai/tic-tac-toe/ 使用するアルゴリズムはわかりませんが、JavaScript で記述されており、ソース コードが必要なため、参考になると思います。利用可能になります。

于 2013-09-16T13:26:07.067 に答える