Java打砖块游戏,弹球游戏

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作业,并不是很完全但全是自己一键一键码出来的,希望给个三连 😀

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值