対戦している様子!・・・ただ、コアにバグがあるようで、途中青忍者が消失する現象あり。
JavaScriptのクライアント、クラスを作って整理。デタラメに置いてデタラメに動くAIプログラムはこんな感じに書けます。(src on GitHub)
import { KakomimasuClient, Action, DIR } from "./KakomimasuClient.js" import util from "../util.js"; const kc = new KakomimasuClient("a3", "デタラメ", "サンプル", "a3-pw" ); let info = await kc.waitMatching(); const pno = kc.getPlayerNumber(); const nagents = kc.getAgentCount(); const points = kc.getPoints(); // ポイントの高い順ソート const pntall = []; for (let i = 0; i < points.length; i++) { for (let j = 0; j < points[i].length; j++) { pntall.push({ x: j, y: i, point: points[i][j] }); } } const pntsorted = pntall.sort((a, b) => b.point - a.point); info = await kc.waitStart(); // スタート時間待ち while (info) { // ランダムにずらしつつ置けるだけおく // 置いたものはランダムに8方向動かす const actions = []; const offset = util.rnd(nagents); for (let i = 0; i < nagents; i++) { const agent = info.players[pno].agents[i]; console.log(pno, agent); if (agent.x === -1) { // 置く前? const p = pntsorted[i + offset]; actions.push(new Action(i, "PUT", p.x, p.y)); } else { const [dx, dy] = DIR[util.rnd(8)]; actions.push(new Action(i, "MOVE", agent.x + dx, agent.y + dy)); } } kc.setActions(actions); info = await kc.waitNextTurn(); }
一歩進めて、周りの点数の高いところから狙っていき、壁破壊も行うAIにしたものがこちら。(src on GitHub)
const dirall = []; for (const [dx, dy] of DIR) { const x = agent.x + dx; const y = agent.y + dy; if (x >= 0 && x < w && y >= 0 && y < h && checkFree(x, y)) { const f = field[y][x]; if (f.type === 0 && f.pid !== -1 && f.pid !== pno) { // 敵土地、おいしい! dirall.push({ x, y, type: f.type, pid: f.pid, point: f.point + 10 }); } else if (f.type === 0 && f.pid === -1) { // 空き土地優先 dirall.push({ x, y, type: f.type, pid: f.pid, point: f.point + 5 }); } else if (f.type === 1 && f.pid !== pno) { // 敵壁 dirall.push({ x, y, type: f.type, pid: f.pid, point: f.point }); } } } if (dirall.length > 0) { sortByPoint(dirall); const p = dirall[0]; if (p.type === 0 || p.pid === -1) { actions.push(new Action(i, "MOVE", p.x, p.y)); poschk.push({ x: p.x, y: p.y }); poschk.push({ x: agent.x, y: agent.y }); // 動けなかった時用 } else { actions.push(new Action(i, "REMOVE", p.x, p.y)); poschk.push({ x: agent.x, y: agent.y }); } } else { // 周りが全部埋まっていたらランダムに動く
圧勝!・・・おや、フィールドに忍者がいる!?コアのバグ修正が必要です。
何か気づいたことがあれば、Issuesまで、お寄せください。
C言語版クライアントのサンプル、Windowsで動かなかったのを修正。Windowsでは標準のスタック領域が1Mbyteしかないようで、メモリ確保できずに落ちてしまうことが判明。ヒープ領域を使う malloc/free を使うよう、変更(src on GitHub)。 ただ、JSONのパースなど、もうひと手間必要なので、手っ取り早くAIプログラミングにチャレンジしたい人は、JavaScript版かJava版がオススメです。
次回、8/20(木)20:00〜に、練習試合します!
Code for KOSENのSlackまでどうぞ!