Windows系统Docker部署CodeCombat常见问题汇总

说明

本文档用于基于windows系统Docker部署的CodeCombat,其他方式部署的可以作为参考。

如何打开命令行

找到Containers,选择安装的CodeCombat。

image-20260403162824061

选择Exec,找到Open in external terminal

image-20260403162940733

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

image-20260403163852903

打开所有关卡

以下内容在命令行中完成。

进入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即可。

img

弹出错误是因为游戏的原因,报错了。

方法1:更改编程语言(部分关卡不生效)

此时我们重新进入,随后在英雄选择界面,重新选择英雄。

image-20260402173625131

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

image-20260402173710589

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

image-20260402174057841

这一关卡完成后,再将语言改回为Python。

方法2: 修改数据库直接过关

因为方法1对某些关卡不起作用,我们可以使用方法2.

以下内容在命令行中完成。

同样在命令行中进入coco数据库。

mongo
use coco

然后输入如下命令,将所有人的关卡数据都跳过这一关。

注意:var targetLevelSlug = "the-one-wizard"; 这一行中,需要将关卡名称设置为需要跳过的关卡。关卡的名称在关卡打开后的链接中。

image-20260402174057841

 

//定义想要批量通过的关卡 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 + " 个用户添加了通关记录。");
}

解决蜿蜒峡谷报错的问题

蜿蜒峡谷提交报错的问题。(类似问题一并解决)

image-20260403164337050

问题原因

向服务器提交的 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

点击重启按钮,重启项目(容器)。

image-20260407115703084

再次测试,如果还有一些错误,请清空用户关卡数据。

英雄选择报错

在选择英雄时,会有两个英雄无法选择,直接跳过选择这两个英雄即可。

image-20260407143031836

其他资料

1ms docker数据源地址。

https://docker.1ms.run
文章目录