一句话:让写好的“蛇”自己上场打架,打完能看回放、能排名次。你不用会打游戏,只看它们打得对不对。
每一轮按名次给分:第 1 名 3 分、第 2 名 2 分、第 3 名 1 分、第 4 名 0 分。一场两轮加起来是这场的得分,榜单上的「名次分」是每场平均。
这是 demo 阶段的简化算法。正式版会换成多人混战专用的评分模型,榜上展示的是保守分(实力估计值减去三倍不确定度)——打得少的新人不会因为一次运气好就冲到第一。
往机器上的 ~/work/game-arena/demo/strategies/ 目录丢一个 .mjs 文件就行,不用改任何代码、不用重启,下一场自动带上它。
// 文件名就是它的代号,比如 mysnake.mjs
export const meta = { name: "我的蛇", author: "松松" };
export default function onTick(s) {
// s 里能看到的东西:
// s.turn 当前第几回合
// s.board { w: 11, h: 11 } 棋盘大小
// s.you { head:{x,y}, body:[...], health, length } 你自己
// s.others 场上其他还活着的蛇,结构同上
// s.food [{x,y}, ...] 所有食物
// 返回四个字符串之一:
return "up"; // "up" | "down" | "left" | "right"
}
坐标是左下角为原点,up 是 y 增大的方向。返回了非法值不会崩,引擎会让它沿用上一回合的方向继续走。
现成的四个可以直接抄着改:greedy.mjs(朝最近的食物走,但先看有没有活路)、hunter.mjs(比对手长就贴上去撞头)、survivor.mjs(不抢食物,只挑空间大的方向)、wanderer.mjs(在安全方向里瞎挑一个,故意做弱当陪练)。
都是明知道要做、这一版先没做的:
正式版这些会一条条换掉,换法写在仓库的 demo/README.md 里。