パーソナルブログメモリ

a = [1, 1]
for _ in "*" * 999: a += [sum(a[-2:])]
print(a)

ボードゲームのAIを1時間で作る技術(abalone)

2021-08-06 | 速攻で言語マスターしてみませんか

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. 優先順位を明確に

 

こんなところまでお付き合いありがとうございました。


最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。