Java极致还原XP系统经典扫雷——全部代码

Posted 晓时谷雨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java极致还原XP系统经典扫雷——全部代码相关的知识,希望对你有一定的参考价值。

Java极致还原XP系统经典扫雷

前言

  最近疫情在家,没有工作上的996压迫着我,使我倍感无聊,不知道这满头秀发该如何消耗。
  闲逛着游戏社区,常常回想起和朋友一起通宵玩游戏的那种快感,现在的我们都各奔东西,跟自己的生活对线,怕是很难再体会到了。。。
  一款扫雷游戏使我眼前一亮,他用了关卡的模式,使我为了通关不断的尝试,不出意外,以我的脑力和运气,成功卡在了最后一关,无力感涌上心头,突然就有了写个外挂的想法。
  但这是不对的,我们要尊重游戏制作者,所以我气不过,那就自己做一个扫雷玩,真™机智啊。
  

实现功能

  鼠标左键单击,翻开方格
  鼠标中键点击,标记问号
  鼠标右键单击,标记旗子,旗子只能插和雷相同的数量
  翻开不是雷的话,将连锁翻开周围不是雷的方格
  翻开是雷的话,游戏结束,失败
  翻开雷周围的方块,将显示该方块周围雷的数量
  不能翻开标记了问号和旗子的方格
  游戏界面显示雷的数量、剩余时间和经典小黄脸(时间默认为无限)
  点击小黄脸可重新开始游戏
  

实战演示

  本来想从网上找点素材的,但…就是懒得找了,自己用PS随便画了几个图,感觉还行,勉强能看,需要的话,直接私聊我加Q就行。

失败

赢了

插旗

标记问号

  

下面是所有的代码

Test类

public class Test 
    public static void main(String[] args) 
        MyJFrame mj = new MyJFrame();
        mj.myJFrame();
    

MyJFrame类

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Random;

