CODE VS 5.0の予選期間も残すところあとわずか。いまから参加しても、まだまだ間に合います。とても面白いので、この手のゲームAIに興味のある人は参加してみましょう。
ところで、競技プログラミングの世界的王者のchokudaiさんから私に暖かい(?)応援メッセージが届いております。
CODE VS、自分は競技プログラミングのプロだから、序盤の環境読み切って簡単なAIで適切にレーティング高める部分は負けないと思うけど、最終的にはAI作成のプロであるやねうらおさんがさくっとダントツ1位取ってくれるに違いないと思ってるよ。そうですよねやねうらさん!!!
— chokudai(高橋 直大) (@chokudai) March 5, 2016
ここでそれなりの成績を残さないと、ゲームAI作りにおいても
コンピューター将棋プログラマ <<< (越えられない壁) <<< 競技プログラミングの世界ランカー
みたいな図式が世間の皆様の印象に残りそうで、私も奮闘しなければと思うのですが…。
オンラインで参加したくないという人や予選期間終わってからでもやってみたい!という人のために、CODE VS 5.0では最初からAIが何個か用意されているので、オンラインで参戦しなくとも、オフラインで十分遊ぶことが出来ます。これがまた楽しい!私も作りかけていたAIを昨日、一通り動くところまで仕上げて、とりあえず一晩、プリセットされているAIと対戦させてみました。
プリセットされているすべてのAIに1000連勝したらオンラインに参戦させようかと思っていたら、結構手強いHiretsuAIはなんかすぐに止まっちゃうし、他のAIも標準入出力のログをすべてテキストボックスに表示させているせいか、すごく重くてログが長いと途中から対戦がなかなか進まないようですが…。(Javaなんとかフレームワークのせい?)
ともかく、今日一日、もう少し調整して、明日から私もオンラインで遊びたいと思います。
ここまでやってみた個人的な感想を以下にざっと書いておきます。ヒントにならない程度に書くつもりですが、ヒントになってたらごめんなさい。
今回のCODE VS 5.0、ゲームシステムは本当によく出来ています。オンラインで他のプレイヤーと対戦できますし、ステージごとに各スキルの消費ポイントがランダム化されているので一つの戦法だけで俺TUEEEEEできません。そのステージ条件ごとに戦い方を変えていく必要があります。その分、きちんとAIを作りこまないといけないので、なかなか大変でもありますがそれがまた楽しい!
私は、犬がどう動くのか、なかなか理解できなかったので、犬の移動をシミュレーションする部分にずいぶん時間を使いました。
競技プログラミング界隈の人たちなら、このへん瞬殺なんだと思いますが、できればサーバーサイドのこの部分のシミュレーションのコードがサンプルとしてついていて欲しかったです。
細かいことを言うと仕様が色々不明瞭な部分がありました。
・分身を自分と敵が同時に使ったときにどうなるのか(正解 : その両方を犬が追いかける)
・分身を使った場所に岩を自分が移動させたり落とされたりした場合はどうなるのか(正解 : その分身はなかったことになる(?))
・「右の岩を押して左に戻る」という移動があったとして、このときこの岩の右の升に敵が岩を落とした場合、自分はどういう移動になるのか(正解 : 右に移動する行為がキャンセルされ、左に1升移動しようとする(移動できるなら))
・サーバーでAIを動かすときのサーバーのスペック(メモリ量、CPU等)
このへん、公式アカウントのなかの人がtwitterで個別には返信されているとは思うのですが、それをひとまとめにした新着情報みたいなのを、この対戦クライアントを起動したときに表示してくれるなどしたほうがいいかなと思いました。
あと対戦させるフレームワークがJavaで作られていて、何か変な入力をしたときに「内部エラー」となってしまうのでエラーを追いかけにくいです。このへん、エラーに対してもう少し親切な作りになってるほうが嬉しいです。
それから、本当に勝ちにいくなら、連続自己対戦させるフレームワークを自作するのはたぶん必須。このへんの時間が結構かかるので、2週間だと十分作り込めない感じがしました。(普通、2週間、フルに時間が確保できるわけでもないので) 予選期間はもっともっと長くてもいいように思いました。
ゲーム性については、色々気付かされたことがあります。まだ予選期間中なので詳しくは書かないですが、当初、自分が生き残れる手順を一つでも見つければいいので、これはOR木の探索で、わりとどの手順でもいいと私は思っていました。ところが、実際やってみるとそうでもないような気がしました。
もちろん、将棋やチェスのように1手以外はすべて悪手という局面が結構あるほどの指し手の狭さではないのですが、OR木のわりに狭いなぁと。これは、相手が攻撃してくるからで、その攻撃に対して100%備えると指し手の幅が狭くなるのでこれは駄目なのですが、それでも(将棋で言うところの)1手詰み、みたいなのは(できれば100%)回避しなくてはなりません。右と左に移動できるけど、右に移動した場合、(移動させる石の手前か向こう側に石を落とされて)落石で死ぬ場合、これは原則的には左に移動すべきだと思います。(こういうのを狙ってくるプレイヤーに負けてレーティングを落とすわけにはいかないため)
分身などについても同様で、自分の移動先を予測されて、そこに敵分身を使われると即死します。そう考えると指し手がすこぶる狭くなってきます。ただし100%リスクを回避できるわけではないので、このときの死亡確率みたいなのを求めて、その死亡確率が低いほうを選択しつつ、ソウル(資源)はなるべく効率的に回収しなくてはなりません。このへんのバランスがとても難しいです。そして、この両方の条件をそれなりに満たそうと思ったとき、これは「どれでも1つ生き残れる手順を見つけられば良い」などという甘いものではなく、「すべての手順の組み合わせのなかで、死亡確率がそれなりに低くて、かつ資源が効率的に回収できる手順」を見つけなければなりません。
これは普通のOR木の探索とはずいぶん性質が違うんだなぁと。死亡確率を考慮せずに単に長いターン数だけ生き残れる手順を見つけるだけだとNormal AIには勝てても、うまく攻撃してくるようなAIには勝てないのではないか、みたいに思うのです。(私はまだそこまで作れていないので、単に私の予想かつ妄想です。)
ともかく、これだけのゲームなのに、この予選がたった2週間で終わってしまうのはすごく残念で、もっと長い期間かけて対戦サーバーとランキングが稼働していてもいいように思いました。あとサーバーで対戦したリプレイがブラウザなどで確認できると観戦して興味を持ってくれる人が増えるのになぁと思いました。(来年に期待してます!)
以上、CODE VS 5.0 途中経過その2でした。
え?死んでしまうのですか。死ぬ前に女の子とイチャイチャしたか・・・った・・・。ぐふ。
まぁ、冗談は置いといて。
屋根さん結構本気ではまってるんですね。
失礼ですが、お金にならないことは静観する主義だと思ってました。
良い成績が残せることをお祈り申し上げます。
> お金にならないことは静観する主義だと思ってました。
賢いAIを作るスキルが身につきますよ!長い目で見るとこれもお金になるのでは。
・分身を自分と敵が同時に使ったときにどうなるのか(正解 : その両方を犬が追いかける)
それ、わざわざ検証しました。
・分身を使った場所に岩を自分が移動させたり落とされたりした場合はどうなるのか(正解 : その分身はなかったことになる(?))
ルール詳細に書いてありますよ。
岩と分身の競合について
・「右の岩を押して左に戻る」という移動があったとして、このときこの岩の右の升に敵が岩を落とした場合、自分はどういう移動になるのか(正解 : 右に移動する行為がキャンセルされ、左に1升移動しようとする(移動できるなら))
言われれば確かにあいまいかも。
正解の動きしか頭にありませんでした。
・サーバーでAIを動かすときのサーバーのスペック(メモリ量、CPU等)
さあ?w
あと対戦させるフレームワークがJavaで作られていて、何か変な入力をしたときに「内部エラー」となってしまうのでエラーを追いかけにくいです。このへん、エラーに対してもう少し親切な作りになってるほうが嬉しいです。
内部エラーになったらもうやる気なくなります。
デバッグできないですし。(
魔法
3
移動
移動
なんてコマンド打ってたなんて言えない)
> ルール詳細に書いてありますよ。
> 岩と分身の競合について
その説明は3月1日に追加されたようですね。私が開始直後にダウンロードしたときのPDFには記述がありませんでした。PDF更新したときのアナウンスが(codevs5.jnlp立ち上げたときに)欲しかったり…。
あとサーバーのマシンスペックはさっきCODEVSの公式のツイッターアカウントを見ると、「非公開」という回答がありました。
なるほど。
内部エラーは変な入力の時「しか」起きないって気づきませんでした。
これに気付けるかどうかも競技のうち?
プログラマ癖として変な入力を与えるとどうなるかは真っ先に調べるような気も。たぶんtry〜catchみたいなので囲ってあるんでしょうね。ユーザーとしては、入力がおかしかったのはその旨、表示して欲しいのですけども。(どこも対戦クライアントの標準出力のところに表示されているのはJavaクライアント側でparse後のもので、元の出力ではないのは少し嫌らしい気も)
あと、HiretsuAIが内部エラーで落ちるのは、今日のアップデートで少しなおった気がします。