/mogemberman

モゲンバーマン

Primary LanguageCommon Lisp

mogemberman

モゲンバーマン
readme改良中

実行にはOpenGLが必要です。

  • 勝敗の決定

最後まで生き残ったプレイヤーの勝ちです。 1000ターン経っても勝負が付かない場合、置いた爆弾の総数で勝敗を決めます。 大会は4人対戦で先に3勝した人の勝ちというルールでやろうと思いますが、 参加人数によって変えるかもしれません。

  • AIの作り方

AIプログラムとサーバは標準入出力でやりとりをします。 文字エンコーディングはUTF-8です。 AIプログラムは最初に名前を出力します。次にIDを受け取ります。 以降はマップデータを受け取り、アクションの出力を繰り返します。

ひたすら上に移動するAIの疑似コード

println "テストAI"
id = readline()
loop {
  mapData = readLine()
  println "UP,false"
}  
  • 出来上がったAIを実際にゲームサーバで動かすには

ai.txtに実行コマンドを記入すればゲームサーバ上で動きます。 例えば実行コマンドがruby ai.rbの場合ruby ai.rbです AIが4対登録されていない場合はあなたがキーボードで操作できる キャラクターが追加されます。矢印キーで移動し、zキーで 爆弾を置けます。

  • 入出力データの詳細

AIが出力するアクションは"移動方向,爆弾を置くかどうか"という文字列です。 移動方向は "UP" "DOWN" "RIGHT" "LEFT" "STAY"のいずれかです。 サンプル println "UP,true"; //爆弾を起き上に移動 println "STAY,false"; // 何もしない println "DOWN,false" // 下に移動

マップデータは前のターンが終了した時点でのマップデータをJSON化したものです。 Turn 143 ■■■■■■■■■■■■■■■
■敵 □□ □ □□る ■
■ ■□■□■□■ ■ ■ ■
■□□□□□□ □ □□□■
■□■□■□■□■ ■□■□■
■ □□□ □□□□□□□ ■
■□■□■□■□■□■ ■ ■
■ □ □□□□□□□□ □■
■ ■ ■ ■□■ ■□■□■
■ あ□□□□■
■ ■ ■弾■ ■火■□■□■
■ 火火火火火□□■
■ ■ ■ ■●■火■□■ ■
■ 力□□□ □ ■
■■■■■■■■■■■■■■■

上記のデータをJSON化すると以下になります。 {"turn":143, "walls":[[0,0],[0,1],[0,2],[0,3],[0,4],[0,5],[0,6],[0,7],[0,8],[0,9],[0,10],[0,11],[0,12],[0,13],[0,14],[1,0],[1,14],[2,0],[2,2],[2,4],[2,6],[2,8],[2,10],[2,12],[2,14],[3,0],[3,14],[4,0],[4,2],[4,4],[4,6],[4,8],[4,10],[4,12],[4,14],[5,0],[5,14],[6,0],[6,2],[6,4],[6,6],[6,8],[6,10],[6,12],[6,14],[7,0],[7,14],[8,0],[8,2],[8,4],[8,6],[8,8],[8,10],[8,12],[8,14],[9,0],[9,14],[10,0],[10,2],[10,4],[10,6],[10,8],[10,10],[10,12],[10,14],[11,0],[11,14],[12,0],[12,2],[12,4],[12,6],[12,8],[12,10],[12,12],[12,14],[13,0],[13,14],[14,0],[14,1],[14,2],[14,3],[14,4],[14,5],[14,6],[14,7],[14,8],[14,9],[14,10],[14,11],[14,12],[14,13],[14,14]],

"blocks":[[11,12],[2,3],[13,4],[7,6],[4,1],[8,3],[3,4],[13,10],[6,7],[11,3],[11,9],[1,4],[1,3],[5,4],[4,3],[6,3],[6,1],[13,11],[3,2],[10,7],[10,9],[10,1],[13,9],[3,5],[12,5],[3,1],[2,5],[12,9],[5,3],[5,7],[9,7],[8,13],[9,6],[13,7],[4,7],[3,6],[11,4],[7,7],[5,6],[6,5],[3,3],[11,10],[5,2],[6,13],[12,11],[8,5],[7,5],[7,2],[11,8],[9,5],[13,8],[1,6],[11,13],[11,5],[7,8],[11,7],[8,7],[12,3],[10,5],[7,13],[7,4],[4,5],[13,3],[2,7],[11,1]],

"players":[{"id":0,"name":"敵","pos":{"x":1,"y":1},"power":2,"setBombLimit":2,"isAlive":true,"setBombCount":0},{"id":1,"name":"あなた","pos":{"x":9,"y":9},"power":2,"setBombLimit":3,"isAlive":true,"setBombCount":1},{"id":2,"name":"る","pos":{"x":12,"y":1},"power":2,"setBombLimit":2,"isAlive":true,"setBombCount":0}],

"bombs":[{"pos":{"x":7,"y":12},"timer":3,"power":2}], "items":[{"pos":{"x":5,"y":13},"name":"力"},{"pos":{"x":5,"y":10},"name":"弾"}], "fires":[[9,11],[9,10],[9,12],[8,11],[7,11],[10,11],[11,11]]}

wallsは壊れない壁,blocksは壊れる壁です。 要素はそれぞれの位置のx座標、y座標です。

playersについて {"id":1,"name":"あなた","pos":{"x":9,"y":9},"power":2,"setBombLimit":3,"isAlive":true,"setBombCount":1} powerは爆弾の火力です。2の場合、爆弾を中心に2マス火が伸びます。 setBombLimitは同時における爆弾の数です。 setBombCountは現在おいている爆弾の数です。

bombsについて {"pos":{"x":7,"y":12},"timer":3,"power":2} posは爆弾の座標です。 timerは爆発するまでの残り時間です。 毎ターン1ずつ減り、0になったターンに爆発します。 powerは火力です。

itemsについて {"pos":{"x":5,"y":13},"name":"力"} posはアイテムの座標です。 力アイテムを取るとプレイヤーのpowerが1増えます。 弾アイテムを取るとプレイヤーのsetBombLimitが1増えます。

firesについて 火の座標です。 プレイヤーがこの座標にいた場合死にます。