Code.org常识问答APP点击chinaButton自动暂停且分数不更新求助
Code.org常识问答APP异常问题排查
我在Code.org开发的常识问答APP中,点击chinaButton时程序会自动暂停(表现与调试控制台手动暂停完全一致,未触发任何手动操作);通过调试控制台恢复运行后,分数仍无法更新。同班同学使用相似按钮代码无此问题,且调试控制台未显示任何错误信息。
相关代码
lives = 3; score = 0; onEvent("button1", "click", function() { if (getText("dropdown1") == "Easy Level") { setScreen("easyFlagScreen1"); } else if ((getText("dropdown1") == "Medium Level")) { setScreen("mediumFlagScreen1"); } else if ((getText("dropdown1") == "Hard Level")) { setScreen("hardFlagScreen1"); } else if ((getText("dropdown1") == "Master Level")) { setScreen("masterFlagScreen1"); } }); setScreen("startingScreen"); lives = 3; score = 0; setText("lives1", lives); setText("score1", score); //Easy Q1// onEvent("chinaButton", "click", function() { score = score + 1; setText("score1", score); setScreen("easyFlagScreen2"); setText("Lives2", lives); }); onEvent("japanButton", "click", function() { if (lives > 1) { setScreen("easyFlagScreen2"); lives = lives - 1; score = score; setText("lives2", lives); setText("score2", score); } else { setScreen("LoseScreen"); setText("Score15", score); } }); onEvent("southKoreaButton", "click", function() { if (lives > 1) { setScreen("easyFlagScreen2"); lives = lives - 1; score = score; setText("lives2", lives); setText("score2", score); } else { setScreen("LoseScreen"); setText("Score15", score); } }); onEvent("northKoreaButton", "click", function() { if (lives > 1) { setScreen("easyFlagScreen2"); lives = lives - 1; score = score; setText("lives2", lives); setText("score2", score); } else { setScreen("LoseScreen"); setText("Score15", score); } }); //Easy Q2// onEvent("usaButton", "click", function() { score = score + 1; setText("score3", score); setText("lives3", lives); }); onEvent("cubaButton", "click", function() { if (lives > 1) { setScreen("Wrong2"); lives = lives - 1; score = score; setText("lives3", lives); setText("score3", score); } else { setScreen("LoseScreen"); setText("Score15", score); } }); onEvent("mexicoButton", "click", function() { if (lives > 1) { setScreen("Wrong2"); lives = lives - 1; score = score; setText("lives3", lives); setText("score3", score); } else { setScreen("LoseScreen"); setText("Score15", score); } }); onEvent("canadaButton", "click", function() { if (lives > 1) { lives = lives - 1; score = score; setText("lives3", lives); setText("score3", score); } else { setScreen("LoseScreen"); setText("Score15", score); } });
问题分析及修复方案
1. 控件ID大小写不匹配(核心问题)
chinaButton的点击事件中,更新生命值时用了setText("Lives2", lives);,但其他错误按钮的事件里使用的是lives2(小写l)。Code.org的控件ID严格区分大小写,找不到对应控件会触发隐性异常,导致程序暂停。
同时,切换到easyFlagScreen2后,该屏幕的分数控件应为score2,但代码里更新的是score1(属于初始屏幕的控件),这会导致新屏幕的分数无法同步更新。
修复后的chinaButton事件代码:
onEvent("chinaButton", "click", function() { score = score + 1; setText("score2", score); // 更新对应屏幕的分数控件 setScreen("easyFlagScreen2"); setText("lives2", lives); // 修正控件ID大小写 });
2. 全局变量重复初始化
代码开头两次执行lives = 3; score = 0;,虽然不直接引发暂停,但可能导致变量状态混乱。建议删除开头的重复初始化,保留以下这段:
setScreen("startingScreen"); lives = 3; score = 0; setText("lives1", lives); setText("score1", score);
3. 隐性绑定异常排查
如果以上修复无效,尝试删除chinaButton的事件绑定,重新编写一次——Code.org的可视化编辑器偶尔会出现控件绑定的隐性异常,重新绑定可解决此类问题。
4. 调试验证技巧
在chinaButton事件中添加日志输出,确认代码执行流程:
onEvent("chinaButton", "click", function() { console.log("chinaButton触发,当前分数:" + score); score = score + 1; console.log("更新后分数:" + score); setText("score2", score); setScreen("easyFlagScreen2"); setText("lives2", lives); });
通过调试控制台的日志,可确认分数是否被正确修改,以及哪一步触发了程序暂停。
内容的提问来源于stack exchange,提问作者chxir
相关产品推荐
相关产品推荐

