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

Java打砖块游戏开发问题:如何实现砖块碰撞后消失?

解决打砖块游戏中砖块碰撞后不消失的问题

嘿,我明白你现在遇到的问题了——小球碰到砖块能反弹,但砖块就是不消失对吧?核心问题在于你当前的draw_Brick()函数每次运行时都会重新绘制所有砖块,没有记录哪些砖块已经被小球撞掉了。你尝试修改g和h的方法没用,是因为每次循环里你又把它们重新赋值为85和25了,相当于白改。

既然你还没用到类,我们可以用一个二维boolean数组来记录每个砖块的“存活状态”——true表示砖块还在,false表示已经被撞掉。下面是具体的修改步骤和完整代码:

步骤1:添加全局状态数组

首先在全局变量区添加一个二维boolean数组,用来记录3x3网格里每个砖块是否存活:

int movementX, movementY; 
int x, y; 
int w, z; 
// 新增:记录砖块存活状态的二维数组
boolean[][] bricksAlive;

步骤2:初始化砖块状态

在setup()函数里初始化这个数组,把所有砖块都设为“存活”(true):

void setup() { 
 size(600, 600); 
 background(0); 
 x = 200; 
 y = 300; 
 movementX = -3; 
 movementY = 6; 
 w = 280; 
 z = 400; 
 // 初始化3行3列的砖块状态,全部设为true(存活)
 bricksAlive = new boolean[3][3];
 for(int n=0; n<3; n++){
   for(int m=0; m<3; m++){
     bricksAlive[n][m] = true;
   }
 }
}

步骤3:修改draw_Brick()函数

修改这个函数,只绘制“存活”的砖块,并且在小球碰撞到存活的砖块时,标记该砖块为“死亡”(false):

void draw_Brick() { 
 for (int n = 0; n < 3; n = n + 1) { 
  for (int m = 0; m < 3; m = m + 1) { 
   // 只有砖块存活时才处理绘制和碰撞
   if(bricksAlive[n][m]){
     int b=m*250; 
     int v=n*70; 
     int g=85; 
     int h=25; 
     fill(255, 0, 0); 
     rect(b, v, g, h); 

     // 碰撞检测:只有存活的砖块才触发反弹和消失
     if (y<v+25 && y>v && x<b+85 && x>b) { 
      movementY = -movementY; 
      // 标记该砖块为死亡,下次就不会再绘制了
      bricksAlive[n][m] = false;
     }
   }
  } 
 } 
}

完整修改后的代码

int movementX, movementY; 
int x, y; 
int w, z; 
boolean[][] bricksAlive;

void setup() { 
 size(600, 600); 
 background(0); 
 x = 200; 
 y = 300; 
 movementX = -3; 
 movementY = 6; 
 w = 280; 
 z = 400; 
 bricksAlive = new boolean[3][3];
 for(int n=0; n<3; n++){
   for(int m=0; m<3; m++){
     bricksAlive[n][m] = true;
   }
 }
}

void draw() { 
 Clear(); 
 movement(); 
 pounding(); 
 dessiner(); 
 draw_Brick(); 
}

void Clear() { 
 background(0); 
}

void dessiner() { 
 smooth(); 
 fill(255); 
 rect(w, z, 85, 25); 
 fill(255, 0, 0); 
 ellipse(x, y, 20, 20); 
 fill(255); 
 text("movementX: "+movementX, 480, 570); 
 text("movementY: "+movementY, 480, 583); 
}

void movement() { 
 x = x + movementX; 
 y = y + movementY; 
 w = (mouseX); 
}

void draw_Brick() { 
 for (int n = 0; n < 3; n = n + 1) { 
  for (int m = 0; m < 3; m = m + 1) { 
   if(bricksAlive[n][m]){
     int b=m*250; 
     int v=n*70; 
     int g=85; 
     int h=25; 
     fill(255, 0, 0); 
     rect(b, v, g, h); 

     if (y<v+25 && y>v && x<b+85 && x>b) { 
      movementY = -movementY; 
      bricksAlive[n][m] = false;
     }
   }
  } 
 } 
}

void pounding() { 
 // 若位置过右且水平移动量为正 
 if (x > width-10 && movementX > 0) { 
  movementX = -movementX; // 反转数值 
 } 
 // 若位置过低且垂直移动量为正 
 if (y > width-10 && movementY > 0) { 
  movementY = -movementY; // 转为负值 
 } 
 // 若位置过高且垂直移动量为负 
 if (y < 10 && movementY < 0) { 
  movementY = abs(movementY); // 转为正值 
 } 
 // 与挡板碰撞 
 if (y<z+25 && y>z && x<w+85 && x>w) { 
  movementY = -movementY; // 反转数值 
 } 
 if (x < 10 && movementX < 0) { 
  movementX = -movementX; 
 } 
}

额外小优化

我还帮你修正了pounding()函数里的两个小bug:

  • 原来的if (y < 10 && movementY < 10)条件不对,应该是movementY < 0(只有当小球向上飞的时候才反弹)
  • 同理if (x < 10 && movementX < 10)改成movementX < 0,避免不必要的反弹触发

这样修改后,小球碰到砖块不仅会反弹,对应的砖块也会消失,不会再被绘制出来啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:00:12