WARNING您的浏览器窗口宽度不足,您可以缩小页面或切换至横屏来获取更好的浏览体验。
CCXC是个非常好的PuzzleHunt后台引擎,这篇文章会教学如何从搭建完成到举办hunt,当然您也可以查看:官方部署文档
如果您还没开始部署,请参阅:

劝退提醒!前排提醒,ccxc的设计非常精妙,对于普通hunt需要定制很多的内容,如果你要办hunt但是精力不足建议使用P&KU Website.同时我有空的话也可以找我免费帮忙(仅限非期末周,期末周太忙了心有余而力不足TAT)
注:如果时间紧迫,(根据本人体验主观排名)部署容易度&速度 公众号>P&KU Website>CCXC;
相对的,体验效果上CCXC会更好。
基础知识
首先,和P&KU Website不同,ccxc的前端是基于Vue3的,如果你只是想出一些静态的题目,完全不需要学习Vue3,你只需要学会Markdown和HTML的任意一种(推荐优先学习HTML);但是如果你想出一些不错的交互题型,Vue是你绕不开的一部分,这也就意味着你需要学习Vue3。
如果你只是想出静态题,那么接下来的教程对你来说用处不大,你只需要看得懂puzzle前端对于题目美术素材的配置,这就足够了。
后端脚本
CCXC 后端脚本系统提供了一套强大且灵活的 API 接口,让开发者能够构建复杂的交互式题目和自定义判题逻辑。
后端脚本分为两种类型,一种是判题函数,可以用来实现自定义判题结果,另一种是题目后端,用于实现题目内容的动态交互。如果有大量的内容需要交互,这套接口的性能是不足的,请参考(尚未编写)后端插件开发章节。
如下是一个非常简单的后端脚本示例,它不接收参数,只判断当前服务器时间是否达到指定时间,然后返回True或者False。通过(下文会提到)Vue SFC API,我们便可以通过let isOK = await backend("check-time",{})获取到服务器时间是否达到2025-12-31 23:59:59。
// key: check-time
// @ts-check
// ========== 服务端 main 函数 ==========
function main() {
const targetDateTime = new Date(2025, 11, 31, 23, 59, 59);
const now = new Date();
return (now > targetDateTime);
}
//=======以下是JSON解析与调用脚本,一般不需要修改========
/**
* @param {Ctx} ctx 全局上下文对象
*/
function _jsonProcessHelper(ctx) {
let request = JSON.parse(ctx.request);
request = request;
let resBody = main();
let resString = JSON.stringify(resBody);
ctx.response(resString);
}
_jsonProcessHelper(ctx);
一般来说,我们只需要修改main函数,让它返回一些别的object,来实现我们自己的功能。当然,服务端是C#写的,所以js跑在Jurassic环境里面,有一些函数是运行不了的。好消息是一般来说用js能实现的判定它都能实现。这一部分在官方文档里已经写的相当详细了,这里就只提一些官方文档没有说明的API。这些API仅存在于题目后端脚本环境中。
httpPostForm
直接调用HttpRequest.PostForm进行表单POST,适用于需要外部查询但是有CORS限制
ctx.httpPostForm(string url, Object form, Object headers)hasPuzzleFinished
检查一个题目对于当前队伍是否已被通过,参数是题目id,需要在后台题目管理查看。返回布尔值。
ctx.hasPuzzleFinished(int pid)getCheckCount
获取队伍的作答情况,参数是题目id,需要在后台题目管理查看。返回字典。
ctx.hasPuzzleFinished(int pid)返回值:
{
"count":0, // 各题目的答案提交次数
"additionalCount":0 // 已购买的额外题目回答次数
}ctx.saveData
直接取得原始存档数据。
VUE SFC API
通过 Vue 依赖注入 (inject) 提供的渲染器核心功能。
这个功能就是给Vue题目使用的调用接口了。你可以通过编辑puzzle前端/src/components/puzzleVue/puzzleVuePlugin.ts来添加更多的功能。官方文档已经解释的很清楚了,快去看看吧。(看不懂的话建议先学习Vue入门)
(未完待续)