puyoai

有志でやってた、ぷよ AI 作ったりして遊ぶコードを github に起きました。 TODO やおかしいところがたくさんありますが、キリがないので、まあとりあえず置いておこうという…

https://github.com/puyoai/puyoai

人類最強を実際のゲーム機上で倒すことを目標として作られてますが、脇道として色んなコードがごちゃごちゃ入っています。 LinuxMac で動作するものが多いです。

duel/duel

トップレベルで make してうまくいくとできる duel/duel は AI vs AI をシミュレータ上で戦わせることができます。例えば

$ ./duel/duel cpu/hamaji/lps.sh cpu/shinyak/run.sh

などとして AI 同士で戦わせることができます。

$ PUYO_REALTIME=1 ./duel/duel cpu/hamaji/lps.sh cpu/shinyak/run.sh

などとすると常識的な速度で対戦させることができ、

$ PUYO_SEED=1 ./duel/duel cpu/hamaji/lps-fast.sh cpu/ichikawa/run.sh

などとすると seed を固定することができます。他のオプションとしては、配ぷよを固定する PUYO_SEQ や、実機同様ネクネクを遅らせて AI に送る PUYO_DELAY_DOUBLE_NEXT (いずれデフォルトの挙動にする予定)などがあります。他のオプションは

$ grep PUYO_ duel/*.cc

などとすると見つかるかもしれません。

cpu/*/*.sh

CPU は本体とは独立して実行されます。 CPU は標準入出力を通して AI を走らせるプログラム (duel/duel や後述の capture/connect) と通信します。プロトコルの仕様は

https://docs.google.com/document/d/1cTIJgRHCBhmxXVtBb45Jm3yAQVaogfVN3oayi-FrA74/edit

にすごく雑に書いてありますが、このドキュメントからではわからない仕様や、不正確な部分も残念ながら多いです。

有志によるそれなりに戦う AI や、作りかけで何がしたいかわからん AI などが各ディレクトリに散らかっています。残念ながら現状だと、強いものでもせいぜい私と互角とかそのくらいの強さしか無い感じです。プロトコル的には言語は何で書いても大丈夫なはずですが、 core/ ディレクトリにある定数やライブラリで使えるものがあるため、 C++ で書くのが無難で、現状では C++ の AI しかありません。

capture/*

実際のぷよぷよのゲームと接続するためのあれこれがごちゃっと入っています。 Wii の VCA 上でのぷよぷよと接続していて、その部分のコードは video4linux2 に依存している他、 ffmpeg やら SDL やらが必要です。詳しくは capture/README を参照ください。

capture/parse_bmp は単一の画像を読みます。デバッグ用。

capture/parse_imgs は複数の画像を動画として読みます。矢印の左右でシークができるようになっています。

capture/parse_movie は mpg などの動画を ffmpeg で読みます。

capture/parse_viddev は Linux 上でキャプチャボードから取ってきた絵を見ます。これを使うと人間同士で戦っている時も後述の capture/commentator によって客観的な情報を知ることができます。

これらは、実機で人間と対戦する時以外にも、定石作りや教師データなどにも使おうと考えています。例えば、 ぷよ譜 DB や cpu/hamaji の評価関数パラメータ調整は、このコードの前身 (cpu/hamaji/parse_movie.cc) が使われています。

ちなみに windowsぷよぷよと接続した時の(私以外が書いた)コードもあるにはあるので、そのへんも入れたいところです…

capture/connect

Wii 上の VCA で AI と人間で対戦するためのバイナリです。

$ cd capture
$ ./connect /dev/video0 ../cpu/hamaji/lps-fast.sh - | hidmon-mod/puyo

などとして実行することが想定されてますが、 Wii コントローラと接続するハードウェアが必要なため、実際に実行するのは極めて困難だと思います。余談ですが、このハードウェアは、ある金曜日にハードウェアが得意な人にその話をしたら、「いいですねー」とか言いながら Wii につなぐ GCA コントローラを眺めていて、月曜にはコントローラを持って帰ることもなく完成していて、見積りをお願いしたら納品されてたという感じで、カッコえーと思いました。

一応、

$ cd capture
$ ./connect test.mp4 ../cpu/hamaji/lps-fast.sh -

などとして、動画の状況だと AI はどうするのか…とかを眺めることはできなくはないですが、あまり意味はないかと思います。

capture/commentator

capture/parse_* や capture/connect で表示される現状のぷよ対戦状況に客観的なコメントを追加するためのコードです。 VCA と接続した場合はかなり正確に状況を伝えてくれますが、動画をソースにした場合、発火の検知がうまくできないことが多いので、色々とおかしな感じになります。項目の意味は

本線
4個までぷよを補って発火される連鎖で、だいたい最強のもの(連鎖数の増えない同時消しの増加は考慮しない)ものが表示されてます。赤1緑1などは発火に必要なぷよの種類を示しています。ぷよにオーバーレイされて表示される数字は、連鎖発火中でない時はこの連鎖の経路を示しています。 VCA 接続時も動画再生時も正確なはず、です。
発火可能最大連鎖
ネクネクまで使って発火できる最強の連鎖です。置くべきところに◇が表示されますが、大変わかりにくいです。
発火可能潰し
ネクネクまで使って発火できる潰しっぽい連鎖です。「潰しっぽい」の定義は適当です。置くべきところに△が表示されますが、略。
発火中/最終発火
今発火しているか、最後に発火した連鎖の威力です。動画をソースにしている場合はおかしいです。
積み込み速度
PPS は Puyopairs Per Second の略で FPP は Frames Per Puyopair の略です。連鎖を発火している最中もカウントされちゃっているので、現状では序盤の積み込み速度をなんとなく測るくらいにしかなっていません。
AIによるコメント
AI が MSG= を使ってメッセージを送った場合、表示されます。
下の5列
本線が増えた時は下に記録されて行きます。また、連鎖を発火した時にも記録されていきます。

ゆくゆくはゆっくりに喋らせて自動解説とかできるといいなーと思ってますが、それ以前に色々わかりにくいのと、動画をソースとした場合に色々おかしいです…

とりあえず最初のデモとして、 2011年S級の動画に適用した時のものを Youtube にアップロードしておきました。ニコ動にも置こうと思ったけど色んな制限でできなかったのでまた今度…

http://www.youtube.com/watch?v=up6Jt5Isnx0

展望

やりたいことは無数にあって夢いっぱいな感じなんですが、とりあえず

  • duel/duel に必要な修正をする
  • AI を強くする
  • ぷよ譜 DB に 2012 年 S 級の試合を入れる
  • 俺も AI 作ってみたいーという人がいればドキュメントを整備する

あたりが今の私のハイプライオリティタスクです。俺も AI 作ってみたいーという人はなんらかの手段で私に github のアカウント名を教えてくれれば足しますので、ぜひ遊んでみてください。

夢いっぱいの内容としては

  • ぷよ1ルールを実装して、 B ぷよにつないで遊ぶ
  • ネットワーク越しに対戦できるサーバとか作る
  • HMD とカメラで、ぷよスカウターを作って、「たったの5連鎖か、ゴミめ」とか言う

などが例としてあります。

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h