public class MyJFrame extends JFrame implements MouseListener 
    int window_width = 560, window_height = 640;//初始化游戏窗口大小
    static int mine_crosswise = 10, mine_vertical = 10;//初始化雷区为10*10
    static int mine_mun = 10;//初始化雷的数量
    static int sign_mun = 0;//初始化旗子的数量
    static int[][] mine = new int[mine_crosswise][mine_vertical];//保存每个雷的位置
    static int[][] mine1 = new int[mine_crosswise][mine_vertical];//给用户展示的数据
    int[][] sign = new int[mine_crosswise][mine_vertical];//保存每个旗子的位置
    int[][] uncertainty = new int[mine_crosswise][mine_vertical];//保存每个?的位置
    static BufferedImage image = null;//获取图片路径
    static int judge = 0;//判断游戏状态 0游戏中,1赢了,2输了
    static boolean mine_place = false;//绘制雷的开关,判断雷是否以放置,防止多次放置


    //---------------------------------------------------------------------------------------------------------------------
    //窗体
    public void myJFrame() 
        this.setTitle("扫雷"); //标题
        this.setSize(window_width, window_height); //窗口大小
        this.setResizable(false); //窗口是否可以改变大小=否
        this.setDefaultCloseOperation(MyJFrame.EXIT_ON_CLOSE);//窗口关闭方式为关闭窗口同时结束程序
        int width = Toolkit.getDefaultToolkit().getScreenSize().width;//获取屏幕宽度
        int height = Toolkit.getDefaultToolkit().getScreenSize().height;//获取屏幕高度
        this.setLocation((width - window_width) / 2, (height - window_height) / 2); //设置窗口默认位置以屏幕居中
        this.addMouseListener(this);
        this.setVisible(true); //窗口是否显示=是
    


    //---------------------------------------------------------------------------------------------------------------------
    //覆写paint方法,绘制界面
    public void paint(Graphics g) 

        //双缓冲技术防止屏幕闪烁
        BufferedImage bi = new BufferedImage(window_width, window_height, BufferedImage.TYPE_INT_ARGB);
        Graphics g2 = bi.createGraphics();

        //剩余雷的数量
        g2.setColor(Color.red);//设置画笔颜色
        g2.setFont(new Font("微软雅黑", 10, 30));//设置字体
        g2.drawString("雷数:" + mine_mun, 50, 80);//绘制字符

        //剩余时间
        g2.setColor(Color.red);//设置画笔颜色
        g2.setFont(new Font("微软雅黑", 10, 30));//设置字体
        g2.drawString("时间:无限", window_width - 200, 80);//绘制字符

        //调用放置小黄脸的方法
        again();
        //笑脸位置居中
        g2.drawImage(image, (window_width - 50) / 2, 45, this);


        /*
         * 绘制雷区
         * 根据初始化的雷区数值,循环生成雷区
         * 0、9::没有掀开,1-8:显示周围雷数、-1掀开
         */
        for (int i = 0; i < mine_crosswise; i++) 
            for (int j = 0; j < mine_vertical; j++) 
                if (mine1[i][j] == -1) 
                    try 
                        image = ImageIO.read(new File("D:\\\\#Java\\\\个人项目\\\\MineSweeper\\\\img\\\\1.png"));
                     catch (IOException e) 
                        e.printStackTrace();
                    
                    g2.drawImage(image, 30 + i * 50, 110 + j * 50, this);
                    continue;
                
                if (mine1[i][j] == 1) 
                    try 
                        image = ImageIO.read(new File("D:\\\\#Java\\\\个人项目\\\\MineSweeper\\\\img\\\\01.png"));
                     catch (IOException e) 
                        e.printStackTrace();
                    
                    g2.drawImage(image, 30 + i * 50, 110 + j * 50, this);
                    continue;
                
                if (mine1[i][j] == 2) 
                    try 
                        image = ImageIO.read(new File("D:\\\\#Java\\\\个人项目\\\\MineSweeper\\\\img\\\\02.png"));
                     catch (IOException e) 
                        e.printStackTrace();
                    
                    g2.drawImage(image, 30 + i * 50, 110 + j * 50, this);
                    continue;
                
                if (mine1[i][j] == 3) 
                    try 
                        image = ImageIO.read(new File("D:\\\\#Java\\\\个人项目\\\\MineSweeper\\\\img\\\\03.png"));
                     catch (IOException e) 
                        e.printStackTrace();
                    
                    g2.drawImage(image, 30 + i * 50, 110 + j * 50, this);
                    continue;
                
                if (mine1[i][j] == 4) 
                    try 
                        image = ImageIO.read(new File("D:\\\\#Java\\\\个人项目\\\\MineSweeper\\\\img\\\\04.png"));
                     catch (IOException e) 
                        e.printStackTrace();
                    
                    g2.drawImage(image, 30 + i * 50, 110 + j * 50, this);
                    continue;
                
                if (mine1[i][j] == 5) 
                    try 
                        image = ImageIO.read(new File("D:\\\\#Java\\\\个人项目\\\\MineSweeper\\\\img\\\\05.png"));
                     catch (IOException e) 
                        e.printStackTrace();
                    
                    g2.drawImage(image, 30 + i * 50, 110 + j * 50, this);
                    continue;
                
                if (mine1[i][j] == 6) 
                    try 
                        image = ImageIO.read(new File("D:\\\\#Java\\\\个人项目\\\\MineSweeper\\\\img\\\\06.png"));
                     catch (IOException e) 
                        e.printStackTrace();
                    
                    g2.drawImage(image, 30 + i * 50, 110 + j * 50, this);
                    continue;
                
                if (mine1[i][j] == 7) 
                    try 
                        image = ImageIO.read(new File("D:\\\\#Java\\\\个人项目\\\\MineSweeper\\\\img\\\\07.png"));
                     catch (IOException e) 
                        e.printStackTrace();
                    
                    g2.drawImage(image, 30 + i * 50, 110 + j * 50, this);
                    continue;
                
                if (mine1[i][j] == 8) 
                    try 
                        image = ImageIO.read(new File("D:\\\\#Java\\\\个人项目\\\\MineSweeper\\\\img\\\\08.png"));
                     catch (IOException e) 
                        e.printStackTrace();
                    
                    g2.drawImage(image, 30 + i * 50, 110 + j * 50, this);
                    continue;
                
                if (sign[i][j] == 1) 
                    try 
                        image = ImageIO.read(new File("D:\\\\#Java\\\\个人项目\\\\MineSweeper\\\\img\\\\sign.png"));
                     catch (IOException e) 
                        e.printStackTrace();
                    
                    g2.drawImage(image, 30 + i * 50, 110 + j * 50, this);
                    continue;
                
                if (uncertainty[i][j] == 1) 
                    try 
                        image = ImageIO.read(new File("D:\\\\#Java\\\\个人项目\\\\MineSweeper\\\\img\\\\uncertainty.png"));
                     catch (IOException e) 
                        e.printStackTrace();
                    
                    g2.drawImage(image, 30 + i * 50, 110 + j * 50, this);
                    continue;
                
                try 
                    image = ImageIO.read(new File("D:\\\\#Java\\\\个人项目\\\\MineSweeper\\\\img\\\\0.png"));
                 catch (IOException e) 
                    e.printStackTrace();
                

                g2.drawImage(image, 30 + i * 50, 110 + j * 50, this);
            
        


        /*
         * 绘制游戏结束后显示的雷
         * 根据初始化的雷区数值,循环生成雷区
         * 游戏结束后可显示所有雷位置
         */
        if (judge == 1 || judge == 2) 
            for (int i = 0; i < mine_crosswise; i++) 
                for (int j = 0; j < mine_vertical; j++) 
                    if (mine[i][j] == 9) 
                        try 
                            image = ImageIO.read(new File("D:\\\\#Java\\\\个人项目\\\\MineSweeper\\\\img\\\\mine.png"));
                         catch (IOException e) 
                            e.printStackTrace();
                        
                        g2.drawImage(image, 30 + i * 50, 110 + j * 50, this);
                    
                

            
        

        //调用放置地雷的方法
        place();

        //将以上所述全部绘制在画布上
        g.drawImage(bi, 0, 0, this);
    

    /**
     * 通过递归算法实现连锁
     * 判断四个边、四个角、和其余的中间部分,如果为零则将其改为-1,代表已翻开
     * 否则将数字显示出来
     */
    public static void scan(int x, int y) 
        //上
        if (x - 1 >= 0 && x + 1 <= mine_crosswise - 1 && y - 1 < 0) 
            if (mine[x - 1][y] == 0) 
                mine1[x - 1][y] = mine[x - 1][y] = -1;
                scan(x - 1, y);
             else 
                mine1[x - 1][y] = mine[x - 1][y];
            
            if (mine[x - 1][y + 1] == 0) 
                mine1[x - 1][y + 1] = mine[x - 1][y + 1] = -1;
                scan(x - 1, y + 1);

             else 
                mine1[x - 1][y + 1] = mine[x - 1][y + 1];

            

            if (mine[x][y + 1] == 0) 
                mine1[x][y + 1] = mine[x][y + 1] = -1;
   

以上是关于Java极致还原XP系统经典扫雷——全部代码的主要内容,如果未能解决你的问题,请参考以下文章

带你还原童年,扫雷游戏完整源码分析!

LeetCode-面试算法经典-Java实现106-Construct Binary Tree from Inorder and Postorder Traversal(构造二叉树II)(示例(代码片

用Python写扫雷游戏实例代码分享还有很多小游戏代码

简单到极致!Windows 10 Ubuntu子系统的备份/还原教程来了

C语言写扫雷代码

c语言扫雷(含递归清场)