2025年Java打砖块游戏,弹球游戏

Java打砖块游戏,弹球游戏TrillionGame 一 基本效果如下 彩蛋视频 彩蛋 效果视频 效果 二 代码关系图如下 三 关键代码和思路如下 1 MyFrame 主要界面类 public boolean isGaneOver false 判断游戏是否结束 private boolean isEmpty true

大家好,我是讯享网,很高兴认识大家。

TrillionGames

一、基本效果如下:

show
讯享网

  • 彩蛋视频
    彩蛋
  • 效果视频
    效果

二、代码关系图如下:

MyFrame

三、关键代码和思路如下:

1.MyFrame(主要界面类)
 public boolean isGaneOver = false;//判断游戏是否结束 private boolean isEmpty = true;//因为砖块构建有延迟,所以加一个判断条件 public boolean isStop = false;//判断是否暂停了 public boolean isPass = false;//判断是否通关 private int BrickCount;//初始化砖块数目 private int Stick_length;//初始化木板的长度 public Ball ball ;//随机初始小球的位置 private ArrayList<Brick> bricks = new ArrayList<>(); public Stick stick; private ArrayList<ExplodeDemo> explodes = new ArrayList<>();//建立爆炸类,可能同时时间有多个爆炸类,所以要用arraylist数组 public int level = 1;//当前的关卡数 private boolean isBonus = false;//标记是不是彩蛋 private void init() { //创建砖块和小球和木棍 create(); //添加键盘相应事件 addKeyListener(new KeyListener() { @Override public void keyPressed(KeyEvent e) { //如果是右键则右移 if (e.getKeyCode() == KeyEvent.VK_RIGHT && !isStop) { stick.setX(stick.getX() + stick.getSensitivity()); } //如果是左键则左移 else if (e.getKeyCode() == KeyEvent.VK_LEFT && !isStop) { stick.setX(stick.getX() - stick.getSensitivity()); } //空格暂停 else if (e.getKeyCode() == KeyEvent.VK_SPACE) { isStop = !isStop; } repaint(); } }); } //绘图函数 public void paint(Graphics g) { collision();//判断小球有无碰到砖块 stick.HitBall();//判断小球有无碰到木板 drawAll();//画出所有的砖块小球函数 } //碰撞函数 public synchronized void collision() { for (int i = 0; i < bricks.size(); i++) { Brick temp = bricks.get(i); if (!temp.isDelete()) {//如果此时砖块还没有删除 if (temp.isHit()) {//判断小球碰到了砖块 ExplodeDemo explodeDemo = new ExplodeDemo(temp, this); explodeDemo.start();//新的爆炸事件 explodes.add(explodeDemo); this.repaint(); } } else { bricks.remove(i);//如果删除的话就移除它 i--; } } if (bricks.size() == 0 && !isEmpty) isPass = true;//没有砖块了,pass就为true了 } //创建砖块和小球和木棍 public void create() //随机生成砖块 public synchronized void CreateBricks(){ isEmpty = false; } 

讯享网
2.Ball(小球类)
讯享网 private int X;//球心横坐标x private int Y;//球心纵坐标 private int vx;//水平方向的速度 private int vy;//竖直方向的速度 public static final int R = 15;//小球坐标不变 public static final int YMAX = 15;//小球竖直方向最大速度 public static final int YMIN = 2;//小球竖直方向最小速度 private MyFrame jf; @Override public void run() { while (!jf.isGaneOver) {//如果游戏没有结束 try { if (!jf.isStop) {//判断有没有停止 move();//移动 jf.repaint();//重新绘制 } Thread.sleep(20); } catch (Exception e) { e.printStackTrace(); } } } //小球移动函数 public synchronized void move() { X += vx; Y += vy; //若是碰到左边和右边,vx反向 if (X <= R || X + R >= MyFrame.WIDTH) { vx = -vx; if (X <= R) X = R; else X = MyFrame.WIDTH - R; } //若是碰到顶部和底部,vy反向 else if (Y >= MyFrame.HEIGHT||Y <= 2 * R) { vy = -vy; } } 
3.Stick(木板类)
 private int x;//木板左上角x左边 public static final int YPosition = 700;//纵坐标固定 public static final int H = 30;//高度固定 private int length;//长度随着关卡数增加而减小 private int sensitivity ;//灵敏度(即每按一下键盘,木板移动的距离) public static final int MAXSENSI = 70;//最大木板灵敏度 public static final int MINSENSI = 10;//最小木板灵敏度 private Random rand = new Random();//碰撞后随机减小或增大x轴速度 private MyFrame jf; private Ball ball; //判断是否击中了球 public synchronized boolean HitBall() { if (ball.getY() + Ball.R > YPosition) {//小球的y距离一定到了木板的高度 //击中了球(小球球心在木板范围内) if (ball.getX() >= x && ball.getX() <= x + length && !jf.isGaneOver) { int tempVx = (ball.getVx() > 0 ? 1 : -1) * (rand.nextInt(15) + 1);//随机改变速度 ball.setVy(-ball.getVy());//反向 ball.setVx(tempVx);//随机改变速度 return true;//成功击中小球 } //没有接住,游戏结束,判断是否相反碰撞,如果是,小球改变方向 jf.isGaneOver = true; } return false; } 
4.Brick(砖块类)
讯享网 private Ball ball; private int x;//砖块左上角的横坐标 private int y;//砖块左上角的纵坐标 public static final int WH = 30;//砖块为方块,高度和宽度相等 private Color color;//砖块颜色,随机产生 private boolean isDelete = false;//判断是否已经被小球碰到 //判断是否碰到小球 public synchronized boolean isHit() { //删除了直接返回false if (isDelete) { return false; } //撞到砖块左右两边 else if (ball.getY() >= y && ball.getY() <= y + WH && (ball.getX() + Ball.R >= x && ball.getX() - Ball.R <= x + WH)) { ball.setVx(-ball.getVx());//反向 isDelete = true;//删除了 return true; } //撞到砖块上下两侧 else if (ball.getX() >= x && ball.getX() <= x + WH && (ball.getY() + Ball.R >= y && ball.getY() - Ball.R <= y + WH)) { ball.setVy(-ball.getVy());//反向 isDelete = true;//删除了 return true; } return false; } 

四、心得与收获如下:

  • 首先毫无疑问,这次作业是有史以来自我感觉写得最标准(只是说行业规范比较标准)的作业,主要表现如下:
    • 变量和类命名的规划化。类的命名单词的首字母大写,变量的命名为单词小写
    • 写了很多注释。为了方便读者和老师的阅读,当然更多是为我自己改bug的方便,整个工程和全部的代码我写了很多的注释。大大提高了代码的可读性
    • 变量修饰词的规划化。部分应该要成为永久变量定义为public static final类型;不可获得的变量定义为private类型;另外在此类当中定义了set和get函数来改变和获得它们的值
  • 当然,在完成这个作品之前也会遇到很多困难,但通过自己上网搜索大部分都得到了解决,因为这个游戏的爆炸效果和小球的移动。所以对线程的运用也是更加娴熟。自我感觉本次的项目中的优势:
    • 暂停功能,暂停时可以调木板灵敏度小球下落速度
    • 有小球碰到砖块爆炸的效果
    • 小球碰到木板和砖块音乐的效果
    • 为学校设计的彩蛋

五、源代码链接:

给读者们的话

自己写的java作业,并不是很完全但全是自己一键一键码出来的,希望给个三连 😀

小讯
上一篇 2025-03-30 09:49
下一篇 2025-02-19 09:48

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/32859.html