Pythonでリバーシゲームを書こうとしています。シンプルで優れた使いやすい基本的なアイデアと戦略を教えてください。
少し遠くまで行ったのですが、コード間で立ち往生していて、それもより複雑になっているので、助けていただければ幸いです。かなり単純なはずの部分でやり過ぎたと思います。そう....
Reversiはエレガントでシンプルなゲームです。いくつかの概念を説明するために疑似C#/ Java言語を使用しますが、それらをPythonに置き換えることができます。
それを最も単純なコンポーネントに分解するには、2つの基本的なことがあります。
ゲームボードを表す2次元配列:
gameBoard[10,10]
そして、ゲームボード内の各タイルの状態を保存する何らかの形式の列挙:
enum tile
{
none,
white,
black
}
ボードをレンダリングするには、gameBoard配列をループし、ピースサイズのオフセットを増やします。
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
// The Piece to draw would be at gameBoard[i,j];
// Pixel locations are calculated by multiplying the array location by an offset.
DrawPiece(gameBoard[i,j],i * Width of Tile, j * width of tile);
}
}
同様に、マウスクリックを配列内の場所に戻すことも同様です。マウスの場所とオフセットを使用して、実際のタイルを計算します。
タイルが配置されるたびに、配列全体をスキャンし、新しい色がどうあるべきかについて、エンジンに基づく単純なルールを適用します。(これは本当の挑戦です、そして私はそれをあなたに任せます。)
AIは、架空の動きでこのアレイスキャンを実行し、10程度の可能な動きをスキャンしてから、最良の結果が得られるものを選択することを利用できます。ゲーム全体を頭の中でプレイさせると、無敵のAIを簡単に作成できるため、スマートにしないようにしてください。
アレイに空きの場所がなくなったら、ゲームを終了します。
ウィキペディアのページには、リバーシ/オセロのすべてのルールと適切な戦略のアドバイスが記載されています。基本的に、ボードの状態、つまりゲームの任意の時点でのボード上のすべてのピースの位置を表すには、ある種のデータ構造が必要です。他の人が示唆しているように、2次元配列はおそらくまともな選択ですが、それがあなたにとって意味のある表現である限り、それは実際には問題ではありません. いくつかの難しいことは、どのスペースが有効な動きであり、どの部分をひっくり返すかを理解することですが、繰り返しになりますが、ウィキペディアのページにはすべての詳細が含まれているため、実装するのはそれほど難しくありません.
ゲーム用の AI を作成する場合は、アルファ ベータ プルーニングを使用したある種のミニマックス タイプのアルゴリズムを検討することをお勧めします。ウェブ上にはこれらのリソースがたくさんあり、適切な評価関数を備えたミニマックスを使用する AI は、ほとんどの人間のプレーヤーを非常に簡単に打ち負かすことができます。これは、非常に短い時間で少なくとも 8 または 9 手先を見ることができるためです。ミニマックスには、ネガマックスやネガスカウトなど、基本的なミニマックスよりも優れた機能を備えた他のいくつかのより洗練されたバリアントがありますが、私はより単純なものから始めます. ウィキペディアにはこれらすべてのアルゴリズムに関するページがあり、多くの AI コースがオセロなどに使用しているため、それらすべてに関する大量の情報があります。特に役立つページの 1 つは、この Java アプレットです。. これにより、サンプル状態ツリーのミニマックスとネガマックスのステップを、アルファ ベータ プルーニングを使用して、または使用せずに実行できます。
これが意味をなさない場合は、私に知らせてください。
2Dアレイが必要です。[[0] * 8] * 8に注意してください。代わりに、[[0 for _ in [0] * 8] for _ in [0]*8]を使用してください。
白は1、黒は-1である必要があります(もちろんその逆も同様です)。このようにして、* =-1でフリップを実行し、空白を空白のままにすることができます。2つの4つのループでスコアを合計し、ゲームがかなりうまくいったかどうかを判断できます。map(sum、map(sum、board))はあなたにネットスコアを与えます
ラウンドの開始時にプレーヤーが移動できるかどうかを確認することを忘れないでください
マルチディムアレイソリューションに夢中にならないでください。私はすでにマルチディムで三目並べを作成しましたが、それは問題なく機能しましたが、自分のバージョンのothelloを開始したとき、線形整数配列を作成しました。これはほぼ2倍高速です。
私はほとんどすべてをPHPでコード化していますが、Tic-tac-toeのような強引なソリューションとしてAIのIdeaを研究することはうまくいきません。
また、位置を分析するために「ファジー ロジック」ループの適用を検討することもできます。リバーシ/オセロは、プレーヤーに各手ごとに特定の戦略的利益と戦略的損失を考慮することを強制し、あるポジティブな動きを別のポジティブな動きよりも優先させることで有名です。
ファジー システムを使用すると、さまざまな設定を相互に設定することで移動選択のテストをより細かく制御でき、さまざまなウェイトをシフトして対戦する複数の「パーソナリティ」を作成することができます。
線形配列さえ必要ありません。2 つの 64 ビット Java long 値で十分です (1 つは白のピース用、もう 1 つは黒のピース用です。 assert (white&black)==0 .
角につながった駒ではなく、取れない駒を数えることで、より強いプレーができます。