java课设——《RookieSuperMario》【菜鸟版超级玛丽

发布时间 2023-06-16 20:46:52作者: C-929planet

项目简介:

我们团队利用面向对象开发方法和Java swing框架,对经典游戏《SuperMario》进行编写。

此项目共设施三个关卡,玩家可通过键盘来控制马里奥的移动,跳跃可以顶掉砖块,下落时还可以踩死蘑菇敌人,如果马里奥最终安全到达堡垒,则通关成功。

个人项目负责任务:

 

  1. 创建背景类(BackGround)和常量类(StaticValue)。调用read方法拼接图片路径,利用for循环绘制各关卡的地面、砖块和水管等(关卡的场景设计)。
  2. 将项目上传到远程git仓库。
  3. 使用issue推动项目进程:将项目开发过程中需要解决的重点和问题写上去,分门别类打上标签,清晰说明,方便解决。

项目git地址:

这里这里,我就是啦!!! 

Gitee issues面板:


 

 


 功能需求图:

 

 

 功能构架图:

黄底为我负责部分

静态扫描:

使用阿里巴巴静态代码扫描工具,对项目进行扫描

依据扫描出的问题并改正

 

本人负责模块的具体分析:

1.常量类(StaticValue.java):将要用到的图片素材打包进一个src下的软件包里(images),定义各变量存储单张素材物体,如Mario向左站立/向右站立、城堡、旗杆;对于多素材创建list集合来储存。然后将这些变量初始化操作【将图片与变量匹配以达到后续调用目的【图片路径用到的绝对路径(建议更改为相对路径)。

部分核心代码:

 //路径的前缀,方便后续调用
    public static String path = System.getProperty("user.dir") + "/src/images/";

    //初始化方法
    public static void init() {
        try {
            //加载背景图片
            bg = ImageIO.read(new File(path + "bg.png"));
            bg2 = ImageIO.read(new File(path + "bg2.png"));
            //加载马里奥向左站立
            stand_L = ImageIO.read(new File(path + "s_mario_stand_L.png"));
            //加载马里奥向右站立
            stand_R = ImageIO.read(new File(path + "s_mario_stand_R.png"));
            //加载城堡
            tower = ImageIO.read(new File(path + "tower.png"));
            //加载旗杆
            gan = ImageIO.read(new File(path + "gan.png"));
            //加载马里奥向左跳跃
            jump_L = ImageIO.read(new File(path + "s_mario_jump1_L.png"));
            //加载马里奥向右跳跃
            jump_R = ImageIO.read(new File(path + "s_mario_jump1_R.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }

        //加载马里奥向左跑
        for (int i = 1;i <= 2;i++) {
            try {
                run_L.add(ImageIO.read(new File(path + "s_mario_run"+ i +"_L.png")));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        //加载马里奥向右跑
        for (int i = 1;i <= 2;i++) {
            try {
                run_R.add(ImageIO.read(new File(path + "s_mario_run"+ i +"_R.png")));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        try {
            //加载障碍物
            obstacle.add(ImageIO.read(new File(path + "brick.png")));
            obstacle.add(ImageIO.read(new File(path + "soil_up.png")));
            obstacle.add(ImageIO.read(new File(path + "soil_base.png")));
        } catch (IOException e) {
            e.printStackTrace();
        }

 

2.背景类(BackGround.java):在构造方法里,分别对三个关卡的背景【地面绘制、两种砖块放置(可积分与不可积分)、固定建筑物】进行绘制。

核心代码:

 //判断是否是第一关
        if (sort == 1) {
            //绘制第一关的地面,上地面type=1,下地面type=2
            for (int i = 0;i < 27;i++) {
                obstacleList.add(new Obstacle(i*30,420,1,this));
            }
            for (int j = 0;j <= 120;j += 30) {
                for (int i = 0;i < 27;i++) {
                    obstacleList.add(new Obstacle(i*30,570-j,2,this));
                }
            }
            //绘制砖块A
            for (int i = 120;i <= 150;i += 30) {
                obstacleList.add(new Obstacle(i,300,7,this));
            }
            //绘制砖块B-F
            for (int i = 300;i <= 570;i += 30) {
                if (i == 360 || i == 390 || i == 480 || i == 510 || i == 540) {
                    obstacleList.add(new Obstacle(i,300,7,this));
                } else {
                    obstacleList.add(new Obstacle(i,300,0,this));
                }
            }
            //绘制砖块G
            for (int i = 420;i <= 450;i += 30) {
                obstacleList.add(new Obstacle(i,240,7,this));
            }
            //绘制水管
            for (int i = 360;i <= 600;i += 25) {
                if (i == 360) {
                    obstacleList.add(new Obstacle(620,i,3,this));
                    obstacleList.add(new Obstacle(645,i,4,this));
                }else {
                    obstacleList.add(new Obstacle(620,i,5,this));
                    obstacleList.add(new Obstacle(645,i,6,this));
                }
            }
            //绘制第一关的蘑菇敌人
            enemyList.add(new Enemy(580,385,true,1,this));
            //绘制第一关的食人花敌人
            enemyList.add(new Enemy(635,420,true,2,328,428,this));
        }

游戏运行展示:

第一关

第二关

第三关