java课设-扫雷(个人)

该文详细介绍了作者在扫雷游戏项目中的工作,包括负责的游戏主框架、GUI部分的编写,以及关键功能如游戏流程、胜利与失败判断、提醒功能、埋雷和数字填充的代码实现。同时,提到了git提交记录和个人在项目功能架构图中的角色。在项目总结中,作者指出了存在的问题并展望了未来可能的改进方向,如人机模式、PVP对战和排行榜功能。
摘要由CSDN通过智能技术生成

一.负责内容

主体框架的编写,游戏功能的实现,部分GUI的绘制。

二.git提交记录(个人)

在这里插入图片描述
gitee传送门

三.项目功能架构图

1.流程图(黄色代表所负责的块)

在这里插入图片描述

2.UML类图(黄色为负责块)

在这里插入图片描述

四.个人负责关键代码

1.游戏主要流程


void launch(){
        GameUtil.START_TIME = System.currentTimeMillis();//开始时间
        this.setVisible(true);//可见
        if(GameUtil.state==3){
            this.setSize(500,500);
        }else{
            this.setSize(width,height);//窗口大小
        }
        this.setLocationRelativeTo(null);//居中显示
        this.setTitle("扫雷");
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);//关闭方法
        //鼠标事件
        this.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                super.mouseClicked(e);
                switch(GameUtil.state){
                    case 0:
                        //左键被点击
                        if(e.getButton()==1){
                        GameUtil.MOUSE_x = e.getX();
                        GameUtil.MOUSE_Y  =e.getY();
                        GameUtil.LEFT = true;
                    }
                        //右键被点击
                        if(e.getButton()==3){
                            GameUtil.MOUSE_x = e.getX();
                            GameUtil.MOUSE_Y  =e.getY();
                            GameUtil.RIGHT = true;
                        }
                    case 1:
                    case 2:
                        if(e.getButton()==1) {
                            if (e.getX() > GameUtil.OFFSET + GameUtil.SQUARE_LENGTH * (GameUtil.MAP_W / 2)
                                    && e.getX() < GameUtil.OFFSET + GameUtil.SQUARE_LENGTH * (GameUtil.MAP_W / 2) + GameUtil.SQUARE_LENGTH
                                    && e.getY() > GameUtil.OFFSET
                                    && e.getY() < GameUtil.OFFSET + GameUtil.SQUARE_LENGTH) {
                                mapBottom.reGame();
                                mapTop.reGame();
                                GameUtil.FLAG_NUM = 0;
                                GameUtil.START_TIME = System.currentTimeMillis();
                                GameUtil.state = 0;
                            }
                        }
                        //单机滚轮,切换难度
                        if(e.getButton()==2){
                            GameUtil.state=3;
                            begin=true;
                        }
                        break;
                    case 3:
                        if(e.getButton()==1){
                            GameUtil.MOUSE_x = e.getX();
                            GameUtil.MOUSE_Y = e.getY();
                            begin = gameSelect.hard();
                        }
                        break;
                }

            }
        });
        while(true){
            repaint();
            begin();
            try {
                Thread.sleep(40);
            }catch(InterruptedException e){
                e.printStackTrace();
            }
        }
    }
  • 简述.程序的主要流程快,利用鼠标左右键进行监听得到返回值并判断状态来开始游戏。

2.胜利与失败判断功能

boolean victory(){
        //统计未打开格子数
        int count = 0;
        for (int i = 1; i < GameUtil.MAP_W; i++) {
            for (int j = 1; j <= GameUtil.MAP_H; j++) {
                if(GameUtil.DATA_TOP[i][j]!=-1){
                    count++;
                }
            }
        }
        if(count==GameUtil.RAY_MAX){
            GameUtil.state=1;
            for (int i = 1; i < GameUtil.MAP_W; i++) {
                for (int j = 1; j <= GameUtil.MAP_H; j++) {
                    //未翻开,变成旗
                    if(GameUtil.DATA_TOP[i][j]==0){
                        GameUtil.DATA_TOP[i][j]=1;
                    }
                }
            }
            return true;
        }
        return false;
    }
