You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动