Color Game:计数器循环未执行问题求助
帮你排查计数器循环的问题
嘿,我来帮你拆解这段代码里的问题——你说的score1>=10时不触发失败文本的情况,主要是几个逻辑和作用域的问题导致的,咱们一步步来理清楚:
首先看你的代码片段
void draw () { int name=5, strikes=1; int [][] scores= new int [name][strikes]; int score1=0; keyPressed(); { for (int x=0; x<10; x++) { first(); if (key == 'r' || key == 'R') { secoend(); // 这里应该是second()的拼写错误? } if (key != 'r' || key != 'R') { score1++; } else if (score1>=10) { background(255); String text="You Lost the Game"; text(text, 411, 90); } } } }
核心问题分析
1. 逻辑判断的致命错误
你写的if (key != 'r' || key != 'R')这个条件永远为真!因为一个字符不可能同时等于'r'和'R',不管用户按什么键,这个条件都会成立,所以score1++会一直执行,而后面的else if永远不会被触发——因为else的前提是前面的if条件不成立,但前面的if永远成立,所以失败文本的代码永远跑不到。
正确的逻辑应该是:当用户没有按'r'或'R'的时候,才让score1增加,所以条件要改成&&(逻辑与):
if (key != 'r' && key != 'R') { score1++; }
2. score1的作用域错误
在Processing里,draw()函数是每秒自动执行几十次的循环。而你把int score1=0;放在draw()内部,这意味着每次draw运行时,score1都会被重置为0,永远积累不到10。
你需要把score1定义在draw()外面,作为全局变量,这样它的值才能在多次draw调用之间保留:
int score1 = 0; // 全局变量,放在所有函数外面 void draw () { // ... 其他代码,不要再重新定义score1 }
3. 失败判断的位置不对
就算前面的问题都改了,你现在把score1>=10的判断放在else if里,只有当用户按了'r'/'R'的时候才会检查,但这时候score1不会增加,所以还是触发不了。
应该把这个判断单独拿出来,每次score1变化后都检查,或者在循环的末尾检查:
// 比如在score1++之后或者循环外面判断 if (score1 >= 10) { background(255); text("You Lost the Game", 411, 90); noLoop(); // 可以加这个停止draw循环,避免重复显示 }
4. 额外的小问题
secoend()应该是second()的拼写错误,注意修正;draw()里的for循环会在每次draw调用时跑10次,这会让score1增长得非常快,可能不是你想要的节奏——如果是想每次draw只检查一次按键,应该去掉这个for循环,或者调整逻辑。
修正后的示例代码
int score1 = 0; // 全局变量,保存分数 void draw () { int name=5, strikes=1; int [][] scores= new int [name][strikes]; first(); if (key == 'r' || key == 'R') { second(); // 修正拼写 } else { // 没按R的时候,分数增加 score1++; } // 单独检查失败条件,每次draw都判断 if (score1 >= 10) { background(255); text("You Lost the Game", 411, 90); noLoop(); // 停止循环,避免重复渲染 } }
这样修改后,当score1积累到10的时候,就会正常显示失败文本啦。
内容的提问来源于stack exchange,提问作者Hamzah Osman




