跳转至

需求文档

产品模型

核心概念

游戏(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中查看。
  • 允许在支持手动按顺序从列表中选取提交,生成对局。选手只能生成私下对局,管理员可选择生成私下对局或公开对局。

赛事(选手):「测试」功能

  1. 指定参与测试的AI(根据游戏内的AI id)
  2. 构建出所需的游戏场景。能够用JSON定制场景,并指定最长模拟时长。
  3. 结束测试,得到测试对局的回放数据、比分、日志。

平台不保存测试对局的信息。

赛事(管理员):更多状态控制

  • 启用/禁用私下对局
  • 启用/禁用测试对局
  • 打包的按钮:
    • 不活跃:启用提交AI、私下对局、测试对局,其他禁用。

赛事(管理员):赛事脚本日志

允许赛事管理员查看赛事脚本的输出与报错信息,以便调试。

效果参考 Botany。

健壮性:用户占用评测机的时间额度

每个用户每日占用评测机有时间限额,发起私下对局、测试对局会消耗额度。

健壮性:赛事脚本

严格限制赛事脚本造成破坏性结果,挤占平台的计算资源。

不妨且简单粗暴地设置一个极为严格的对局数量限制(待运行的对局的数量 / 一定时间内发起对局的数量)?毕竟这已经比Saiblo宽松很多了,赛事可自行把大量对局分散到不同时间点运行。

低优先级

赛事(管理员):允许直接在赛制脚本环境执行JS代码

允许赛事管理员更直接快捷地管理赛事。

用户存储空间

允许用户上传一些文件供其AI程序调用。