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

Processing 3(Java)中数组元素未正常使用问题排查

问题分析与解决方案

嘿,我仔细瞅了你的代码,发现你说的“最后一个矩形在(0,0)”其实是个小误会——真正没被正确赋值的是第一个数组元素(rx[0], ry[0]),你大概率是把它当成了最后一个索引19的矩形。核心问题出在循环的执行顺序和条件上:

具体问题

  1. 循环顺序搞反了:你现在是先执行i++再给数组赋值,初始i=0时,第一次进入if(i<19)后直接把i变成1,所以第一个被赋值的是rx[1]和ry[1],而rx[0]和ry[0]始终保持int数组的默认值0,导致第一个矩形显示在(0,0)。
  2. 循环条件不匹配需求:你需要生成20个矩形,但i<19的条件只能让循环执行19次(从i=0到i=18),虽然最后会给rx[19]赋值,但总共只生成了19个有效坐标,加上未初始化的rx[0]才凑够20个,第一个完全是无效的默认值。

修复方案

调整循环逻辑,先赋值再递增i,同时把循环条件改成i<20,确保20个数组元素(索引0到19)都能被正确赋值。另外,你可以用一个循环代替重复写20次rect(),让代码清爽很多。

修改后的完整代码

int gx = 400; 
int gy = 400; 
int gDir; 
int gCheckX; 
int gCheckY; 
int[] rx = new int[20]; 
int[] ry = new int[20]; 
int i = 0; 

void setup() { 
  size(700, 700); 
} 

void draw() { 
  fill(0); 
  rect(0, 0, width, height); 
  fill(#696969); 

  if(i < 20) { 
    // 先处理方向与碰撞检测
    gDir = int(random(1, 5)); 
    if(gDir == 1) { 
      gCheckX = 25; 
      gCheckY = -25; 
    } 
    if(gDir == 2) { 
      gCheckX = 25; 
      gCheckY = 75; 
    } 
    if(gDir == 3) { 
      gCheckX = -25; 
      gCheckY = 25; 
    } 
    if(gDir == 4) { 
      gCheckX = 75; 
      gCheckY = 25; 
    } 

    while(get(gCheckX, gCheckY) == color(105, 105, 105)) { 
      gDir = int(random(1, 5)); 
      if(gDir == 1) { 
        gCheckX = 25; 
        gCheckY = -25; 
      } 
      if(gDir == 2) { 
        gCheckX = 25; 
        gCheckY = 75; 
      } 
      if(gDir == 3) { 
        gCheckX = -25; 
        gCheckY = 25; 
      } 
      if(gDir == 4) { 
        gCheckX = 75; 
        gCheckY = 25; 
      } 
    } 

    // 更新当前坐标
    if(gDir == 1) {gy -= 50;} 
    if(gDir == 2) {gy += 50;} 
    if(gDir == 3) {gx -= 50;} 
    if(gDir == 4) {gx += 50;} 

    // 先给当前索引赋值
    rx[i] = gx; 
    ry[i] = gy; 
    println(rx[i] + " " + ry[i]); 

    // 最后递增索引
    i++; 
  } else { 
    // 用循环简化绘制,不用写20次rect
    for(int j = 0; j < 20; j++){
      rect(rx[j], ry[j], 50, 50); 
    }
    // 绘制完成后停止循环,避免重复渲染
    noLoop();
  } 
}

额外小优化

  • 加入noLoop()可以在绘制完地牢后停止draw()循环,不用每帧都重复画一遍,节省资源。
  • 后续可以把方向判断的逻辑封装成一个函数,减少代码重复,让结构更清晰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:16:02