ICFP プログラミングコンテスト終了

あーたのしかった。いいねいいね。

ルールはユーザがプログラムを書いてそのロジックに従ってゲーム世界が動き、その得点を競う種類の、ええと Robocode とかカルネージハートとかテラリウムとかそっち系。

言語に依存しない競技なので独自の記法のステートマシンを書いて提出。そのへんカルネージハート感覚。でも自機であるところのアリどもの知りうる情報は非常に少なく、ステートマシンも基本的にかなり書きにくい記法なので、カルネージみたいに手ではなかなか書けない。で、ステートマシンをアセンブラとすると自前で高級言語を作るわけ。まあ私が作ったのはマクロ程度のもの。なるほどね、こうすれば完全に公平なルールを作れるわけね。

で、実際のゲーム世界はアリが自分の巣に食物を持って帰るのですが、その数を競うというもの。進化とか子を産んだりはしない。やってみるとわかるけど実力が素直に成績に反映する。運の要素が Robocode とかとくらべると随分少ない、と思う。これも好印象。

もう少し詳しい紹介。プレイヤーはアリ、 ant 。最初に sample.ant というファイルを見て、 Java? と身構えたりしたわけだけどどうでもいいや。アリのできる行動は Sense, Mark, Unmark, PickUp, Drop, Turn, Move, Flip の 7 つ。 Move は前進、 Turn は旋回、 PickUp は食物を拾う、 Drop は落とす、 Mark はマーキング、 Unmark はマーキング解除、 Sense は特定方向の状況 (味方・敵がいるか、食物があるか、障害物があるか、マーカーがあるか、巣があるか、など) を検知して分岐、 Flip はランダム分岐。これらの行動を一行に一つ書き、その行番号がそのまま状態の名前になる。例えば、

Sense RightAhead 1 2 Food  ; 0: 右前に食物があれば 1 へ、そうでなければ 2 へ。
Turn Right 0               ; 1: 右向いて 0 へ。
Move 0 3                   ; 2: 前進して 0 へ、前進に失敗したら 3 へ。
Turn Right 0               ; 3: 右向いて 0 へ。

なんて感じ。こんなもん手で書いてたら死んでしまうのはわかるかと思います。

プログラムとしては、まずシミュレータは与えられていないので、ゲームのルールを理解しつつシミュレータを書き(前回もこのプロセスがあっが、これは非常に重要だし素晴しい。これによってルールを体験的に理解できます) 、ステートマシンを出力するコンバータを書き、そしてそのコンバータ用にアリのプログラムを実際に書きました。

シミュレータは D/SDL 。眠かったのもあると思うが 6時間位かかってしまった。前回よりルールがややこしくなってたのもあるか。シミュレータはこんなかんじ。 (http://shinh.skr.jp/tmp/sim.jpg) やる気ないつくりだけどまあ必要な情報は見えてる感じ。当初はもっとひどかった。

コンバータは凝りすぎるとアリ本体のコーディングに手が回らんな、と思ったので結構低機能。 D 言語。ステートマシンは変数を持てないので、 C++ のテンプレートみたいに、変数の全てのパターンに対して別の状態を生成させたいのでその機能と、あとはいちいちステートを数字で管理するのは無理なのでラベルづけ、変数の展開、 ifeq 制御構文、なんかを実装したはず。寝る前に実装したところジンもしくはビールから出てきたこびとさんがものすごいクオリティのコードを書いていました。

私はこの手のゲームはとにかく状態をしっかり書いた上で全ての状況に対応するコードをちまちま書いていくアプローチが好きです。というかそういう頭悪い方法しか取れません。で、アリは 91匹もいやがるので、最初に条件分岐を仕込んで役割分担をさせることにしました。餌を適当に探してそこまでマーカーをひく係、マーカーに従って餌を拾う係、家でひきこもって餌を守る係、です。

これがうまいアプローチなのかどうかは友達いない私には判断する方法がなかったのですけど、「敵が動かんかったら全部餌集められんべ」 (http://lists.seas.upenn.edu/pipermail/icfp04-discuss/2004-June/000085.html) と言っている人がいる以上、それができない私の方法はあまり良くないんだろーなーと思ってました。そもそも相手が一人もいないんだから仮想敵も相談相手もいないんだよう。だいたい私のシミュレータがちゃんと動いているかでさえ確実には確認できないのだよ。で、前回と違って相手がいないとやりにくくて、なんかあまり全力を尽した感じではなかったのでした。これ書いてる余裕あるわけですしね。

まーでもそれなりに思い通りに動くものができたので結構うれしかったりするのです。

で、さっそく結果を公開してる人を見る…まずこれにボコられました (http://tomas.rokicki.com/icfp2004/) 。すげー。なんか気持ちいいくらいおはなしにならんのですけど。大体敵陣を囲むって全く気付かなかった。今にして思えば思いついても良かったな。あと私の餌防衛は何の役にもたってないことがわかった。自陣に敵アリがわんさかいますがな。あと 159行のアリにボコられてみたり。ふがいないね。

あと提出時のディレクトリ構成間違ってるやんけ、と気付いた。まあその位許してくれるよねたぶん。

ああ忘れてた。ひとのを見て自分のさらさないのは趣味じゃないので。 (http://user.ecc.u-tokyo.ac.jp/~s31552/ant.tar.bz2) ちなみにオリジナルとディレクトリ構成が違います。

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