2020-08-13
第31回の高専プロコン競技部門を勝手に創るオンライン会。APIサーバー、Javaのクライアント、C言語のクライアント、JavaScriptのクライアントとそれぞれ役割分担して開発中。(src on GitHub競技ルールの後半)


対戦している様子!・・・ただ、コアにバグがあるようで、途中青忍者が消失する現象あり。

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 KOSENSlackまでどうぞ!

Tweet
クリエイティブ・コモンズ・ライセンス
本ブログの記事や写真は「Creative Commons — CC BY 4.0」の下に提供します。記事内で紹介するプログラムや作品は、それぞれに記載されたライセンスを参照ください。
CC BY / @taisukef / アイコン画像 / プロフィール画像 / 「一日一創」画像 / RSS