本文档用于基于windows系统Docker部署的CodeCombat,其他方式部署的可以作为参考。
如何打开命令行
找到Containers,选择安装的CodeCombat。

选择Exec,找到Open in external terminal。

绝大部分的操作都在此命令行中输入。

打开所有关卡
以下内容在命令行中完成。
进入mongo的coco数据库,即游戏数据库。
mongo
use coco
随后输入如下代码,给所有注册用户上帝模式和管理员权限。
db.users.updateMany({}, {$set: { permissions: ["godmode", "admin"] }})
随后输入如下代码,给所有注册用户无限钻石。
db.users.updateMany({},{$set: { gems: 99999,"earned.gems": 99999}})
将所有人的关卡数据重置
以下内容在命令行中完成。
同样在命令行中进入coco数据库。
mongo
use coco
然后输入如下命令,将所有人的关卡数据都设置为第一关。
db.level.sessions.deleteMany({})
解决不能读入关卡的问题
以下内容在用户界面中完成。
有一些关卡会出现不能读入关卡的问题,请选择重新选择英雄,将语言改为JAVASCRIPT即可。

弹出错误是因为游戏的原因,报错了。
方法1:更改编程语言(部分关卡不生效)
此时我们重新进入,随后在英雄选择界面,重新选择英雄。

在英雄选择界面,将语言改为JAVASCRIPT,即可开始游戏。

需要注意,JAVASCRIPT的注释是//,PYTHON代码的注释是#。

这一关卡完成后,再将语言改回为Python。
方法2: 修改数据库直接过关
因为方法1对某些关卡不起作用,我们可以使用方法2.
以下内容在命令行中完成。
同样在命令行中进入coco数据库。
mongo
use coco
然后输入如下命令,将所有人的关卡数据都跳过这一关。
注意:var targetLevelSlug = "the-one-wizard"; 这一行中,需要将关卡名称设置为需要跳过的关卡。关卡的名称在关卡打开后的链接中。

//定义想要批量通过的关卡 slug 列表
var targetLevelSlugs = [
"lost-in-the-stacks",
"pong-pong",
"ingredient-identification",
"the-one-wizard",
];
var totalCount = 0;
var allUsers = db.users.find({}).toArray();
targetLevelSlugs.forEach(function(slug) {
var levelData = db.levels.findOne({ "slug": slug }, { _id: 1, name: 1 });
if (!levelData) {
print("警告:找不到关卡 '" + slug + "',已跳过。");
return;
}
var levelCount = 0;
allUsers.forEach(function(user) {
var existingSession = db.getCollection('level.sessions').findOne({
"creator": user._id,
"levelID": slug
});
if (!existingSession) {
db.getCollection('level.sessions').insert({
"level": {
"original": levelData._id.valueOf().toString(),
"majorVersion": 0
},
"creator": user._id.valueOf().toString(),
"creatorName": user.name || user.slug,
"levelID": slug,
"levelName": levelData.name,
"state": {
"complete": true,
"topScores": [
{ "score": 10, "type": "time", "date": new Date() }
]
},
"codeLanguage": "javascript",
"code": {
"hero-placeholder": {
"plan": "// 系统自动完成记录 (" + slug + ")\nhero.moveRight();"
}
},
"playtime": 60,
"isForClassroom": false,
"created": new Date(),
"changed": new Date(),
"dateFirstCompleted": new Date(),
"permissions": [
{ "target": user._id.valueOf().toString(), "access": "owner" },
{ "target": "public", "access": "write" }
]
});
levelCount++;
totalCount++;
}
});
print("关卡 [" + levelData.name + "] 处理完成,新增 " + levelCount + " 条记录。");
});
print("全部操作结束!总共为 " + totalCount + " 个用户-关卡组合添加了通关记录。");// 设置你想批量通过的关卡 slug
var targetLevelSlug = "the-one-wizard";
// 找到该关卡的原始数据(获取其 original ID 和 名字)
var levelData = db.levels.findOne({ "slug": targetLevelSlug }, { _id: 1, name: 1 });
if (!levelData) {
print("错误:找不到该关卡,请检查 slug 是否正确");
} else {
// 获取所有用户(或者你可以增加查询条件,比如只给某个班级的学生 db.users.find({role: "student"}) )
var allUsers = db.users.find({});
var count = 0;
allUsers.forEach(function(user) {
// 检查该用户是否已经有过这一关的 session
var existingSession = db.getCollection('level.sessions').findOne({
"creator": user._id,
"levelID": targetLevelSlug
});
if (!existingSession) {
// 构造通关数据
db.getCollection('level.sessions').insert({
"level": {
"original": levelData._id.valueOf().toString(), // 关联关卡的ID
"majorVersion": 0
},
"creator": user._id.valueOf().toString(), // 关联用户ID
"creatorName": user.name || user.slug, // 用户名
"levelID": targetLevelSlug, // 关卡ID
"levelName": levelData.name, // 关卡显示名称
"state": {
"complete": true, // 核心:设置为已通关
"topScores": [
{ "score": 10, "type": "time", "date": new Date() }
]
},
"codeLanguage": "javascript", // 默认语言
"code": {
"hero-placeholder": {
"plan": "// 系统自动完成记录\nhero.moveRight();" // 填充一点伪造代码
}
},
"playtime": 60, // 伪造游玩时间(秒)
"isForClassroom": false,
"created": new Date(),
"changed": new Date(),
"dateFirstCompleted": new Date(), // 核心:设置完成时间
"permissions": [
{ "target": user._id.valueOf().toString(), "access": "owner" },
{ "target": "public", "access": "write" }
]
});
count++;
}
});
print("操作完成!成功为 " + count + " 个用户添加了通关记录。");
}
解决蜿蜒峡谷报错的问题
蜿蜒峡谷提交报错的问题。(类似问题一并解决)

问题原因
向服务器提交的 topScores 数组里有 null值,而系统只允许 object类型,清掉或避免写入即可。
打开命令行窗口。
在命令行中使用nano编辑/home/coco/codecombat/app/core/initialize.coffee文件。
nano /home/coco/codecombat/app/core/initialize.coffee
在打开的窗体最上方,粘贴如下内容,随后使用CTRL+O保存,回车Enter确认,再使用CTRL+X关闭文档。
do ->
sanitizeState = (state) ->
return {} unless state? and typeof state is 'object'
clean = {}
if state.complete?
clean.complete = !!state.complete
if state.topScores?
if Array.isArray(state.topScores)
clean.topScores = state.topScores.filter (x) ->
x? and typeof x is 'object'
else
clean.topScores = []
else
clean.topScores = []
clean
oldSend = XMLHttpRequest.prototype.send
XMLHttpRequest.prototype.send = (body) ->
try
if body and typeof body is 'string'
data = JSON.parse(body)
if data?.state?
data.state = sanitizeState(data.state)
body = JSON.stringify(data)
catch e
console.log "submit fix error", e
oldSend.call @, body
点击重启按钮,重启项目(容器)。

再次测试,如果还有一些错误,请清空用户关卡数据。
英雄选择报错
在选择英雄时,会有两个英雄无法选择,直接跳过选择这两个英雄即可。

其他资料
1ms docker数据源地址。
https://docker.1ms.run