boolean boom() {

        for (int i = 1; i < GameUtil.MAP_W; i++) {
            for (int j = 1; j <= GameUtil.MAP_H; j++) {
                if (GameUtil.DATA_BUTTON[i][j] == -1 && GameUtil.DATA_TOP[i][j] == -1) {
                    GameUtil.state=2;
                    seeBoom();
                    return true;
                }
            }
        }
        return false;
    }
    //失败显示
    void seeBoom(){
        for (int i = 1; i < GameUtil.MAP_W; i++) {
            for (int j = 1; j <= GameUtil.MAP_H; j++) {
                //底层不是雷且顶层是旗
                if(GameUtil.DATA_BUTTON[i][j]==-1&&GameUtil.DATA_TOP[i][j]!=1){
                    GameUtil.DATA_TOP[i][j]=-1;
                }
                //底层不是雷且,顶层是旗
                if(GameUtil.DATA_BUTTON[i][j]!=-1&&GameUtil.DATA_TOP[i][j]==1){
                    GameUtil.DATA_TOP[i][j]=2;
                }
            }
        }
    }
  • 简述:翻开所以格子且旗子都差在雷上则胜利,反之则失败。

3.提醒功能

//绘制数字,倒计时
        GameUtil.drawWord(g,""+(GameUtil.RAY_MAX-GameUtil.FLAG_NUM),GameUtil.OFFSET,2*GameUtil.OFFSET,30,Color.red);
        GameUtil.drawWord(g,""+(GameUtil.END_TIME-GameUtil.START_TIME)/1000,
                GameUtil.OFFSET+GameUtil.SQUARE_LENGTH*(GameUtil.MAP_W-1),
                2*GameUtil.OFFSET,30,Color.black   );
        switch(GameUtil.state){
            case 0:
                GameUtil.END_TIME = System.currentTimeMillis();
                g.drawImage(GameUtil.face,
                        GameUtil.OFFSET+GameUtil.SQUARE_LENGTH*(GameUtil.MAP_W/2),
                        GameUtil.OFFSET,
                        null);
                break;
            case 1:
                g.drawImage(GameUtil.win,
                        GameUtil.OFFSET+GameUtil.SQUARE_LENGTH*(GameUtil.MAP_W/2),
                        GameUtil.OFFSET,
                        null);
                break;
            case 2:
                g.drawImage(GameUtil.over,
                        GameUtil.OFFSET+GameUtil.SQUARE_LENGTH*(GameUtil.MAP_W/2),
                        GameUtil.OFFSET,
                        null);
                break;
        }
   }
  • 简述:打印了基本游戏界面的网格和背景,并设计了游戏中雷数量和游戏时长的提示功能。

4.埋雷功能

public class BottomRay {
   //存放坐标
   static int []rays = new int [GameUtil.RAY_MAX*2];//相邻两个数为地雷坐标
   //地理坐标
   int x,y;
   //是否放置T表示放置,F表示不可放置
   boolean isplace = true;
   //生成雷
   void newRay(){
       for(int i=0;i<GameUtil.RAY_MAX*2;i=i+2){
           x=(int)(Math.random()*GameUtil.MAP_W+1);//1-12
           y=(int)(Math.random()*GameUtil.MAP_H+1);//1-12
           rays[i]=x;
           rays[i+1]=y;
           //判断坐标是否存在,防止多个雷放在同一个位置
           for(int j=0;j<i;j+=2){
               if(x==rays[j]&&y==rays[j+1]){
                   i=i-2;
                   isplace = false;
                   break;
               }
           }
           //将坐标放入数组
           if(isplace){
               rays[i] = x;
               rays[i+1] = y;
           }
           isplace = true;
       }
       for (int i= 0;i<GameUtil.RAY_MAX*2;i=i+2){
           GameUtil.DATA_BUTTON[rays[i]][rays[i+1]]=-1;
       }
   }
}

  • 简述.利用random进行随机坐标的生成,并利用数组进行雷位置的存储。

5.数字填充功能

public class BottomNum {
    void newNum(){
        for(int i =1;i<=GameUtil.MAP_W;i++){
            for(int j =1;j<=GameUtil.MAP_H;j++){
                if(GameUtil.DATA_BUTTON[i][j]==-1){
                    for(int k=i-1;k<=i+1;k++){
                        for(int l =j-1;l<=j+1;l++){
                            if(GameUtil.DATA_BUTTON[k][l]>=0){
                                GameUtil.DATA_BUTTON[k][l]++;
                            }//判断3*3的区域
                        }
                    }
                }
            }
        }
    }
}
  • 简述:利用多重循环遍历雷的九宫格来进行数字的填充。

五.项目总结

1.不足之处

1).放置第一个旗子时有时会出现闪动现象,且有时点击一下会将所有格子的内容显示出来,暂时还不知道如何解决。

2.展望

1)人机模式想要实现自定义。
2)想要添加pvp技术,实现对战,对战内容可以比一比谁的扫雷速度更快。
3)创建排行榜,不同难度扫雷的时间快慢进行排名。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值