パーソナルブログメモリ

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

ナイン・メンズ・モリスのAIを線形と辞書で、つくってみる

2021-02-12 | プログラムをマスター計画2020

ナイン・メンズ・モリス

という2000年前からあるボードゲームらしい。

 

こんな感じのゲーム

互いに交点に石を置いて、縦横のラインに3つ自分の石が並ぶと1個相手の石を取る。

置く石がなくなると交互に駒を、交点から隣の交点まで動かせるようになる。

同じように3つ並んだ時、1個相手の石を取る。

自分の石が残り3個になると、自由に駒を動かせるらしい。

 

このゲームのなかなかアルゴリズムが作りにくい。

 

最後に作ったのは5日前らしいが、もうサッパリ忘れている。(ずっと前だと思ってました)

それを2画面になんとかまとめてご紹介。

下ごしらえの部分

このボード実は1つのラインに交点は3つずつしかない

8-13行目でそのパーンで得点に関係しそうなパターンを降順に作成

あと位置を 横a-g  縦1-7(下から)で表現していて、

15-18行で全ての3つずつのラインをデータ化

32-36は指定位置に移動できる相手駒があるか判断する関数

20-31は各点からとなりに移動できる位置を辞書型で登録

38-42はそれらを設定して確認用の表示

 

 

メイン部分

45-47 ボードをすべて辞書型に

49-53 ボードのラインごとに状態を設定

54-64 各ラインごとにボードの状態を調べる

 o3 相手が3つ並ぶ点

 p3 こちらが3つ並ぶ点

 p2 こちらが2つ並べて相手が並んでいない点

 o_take_move_point 相手がとなりに動いて3つならぶ点

 reach_move_point こちらがとなりに動いて3つならぶ点で相手は移動してこれない

 といった位置を格納

65-最後

 渡されるデータ 動かせる手の全て情報からこれまでに作った位置の情報から得点化して

 一番高い得点の手を指す。加点方法は適当、(こっちのほうが高いよなといった勘)

 

そんな感じで動いています。

1ヶ月ぐらいするときれいに忘れるので、記録してみました。


最新の画像もっと見る

コメントを投稿

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