日志随记 - Java
type: channel
link: https://xggm.top/tag/Java/
items: Java实现扫雷小游戏三
items: Java实现扫雷小游戏二
items: Java扫雷源码
items: Java实现扫雷小游戏一
items: Java实现扫雷小游戏介绍

Java实现扫雷小游戏三
type: item
date: 2022-05-26T19:02:00+08:00
description: 接下来是完成菜单栏的功能游戏菜单添加菜单监听器（com.panel/BombJMenuBar.java）在init()方法中插入// 开局事件处理 menuItemStart.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { mainframe.reStartGame(); } }); // 添加事件监听器 MenuListener listener = new MenuListener(mainframe); menuItemStart.addActionListener(listener); menuItemLow.addActionListener(listener); menuItemMid.addActionListener(listener); menuItemHigh.addActionListener(listener); menuItemOrder.addActionListener(listener); menuHeroLow.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { new Hero(mainframe); }}); menuHeroMid.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { new Hero1(mainframe); }}); menuHeroHigh.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { new Hero2(mainframe); }}); menuItemAbout.addActionListener(listener); // 后门外挂方便测试 menuItemHole.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { } }); menuItemExit.addActionListener(new ActionListener() { //加一个系统退出的处理监听 public void actionPerformed(ActionEvent e) { System.exit(0); } });编写等级菜单监听类（com.listener/MenuListener）// 等级菜单监听器 public class MenuListener implements ActionListener { JMenuItem jMenuItem; JTextField jTextField=new JTextField(); MainFrame mainframe; public MenuListener(MainFrame mainframe){ this.mainframe = mainframe; } public void actionPerformed(ActionEvent e) { if(e.getActionCommand().equals("开局(N)")){ this.mainframe.reStartGame(); } if(e.getActionCommand().equals("初级(B)")){ Tools.rows = 9; Tools.cols = 9; Tools.allcount = 10; Tools.currentLevel = Tools.LOWER_LEVEL; this.mainframe.reStartGame(); } if(e.getActionCommand().equals("中级(I)")){ Tools.rows = 16; Tools.cols = 16; Tools.allcount = 40; Tools.currentLevel = Tools.MIDDLE_LEVEL; this.mainframe.reStartGame(); } if(e.getActionCommand().equals("高级(E)")){ Tools.rows = 16; Tools.cols = 30; Tools.allcount = 99; Tools.currentLevel = Tools.HEIGHT_LE…

