You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Processing中循环内用if语句异常:第二行圆圈不显示且程序卡顿

问题分析与修复方案

嘿,我看到你遇到的问题了——第二行圆圈不显示还卡顿,核心问题出在for循环里的逻辑错误导致无限循环,还有绘制多行圆圈的思路不对。咱们一步步来理清楚:

为什么会卡顿?

你在for循环里写了if(ScoreX + i * 80 > width)时重置i=0,这直接导致循环永远停不下来:每次i刚要增加到触发条件的值,就被拉回0,永远满足不了i < counter的退出条件,程序自然就卡死了。

为什么第二行不显示?

就算没卡死,原来的逻辑也只会重复画第二行的第一个圆圈,没法根据counter的数量依次在第二行累加绘制,完全没处理“counter超过第一行容量后,后续的圆圈放到第二行”的逻辑。

修复后的代码

我调整了逻辑,先计算每行能放多少个圆圈,然后根据counter的数值,把每个圆圈分配到对应的行和列:

float BallY = 50; // y value of the ball
float BallX = 260; // x value of the ball
float ScoreX = 52;
float ScoreY = 40;
int counter;
// 新增:定义每行最多能放的圆圈数量
int circlesPerRow;

void setup() {
  size(512, 348); //width and height of screen
  counter = 0;
  // 自动计算每行可容纳的圆圈数,适配不同屏幕宽度
  circlesPerRow = 0;
  while(ScoreX + circlesPerRow * 80 <= width) {
    circlesPerRow++;
  }
}

void draw() {
  frameRate(60); // 600帧太高没必要,改成60既流畅又省性能
  background(255);
  fill(0);
  
  // 绘制下落的小球
  ellipse(BallX, BallY, 15, 15);
  BallY++;
  
  // 小球超出屏幕时重置位置并计数
  if (BallY > height) {
    BallY = 0;
    counter++;
  }
  
  // 绘制分数圆圈:按行分配
  for (int k = 0; k < counter; k++) {
    // 计算当前圆圈所在的行和列
    int row = k / circlesPerRow;
    int col = k % circlesPerRow;
    // 计算坐标:行间距40,第一行40,第二行80以此类推
    float circleX = ScoreX + col * 80;
    float circleY = ScoreY + row * 40;
    // 绘制圆圈
    ellipse(circleX, circleY, 40, 40);
  }
}

关键修改点

  • 移除循环内重置i的逻辑:彻底解决无限循环问题,改用数学计算分配行和列,这是最核心的修复。
  • 自动计算每行容量:新增circlesPerRow变量,不用硬编码数值,能适配不同屏幕宽度。
  • 优化帧率:从600降到60,避免不必要的性能浪费。
  • 多行分配逻辑:用k / circlesPerRow计算行号,k % circlesPerRow计算列号,counter每增加1,就会依次在当前行的下一列、下一行的第一列绘制圆圈,完全符合你的需求。

这样修改后,程序就不会卡顿,而且当第一行圆圈满了之后,会自动在第二行开始绘制,完美解决你的问题~

内容的提问来源于stack exchange,提问作者Utsav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:40:44