🔙 Back to Top

Mon Jan 08 2018

日記 - 年末年始

12/29

三越前駅で降りて散歩した. 日本銀行がやっているという貨幣博物館を見つけたが、ちょうど29日から1/3までの年末年始は休館だった. いつか行ってみたい. ついでに、東京駅に行って、買ってほしいと頼まれていたお土産を、大丸に行って買ってきた.

帰省のためのカバンをどうするか迷ったが、結局、大荷物はキャリーバッグにして、近所のファミマから、宅配してもらった. 希望の到着日付時刻を、30日にしたかったが、手配したのが遅すぎたらしく、結局31日の夕方にしてもらった.

12/30

ショルダーバッグに本を四冊詰めて、1430の新幹線で帰った.

01/02

結局持ってきた本はほとんど読まなかった. 本をキャリーバッグに詰めて、駅の近くのローソンから宅配してもらった. 今度は次の日の朝を指定でき、実際届いた.

帰りの新幹線は 1930 だったが、博多から来る新幹線 (つまり新大阪発ではない) は全て遅れているようであった. それを知ったのはちょうど、JRから新幹線に乗り換える改札を通った後であった. 駅員に言うと、簡単に改札を出入りできたので、買っていた駅弁と外の公園で食べた. ところでこういう場合、自由席なら時間を気にせず、今あるものに乗れるから良い. もちろんどれも満員で、それはそれで大変そうだと、眺めていた. 私は指定席が惜しいので、 1930 発だったはずの新幹線を持ち、結局 105 分待たされた. 東京駅に着いたのが 2350 くらいで、少し急いで丸ノ内線に乗った. そちらは問題なかったが、乗り換えた後乗った電車は最終電車だったので、ギリギリだった.

ゲームAIの開発: 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を捌くことだけに集中すれば出来る.