JAVA面向对象编程课程设计——泡泡堂

时间:2020-01-09
本文章向大家介绍JAVA面向对象编程课程设计——泡泡堂,主要包括JAVA面向对象编程课程设计——泡泡堂使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

一、成员介绍

姓名 任务分配 个人博客链接
张一弛(组长) GUI设计、游戏界面相关类实现、阿里巴巴扫描纠错、团队博客编写
王江鸿 Box类、Bomb类、Login类实现;道具实现
陈志伟 Player类、PlayerAttribute类、Music类实现

二、项目Git地址

泡泡堂简易版

三、Git提交截图

四、项目功能架构图、主要功能流程图

五、项目运行截图与屏幕录制

1、主界面

2.玩家登记

3.游戏主界面

4.项目运行屏幕录制

六、关键代码

1.玩家移动线程

    private class moveThread1 extends Thread {
        @Override
        public void run() {
            
                while (player1.isalive) {
                    if(stopSign)
                        break;
                    if(pause){
                        player1.move();
                        colisionDetection(player1);
                        if(player1.thisbomb!=null)
                        {
                            //判断玩家是否在当前炸弹上(一旦离开玩家当前放置的炸弹,便不可再次站上去)
                            if(player1.thisbomb.isExistPlayer)
                            {
                                player1.onTheboom();
                            }
                        }
                    }
                }
            
        }
    }

使用while循环实现持续监听,加入判断线程结束标志,当重新开始、返回主界面时,线程能够及时停止。

2.碰撞检查(判断获得道具、前方有障碍、是否出界)

public static void colisionDetection(Player pl)
    {
        int x = 1120;
        int y = 880;
        //出地图边境
        if(pl.getX()<0||pl.getX()>x||pl.getY()<0||pl.getY()>y)
        {
            pl.back();
            return;
        }
        int w = 15;
        int h = 12;
        for(int i=0;i<w;i++) {
            for(int j=0;j<h;j++)
            {
                try {
                    Box temp=thismap.getBoxbyLocation(i,j);
                    //碰撞检查
                    if(temp.getRect().intersects(pl.getRect())&&temp.isExist)

                    {
                        //遇到箱子
                        if(!temp.isdestroyshowT)

                        {
                            pl.back();
                            return;
                        }
                        //遇到宝物
                        else{
                            switch(temp.treasureIndex){
                            case 1:
                                pl.pla.plusspeed();
                                break;
                            case 2:
                                pl.pla.plusbombnum();
                                break;
                            case 3:
                                pl.pla.pluspower();
                                break;
                            case 4:
                                //无敌状态
                                pl.invincible();
                                break;
                            case 5:
                                pl.pla.pluslive();
                                break;
                                default:
                                    break;
                            }
                            //设置当前方格为[不存在]
                            temp.isExist=false;
                            //将当前方格设置为隐藏
                            setIcon("images/default.png",temp);
                        }
                    }

                    //遇到炸弹
                    if(temp.isExistBomb&&!temp.isExistPlayer&&temp.getRect().intersects(pl.getRect()))
                    {
                        pl.back();
                        return;
                    }
                } catch (NullPointerException e) {

                }

            }
        }

    }

借助Rectangle类中的intersects方法来检测2个矩形是否相交,实现碰撞检查,再通过判断玩家前往的box的类型来判断下一步操作。

3.炸弹引爆

public synchronized void explode() throws InterruptedException
    // 爆炸
    {
        // 将box处定义炸弹的参数赋值false
        box.isExistBomb = false;
        box.needDetonate = false;
        player.setBombexist(player.getBombexist() - 1);
        // 玩家当前炸弹数-1
        setIcon("images/UDLR.png", box);
        // 设置炸弹中心的图片
        explodePlayer(box);
        // 判断是否炸到了玩家

        for (int n = 1; n <= power; n++)
        // 向上爆炸
        {
            boolean flag = true;
            int x = this.x;
            int y = this.y - n;
            if (y >= 0) {
                Box temp = GameFrame.thismap.getBoxbyLocation(x, y);
                flag = explode1(temp);
                if(flag == false) {
                    break;
                }
            }
        }
        // 向下爆炸
        for (int s = 1; s <= power; s++) {
            boolean flag = true;
            int x = this.x;
            int y = this.y + s;
            if (y < 12) {
                Box temp = GameFrame.thismap.getBoxbyLocation(x, y);
                flag = explode1(temp);
                if(flag == false) {
                    break;
                }
            }
        }
        // 向左爆炸
        for (int w = 1; w <= power; w++) {
            boolean flag = true;
            int x = this.x - w;
            int y = this.y;
            if (x >= 0) {
                Box temp = GameFrame.thismap.getBoxbyLocation(x, y);
                flag = explode1(temp);
                if(flag == false) {
                    break;
                }
            }
        }
        // 向右爆炸
        for (int e = 1; e <= power; e++) {
            boolean flag = true;
            int x = this.x + e;
            int y = this.y;
            if (x < 15) {
                Box temp = GameFrame.thismap.getBoxbyLocation(x, y);
                flag = explode1(temp);
                if(flag == false) {
                    break;
                }
            }
        }

    }
    public boolean explode1(Box temp) {
        if (temp.isExist)
            // 如果爆炸的路线上遇到方块了
            {
                if (temp.isdestroyshowT)
                // 如果是宝物
                {
                    temp.isExist = false;
                    return true;
                    // 宝物消失
                } else
                // 如果是障碍,则终止爆炸
                {
                    showTreasure(temp);
                    // 显示该box处隐藏的宝物
                    return false;
                }
            } else if (temp.isExistBomb)
            // 如果该爆炸处有炸弹
            {

                MyThread3 ph3 = new MyThread3(temp);
                ph3.start();
                continuousBomb.add(temp);
                // 将该炸弹添加到被引爆的列表里
            }
            explodePlayer(temp);
            // 判断是否炸到了玩家
            bombCache.add(temp);
            // 将该处添加到爆炸缓存中
            setIcon("images/UD.png", temp);
            // 设置该处的爆炸图片
            return true;
    }

根据当前玩家的威力,从当前Box分别向上下左右威力内的Box遍历,若遇到不可炸毁的障碍,则结束当前方向的遍历,否则,将遍历的Box设置爆炸。 判断是否炸到玩家——通过判断玩家是否和爆炸块重叠,不处于无敌状态,并且存活,若符合,玩家受到1点伤害。

七、阿里巴巴代码规范扫描

扫描结果:

修改:

修改了魔法值、注释、代码规范、添加作者后:

  • 通过新建一个继承自Thread的class创建线程解决不允许显式创建线程问题

  • 通过代码复用,创建新方法来解决单一方法过长问题

    完全解决:

    八、总结

    本次课设功能还有许多可以拓展的地方,例如数据库存储玩家信息、通过Socket实现多人同台竞技等;
    我们在游戏本身的界面和功能花了比较多的时间,以后有机会继续完善。

原文地址:https://www.cnblogs.com/choco1ate/p/12172223.html