Java实现扫雷小游戏二
type: item
date: 2022-05-26T16:44:00+08:00
description: 布雷上一篇已经完成了界面UI的实现，接下来开始功能的实现。定义布雷类（com.tools/LayMine.java）（1）布雷采用随机生成的布雷方式，玩家第一次点击小方格不应该是雷，故布雷功能设计在玩家第一次左键时开始布雷。参数row和col是第一次点击的鼠标坐标。public class LayMine { /** * labels：存储方格的二维数据 * row：当前鼠标点击的x值 * col：当前鼠标点击的y值 */ public static void lay(MineLabel[][] labels, int row, int col) { int count = 0; Random random = new Random(); // 随机 while (count<Tools.allcount) { int x = random.nextInt(Tools.rows); int y = random.nextInt(Tools.cols); if(!labels[x][y].isMineTag() && (x !=row && y!= col)) { // 布雷 labels[x][y].setMineTag(true); count++; } } countBomb(labels); }（2）计算小方格周围雷的数量分析当前方格（x，y）周围方格的坐标：设 x 和 y的最大值分别为 X 和 Y ：([0, x+1]，[0, y+1])([x-1, x+1]，[0, y+1])([x-1, X]，[0, y+1])([0, x+1]，[y-1, y+1])([x-1, x+1]，[y-1, y+1])([x-1, X]，[y-1, y+1])([0, x+1]，[y-1, Y])([x-1, x+1]，[y-1, Y])([x-1, X]，[y-1, Y])当前点（x,y）的周围方格x值最小值或者为0，或者为x-1，且不能小于0，x的最小值取Math.max(0, x- 1)，x的最大值x+1，或者为X，且x+1最大不能超过X，故x的范围：Math.max(0, x - 1) 至 Math.min(Tools.rows - 1, x + 1)同理y的范围：Math.max(0, y - 1) 至 Math.min(Tools.cols - 1, y + 1)实现方法一理解简单，通俗易懂，代码执行效率较低，不推荐使用public static void countBomb(MineLabel[][] labels) { int count = 0; if (!mineLabel[i][j].isMine()) { // 计算雷块周围八个方向雷数 /** * 上 */ if (i > 0) { if (labels[i - 1][j].isMine()) { count++; } } /** * 左上 */ if (i > 0 && j>0) { if (labels[i - 1][j-1].isMine()) { count++; } } /** * 右上 */ if (i > 0&&j+1< Tools.cols) { if (labels[i - 1][j+1].isMine()) { count++; } } /** * 左 */ if (j>0) { if (labels[i][j-1].isMine()) { count++; } } /** * 右 */ if (j+1< Tools.cols) { if (labels[i][j+1].isMine()) { count++; } } /** * 左下 */ if (i+1< Tools.rows && j>0) { if (labels[i + 1][j-1].isMine()) { count++; } } /** * 下 */ if (i+1< Tools.rows) { if (labels[i + 1][j].isMine()) { count++; } } /** * 右下 */ if (i+1< Tools.rows && j+1< Tools.cols) { if (labels[i + 1][j+1].isMine()) { count++; } } } }实现方法二 /** * |计算周围雷数 */ public static void countBomb(MineLabel[][] labels) { int count = 0; for (int i = 0; i < Tools.rows; i++) { for (int j = 0; j < Tools.cols; j++) { count = 0; // 当前方格不是雷才计算周…

Java扫雷源码
type: item
date: 2022-05-18T19:44:00+08:00
description: 编译软件：IntelliJ IDEA / Eclipse环境: JDK1.5以上介绍：重写了一遍扫雷，代码更加规范，修复了一些小bug，优化了部分代码的算法，将各等级英雄榜独立运行效果图github项目地址：https://github.com/XG2020/Mine-sweeping{card-default width="100%" label="下载地址"}[btn href="https://www.lanzoum.com/iUNza0527yhg" type="primary"]点击下载[/btn] 复制密码: [copy]xggm[/copy] {/card-default}

Java实现扫雷小游戏一
type: item
date: 2022-05-18T18:14:00+08:00
description: 实现项目结构分析主界面主窗体（com.main/MainFrame.java）包含菜单栏、计数区panel和雷区panel。（1）构造方法public MainFrame() { init(); this.setIconImage(Tools.getImageIcon().getImage()); // 设置图标 this.setTitle("扫雷"); // 设置标题 this.setSize(new Dimension(220,300)); // 窗口大小 this.setResizable(false); // 这样让窗口不可放大 this.setLocationRelativeTo(null); this.setLocation(new Point(800,300)); // 设置窗口位置 this.setVisible(true); // 设置窗口显示 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 关闭窗口 }（2）初始化方法 private void init() { // 菜单栏 this.setJMenuBar(menuBar); }菜单栏（com.panel/BombJMenuBar.java）（1）添加菜单、菜单项等public class BombJMenuBar extends JMenuBar { // 菜单项 JMenu menuGame = new JMenu("游戏(G)"); JMenuItem menuItemStart = new JMenuItem("开局(N)"); JMenuItem menuItemLow = new JMenuItem("初级(B)"); JMenuItem menuItemMid = new JMenuItem("中级(I)"); JMenuItem menuItemHigh = new JMenuItem("高级(E)"); JMenu menuHero = new JMenu("英雄榜(T)"); JMenuItem menuHeroLow = new JMenuItem("初级英雄榜"); JMenuItem menuHeroMid = new JMenuItem("中级英雄榜"); JMenuItem menuHeroHigh = new JMenuItem("高级英雄榜"); JMenuItem menuItemOrder = new JMenuItem("自定义(C)"); JMenuItem menuItemExit = new JMenuItem("退出(X)"); JMenu menuHelp = new JMenu("帮助(H)"); JMenuItem menuItemAbout = new JMenuItem("关于扫雷(A)"); JMenuItem menuItemHole = new JMenuItem("外挂(W)"); // 需要在类中声明主窗体变量（属性）：作为菜单栏与主窗体交互的媒介 // 声明主窗体对象 MainFrame mainframe; // 编写构造函数和初始化界面方面 public BombJMenuBar(MainFrame mainframe) { this.mainframe = mainframe; init(); }（2）初始化方法 public void init() { // 设置快捷键 menuGame.setMnemonic('G'); // Alt + G menuItemStart.setMnemonic('N'); menuItemLow.setMnemonic('B'); menuItemMid.setMnemonic('I'); menuItemHigh.setMnemonic('E'); menuHero.setMnemonic('T'); menuItemOrder.setMnemonic('C'); menuItemExit.setMnemonic('X'); menuHelp.setMnemonic('H'); menuItemAbout.setMnemonic('A'); menuItemHole.setMnemonic('W'); // 把菜单添加到菜单栏 // 游戏菜单 this.add(menuGame); menuGame.add(menuItemStart); menuGame.addSeparator(); // 添加分隔线 menuGame.add(menuItemLow); menuGame.add(menuItemMid); menuGame.add(menuItemHigh); menuG…

Java实现扫雷小游戏介绍
type: item
date: 2022-05-02T15:28:00+08:00
description: 游戏介绍扫雷游戏是一款windows经典的电脑休闲小游戏，办公室打发无聊时间用的，非常受人喜爱，扫雷就是要把所有非地雷的格子揭开即胜利，踩到地雷格子就算失败。让玩家们找回童年玩此款游戏的乐趣，在游戏中只要掌握一些小技巧，闯关就会变得容易很多哦！初步分析通过扫雷界面图片可以分析出：界面是一个窗口，有菜单栏、标题栏和游戏区。菜单栏里有游戏和帮助两个菜单。游戏菜单里有：开局、初级、中级、高级、自定义、扫雷英雄榜、退出等7个子菜单；1、在游戏菜单里能够设置游戏的重新开局, 也可以通过点击游戏区里的笑脸来重新开局2、设置游戏的级别，分为初中高三个游戏级别：初级是由9*9的方格组成，雷数为10，非雷数71；中级由16*16的方格组成，排有40个雷，非雷数为216；高级是由16*30的方格组成，其中有99个雷，非雷数为381；3、自定义功能能够让玩家重新定义游戏的布局（行列范围9~30）与雷数（少于格子数且不能全是雷）；4、表情 游戏仍然在继续的时候显示微笑的表情::(呵呵)，当鼠标按住方格的时候显示惊讶的表情::(惊讶)，踩中地雷的时候显示悲哀的表情::(泪)，当你成功排除了所有雷，就会显示酷的表情::(酷)。5、在你翻开第一个方块起，计算器就开始计时，直到你成功排掉所有地雷或者踩中地雷的时候就结束计时。游戏规则与玩法游戏规则扫雷就是要把所有非地雷的格子揭开即胜利，踩到地雷格子就算失败；游戏主区域由很多个方格组成；使用鼠标左键随机点击一个方格，方格即被打开并显示出方格中的数字；方格中数字则表示其周围的8个方格隐藏了几颗雷；如果点开的格子为空白格，即其周围有0颗雷，则其周围格子自动打开，如果其周围还有空白格，则会引发连锁反应；在你认为有雷的格子上，点击右键即可标记雷，如果不能确定，可以双击右键即标记问号；如果一个已打开格子周围所有的雷已经正确标出，则可以在此格上同时点击鼠标左右键以打开其周围剩余的无雷格。玩法左键单击：在判断出不是雷的方块上按下左键，可以打开该方块。如果方块上出现数字，则该数字表示其周围3×3区域中的地雷数（一般为8个格子，对于边块为5个格子，对于角块为3个格子，所以扫雷中最大的数字为8）；如果方块上为空（相当于0），则可以递归地打开与空相邻的方块；如果不幸触雷，则游戏结束。右键单击：在判断为地雷的方块上按下右键，可以标记地雷（显示为小红旗）。标记地雷后重复一次右击则标记（？），需要一次或两次操作右击来取消标雷）。双击：同时按下左键和右键完成双击。当双击位置周围已标记雷数等于该位置数字时操作有效，相当于对该数字周围未打开的方块均进行一次左键单击操作。地雷未标记完全时使用双击无效。若数字周围有标错的地雷，则游戏结束。需求分析扫雷的左键逻辑。扫雷中鼠标左键被用来打开当前地图上的方块，但是如果你仔细研究，就会发现方块被打开发生在鼠标左键抬起之后，而不是鼠标左键按下的时候，这一点非常重要。如果在已经开启的方块上点击鼠标是没有任何作用的，并且如果方块上方被标记为旗帜，则该方块也无法被鼠标左键开启，这也是为了防止误操作导致游戏意外结束。如果游戏在初始状态，鼠标左键的抬起事件会触发了雷区（或者称之为地图）的初始化以及方块打开操作，并开始计时。如果游戏处于运行状态，则要判断点击的位置是否为地雷，如果是地雷直接结束，否则执行默认的方块打开操作。鼠标右键主要是用来标记当前方块的属性，是地雷（旗帜）还是不确定（问号），这里需要注意的是标记的过程中，是鼠标点击的时候就进行了，而不是按键抬起之后。随着方块标记的转变，地雷的显示数量也随之改变。这里还有一个小细节，就是鼠标的右键操作并不会导致游戏开始计时，换句话说右键操作并不会让游戏进入运行状态。自动打开操作是扫雷游戏的基本规则。如果在双击（左右键）的位置存在一个数字，且周围 8 个方块上方已经被标记上了和数字相同的旗帜，则同时点击鼠标左右键会自动打开周围未标记的方块。方块被打开是在鼠标弹起操作后，双击按下只是显示相关方块的背景，给人的效果是方块被按下去。统计点击位置周围的标记数量，标记数量和显示数字一致的话，打开剩余方块。这里有个小细节，就是打开的时候并不是仅仅打开周围的 8 个方块，如果这 8 个方块中存在空白的情况，会触发成片开启的情况。软件功能框架图