三越前駅で降りて散歩した. 日本銀行がやっているという貨幣博物館を見つけたが、ちょうど29日から1/3までの年末年始は休館だった. いつか行ってみたい. ついでに、東京駅に行って、買ってほしいと頼まれていたお土産を、大丸に行って買ってきた.
帰省のためのカバンをどうするか迷ったが、結局、大荷物はキャリーバッグにして、近所のファミマから、宅配してもらった. 希望の到着日付時刻を、30日にしたかったが、手配したのが遅すぎたらしく、結局31日の夕方にしてもらった.
ショルダーバッグに本を四冊詰めて、1430の新幹線で帰った.
結局持ってきた本はほとんど読まなかった. 本をキャリーバッグに詰めて、駅の近くのローソンから宅配してもらった. 今度は次の日の朝を指定でき、実際届いた.
帰りの新幹線は 1930 だったが、博多から来る新幹線 (つまり新大阪発ではない) は全て遅れているようであった. それを知ったのはちょうど、JRから新幹線に乗り換える改札を通った後であった. 駅員に言うと、簡単に改札を出入りできたので、買っていた駅弁と外の公園で食べた. ところでこういう場合、自由席なら時間を気にせず、今あるものに乗れるから良い. もちろんどれも満員で、それはそれで大変そうだと、眺めていた. 私は指定席が惜しいので、 1930 発だったはずの新幹線を持ち、結局 105 分待たされた. 東京駅に着いたのが 2350 くらいで、少し急いで丸ノ内線に乗った. そちらは問題なかったが、乗り換えた後乗った電車は最終電車だったので、ギリギリだった.
6x6
状態や手の記述が単純なので、練習がてら、6x6のオセロのAIを書いた. それは最近の話じゃなくて、去年の4月だけど (https://github.com/cympfh/6x6/commits/master).
普通AIを書くというとどこまでを実装するかわからないが、この 6x6
というAIは、UIの部分を全く持たないし、ゲームの状態も持たない. 1つの状態を (標準入力で) 与えると、最善手を (標準出力で) 返す、という風にコア部分だけが、1つのコマンドとして実装してある. オマケ機能として、手を打ったあとの状態を返す機能、ゲームが終了したか (決着が着いたか)チェックする機能も実装してあるので、 UI が 6x6
をエンジンとして利用できるようにしてある.
UIがすべきことは、盤面の状態を持っておくこと、次の手番がどちらか持っておくこと、 その他、盤面の表示や、プレイヤーの手の入力を受け取ることなど.
UI ->
1. 初期盤面を作成して 盤面.txt として保存
2. 人間とAIの先行後攻を決定
3. 以下をループ
1. 盤面の表示
2. `6x6 check` でゲーム終了しているかチェック
- してるなら、どちらが勝ったか表示して終了
3. 人間のターンのとき
- 人間に手を決定させ入力を促す
- `6x6 put` で次の盤面をもらう (invalid かのチェックもこの機能にある)
- valid なら 盤面.txt として上書き保存
- invalid ならもう一度入力させる
3. AI のターンのとき
- `6x6 solve` で次の最善手をもらう (valid な手のはず)
- `6x6 put` でその手を打つ
4. ターンを人間とAIで入れ替える
6x6 solve ->
- 盤面の状態と次のプレイヤーがどっちかの情報をもらう
- そのプレイヤーにとっての最善手を調べる
- 主にモンテカルロ
6x6 put ->
1. 今の盤面の状態と、次打つ手をもらう
2. その手が妥当か調べる
- 妥当なら、打ったあとの盤面を出力
- 妥当でないなら invalid と出力
6x6 check ->
1. 今の盤面をもらう
2. どちらにとっても打てる場所がないなら、ゲームは終了している
- どちらが勝ったか出力
- さもなくば、ゲーム続行であることを出力
ゲームAIとして普通の設計なのかどうなのか全くわからないけど、 機能がキレイに分離していて、気持ち良い.
例えば twitter bot としてオセロAIを立てることも、TwitterAPIを捌くことだけに集中すれば出来る.