abaloneというボードゲーム
https://www.codingame.com/multiplayer/bot-programming/abalone
こんな感じで対戦するアルゴリズムを1時間で作ってみます。
以前作ったことがあるのですが、今回はデータとして渡される合法手のデータを利用して1時間で挑戦してみます。
最終的に1時間 + ルーチンを1つ追加したものが下になります。
簡単なルール説明
勝利条件
相手のコマを6個押し出すか、350ターンで相手より多く押し出している。
移動条件
1から3つの直線状で連結自分のコマを6方向いずれかに動かす。
ただしボード外、他のコマがあれば押す以外の移動はできない。
押す、連結線の向きに移動の場合、その向きにつながる相手のコマより多い場合押せる。(これによって押し出せる)
ゲームのコツ
なるべく中央に自分のコマを集める(今回未実装)
うまく逃げ出せない縁に相手のコマを押す(今回未実装)
それでは作成開始!
4分経過
合法手実行
最期の合法手を選択しています。
ゲームが進まないことには何もわからないので、まず動くものを作ります。
10分経過
ボードを表示
今回はルールの把握がないのですが、ルールの把握、データ検討があると3倍は軽くかかります。
ルールの把握にはボードの状態を表示するところからになります。
16分経過
データ変更
AIを作る際に重要なポイントとして評価しやすい(計算しやすい)形にデータを変更することが最重要です。
ヘックス型で六角形のボードの場合画面下の形に整形すると、移動方向の計算が楽になります。
40分経過
内部データとの関連付け
プログラム内のデータ座標とゲームの座標が異なることはよくあります。
プログラムだとデータ左上が 0 0になるのですが、大抵のボードゲームはそうなってはいないのでひと手間かかります。
これは0 0なのですがヘックスなのでかなり大変です。
ここでは関連付けと評価用にその位置から移動した方向の座標を取る関数を作っています。
60分経過
合法手の評価
最終的に一コマ押出を優先しています。
60分で作成したものを一画面に収まるように加工しています。
作り始めのころにけっこう楽しいのがここ、最後に一番悩まされるのもここです。(データ変更からやり直しもよくあります)
最終的なプログラムはその対象に対して認識力が一番高い時の産物なので、整理されていないとあっという間にオーパーツ化してしまいます。
強化のコツ
うまくいかない時は丁寧にデバッグ表示を追加して、少しでも精密なものを作ることです。
これは開始時から100分経過しています。
押す際のパターン認識を10行ほど追加して強化、2手押しだしを判定させています。
BOSS1に勝てるレベルになりました。
簡単なおさらい
1. ルールを把握
2. データを使いやすい形に
3. 優先順位を明確に
こんなところまでお付き合いありがとうございました。