需求文档
产品模型
核心概念
游戏(Game)、赛事(Contest)
「游戏」规定了游戏规则。
基于某个游戏可以创建相应的 base contest,有参赛选手等更多语境信息,是AI参与竞争的实际环境。
「游戏」和「赛事」各包含一个 base contest 用于举办赛事。赛事 是独立的正式赛事,而 游戏 中的内置 base contest 是「游戏」的一部分,不应被用来举办一场独立的赛事。如果只是想举办一场一次性赛事的话,一般可以直接禁用游戏的内置 base contest,这样就不需要为这场 base contest 上传 SDK、赛事脚本之类的东西。
新建赛事时,可选择:
- 使用某个已有游戏
- 从零开始新建游戏
AI
「AI」是选手根据「游戏」的游戏逻辑、在「赛事」限定的SDK下开发,提交到「赛事」参与与其他AI竞争的程序,附属于「赛事」。
选手可选择自己某一版本的AI,将其设为「出战AI」。
对局(Match)
「对局」附属于「赛事」。在一场「对局」中,特定的「AI」竞争出一个结果,从而影响相应「选手」在本场「赛事」中的排名、能否继续比赛等情况。
分为平台「自动生成的对局」与用户「手动生成的对局」,用户「手动生成的对局」拥有更高的优先级。
用户(User)
用户身份在「平台」与「单个游戏/赛事」两种层面上划分。
平台层面
- 普通用户。没有创建或删除游戏/赛事的权限,但可以参与赛事。
- 超级管理员(超管)。拥有最高权限,可以执行任何需要的操作。拥有此权限的人应当也有权直接操作平台后端,设置此权限只是为了方便操作。
- 有且仅有一个,在部署平台时配置超级管理员的密码。不能通过注册得到。
- 固定用户名为admin。
- 有且仅有一个,在部署平台时配置超级管理员的密码。不能通过注册得到。
为了减轻超管的工作量,超管可以为某些值得信任的用户分配「创建游戏、赛事」的权限,但这些用户仍然不能修改或删除非自己创建的游戏/赛事。
普通用户若想创建游戏/赛事,可联系超管或其他有创建权限的用户,让他们创建一个游戏/赛事之后将该游戏/赛事的管理员权限转交给自己。
单个游戏/赛事层面
- 选手。负责提交AI、将AI派遣出战。
- 管理员(局部管理员):可以任意修改所管理的游戏/赛事。
某个游戏/赛事的创建者会自动获得该游戏/赛事的管理员权限。可以将其他用户添加为管理员,也可以自己主动放弃管理员权限。
没有管理员的游戏/赛事将会被删除。
功能需求
高优先级
用户系统
- 用户注册、登录
- 找回密码
- 查看用户信息
- 查看用户基本信息
- 查看用户参赛情况
- 修改自身用户信息
- 修改昵称
- 填写实名信息,以便颁奖
- 鉴权。能判断用户是否有执行所请求的操作的权限。
base contest
- 介绍(readme) tab
- Markdown
- 对局(matches) tab
- 全部对局的界面,显示对局的基本信息
- 参与对局的各玩家信息。
- 该玩家对应的AI与选手
- 得分(score)
- 对局状态。
- 标签(label)。
- 参与对局的各玩家信息。
- 可点击进入对局详情页面
- 全部对局的界面,显示对局的基本信息
- 排行榜(ranklist) tab
- 显示派遣了AI的选手与相应AI的一些信息,并按分数倒序排序。
- 提交列表(submissions) tab
- 显示所有提交AI的记录
- 我的(my) tab
- 提交AI程序到当前赛事。以单文件形式。
- 可以给AI添加/修改备注。
- 查看AI代码的构建状态。AI的信息界面里会有更详细的信息。
- 将某个accepted的AI指定为出战AI。
- 允许下载自己的AI代码。
- 设置(settings) tab
- 拥有该赛事的管理员权限才能访问。
- 添加赛事管理员、放弃赛事管理员权限、删除赛事。应有警告确认。
- 上传各种赛事文件
- 每种语言的 SDK(单文件,但可以用压缩包) 与 构建环境、运行环境 定义(Dockerfile)。
- 赛事脚本(JavaScript)。可以控制整场赛事。重新提交赛事脚本后,应重置赛事脚本的运行环境。
- 修改赛事状态
- 启用/禁用提交AI
- 启用/禁用修改出战AI
- 启用/禁用公开对局&赛事脚本环境
游戏(game)
- 创建游戏
- 设置(settings) tab
- 拥有该游戏的管理员权限才能访问。
- 添加游戏管理员、放弃游戏管理员权限、删除游戏。应有警告确认。
- 含内置赛事的待配置内容。
- 上传各种游戏文件
- 游戏逻辑(单文件,但可以用压缩包)与 构建环境、运行环境 定义(Dockerfile)。
- 对局详情模板(HTML)。
- 对局详情辅助文件(压缩包)。与对局详情模板配套使用,其中内容可在对局详情模板中调用。
- 可选的:每种语言的 SDK(单文件,但可以用压缩包) 与 构建环境、运行环境 定义(Dockerfile)。会被赛事继承。
赛事(contest)
- 基于游戏创建赛事
- 默认继承了游戏内置赛事的可用SDK,但赛事管理员也可自行修改。
- 相比base contest,多了「报名」的功能。于是权限分三等:
- admin。管理员,可以控制赛事的进行。
- registered。报名了的用户,可以参与赛事。报名支持密码。
- unregistered。未报名的用户,只能读取赛事信息。
- 设置(settings) tab
- 报名
- 启用/禁用报名,设置报名密码(可选)。
- 报名
对局
- 完成对局
- 输出比分、回放数据、日志
- 允许输入对局定制信息。如随机种子,乃至更直接的定制。能够在赛事脚本中使用。
示例
为用户提供各种需提交文件的示例
- 游戏
- 一个简易游戏,如井字棋/四子棋。
- 提供一些标准化的对局详情模板,如"只提供回放文件下载不含播放器"的模板。
- 赛事
- 示例赛事脚本。
中优先级
赛事(选手):「房间」功能(私下对局)
允许"创建房间"对战。通过房间发起的对局(私下对局)不计分,也不会被列入对局列表(公开对局)。
- 指定参与房间对战的AI编号即可创建私下对局。
- 该对局为用户手动创建,其优先级应比自动触发的对局更高。
- 「对局」tab中不能看到私下对局,但能够在「房间」tab中查看。
- 允许在支持手动按顺序从列表中选取提交,生成对局。选手只能生成私下对局,管理员可选择生成私下对局或公开对局。
赛事(选手):「测试」功能
- 指定参与测试的AI(根据游戏内的AI id)
- 构建出所需的游戏场景。能够用JSON定制场景,并指定最长模拟时长。
- 结束测试,得到测试对局的回放数据、比分、日志。
平台不保存测试对局的信息。
赛事(管理员):更多状态控制
- 启用/禁用私下对局
- 启用/禁用测试对局
- 打包的按钮:
- 不活跃:启用提交AI、私下对局、测试对局,其他禁用。
赛事(管理员):赛事脚本日志
允许赛事管理员查看赛事脚本的输出与报错信息,以便调试。
效果参考 Botany。
健壮性:用户占用评测机的时间额度
每个用户每日占用评测机有时间限额,发起私下对局、测试对局会消耗额度。
健壮性:赛事脚本
严格限制赛事脚本造成破坏性结果,挤占平台的计算资源。
不妨且简单粗暴地设置一个极为严格的对局数量限制(待运行的对局的数量 / 一定时间内发起对局的数量)?毕竟这已经比Saiblo宽松很多了,赛事可自行把大量对局分散到不同时间点运行。
低优先级
赛事(管理员):允许直接在赛制脚本环境执行JS代码
允许赛事管理员更直接快捷地管理赛事。
用户存储空间
允许用户上传一些文件供其AI程序调用。