用Java实现简单扫雷程序

页面设置:框架是borderlayout,在上中下加入外面要加入的组件(左边和右边不加)。扫雷用的布局是gridlayout即网格布局,与扫雷界面天然契合。
组件:使用panel,button,frame,label等组件,最后集中到frame中形成整体。并对其加入适当的监听,监听算法的实现如下。
扫雷算法:一共要考虑三种情况,第一种是点到雷的情况,第二种是点到空的格的情况,第三种是点到有数字的情况。下面我们对这些情况一一进行考虑,完成算法的设计。首先随机生成一个扫雷的图,上面包含有随机生成的雷,雷旁边的数字和空白组成的矩阵matrix,之后所有的监听都依照这个矩阵matrix为参照。

①点到空的时候,调用递归算法寻找旁边空格(周围一圈)的将其显示(这里笔者就是帮他换了一个颜色,即完成了
显示工作,读者也可以将点击的button组件换成label),直到找到是数字的格就停止对这个方向上的显示。
②点到数字的时候,就将格子显示。
③点到雷的时候,显示全部matrix中的值,即结束游戏。

递归算法:当点击空白格时,对其周围一圈的格子进行查找,当它是隔空的时候就将它显示,如果不是就停止对这个格子上的递归算法。

参照矩阵matrix的生成:随机使用random函数随机生成1-size(扫雷的规模)的随机数,形成雷的横纵坐标,并加入matrix中,这里的矩阵是string类型的,雷用“*”表示,根据雷的位置,分别对其周围的格子上的数字加1,即形成参照矩阵。
算法的改进:加入菜单栏,实时计时器,改变扫雷游戏规模,及代码比较冗余(毕竟完成大于完美),这里为读者提供一个模板,读者可以以此参照做进一步修改。
欢迎评论区留言讨论!
下面是成品的展示图和源码:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;/** 扫雷*/class newJButton extends JButton {// 新建组合JButton类int axisx;int axisy;newJButton(String s, int axisx, int axisy) {super(s);this.axisx = axisx;this.axisy = axisy;}public int getaxisx() {return axisx;}public int getaxisy() {return axisy;}
}
public class MineTest implements ActionListener {// 组件定义static final int size = 10; // 扫雷游戏规模int time; // 计算雷的个数JFrame frame = new JFrame("扫雷");JPanel panel1 = new JPanel(); // 计时器JPanel panel2 = new JPanel(); // 笑脸JPanel panel3 = new JPanel(); // 初级扫雷newJButton t;newJButton t2;long programStart = System.currentTimeMillis();long programOver;String[][] matrix = new String[size][size]; // 扫雷信息记录矩阵newJButton[][] buttons = new newJButton[size][size]; // 创建扫雷按钮矩阵int[][] tip = new int[size][size]; // 判断是否可以显示按钮// 提示public void inittime() {t = new newJButton("进行中", 101, 101);t2 = new newJButton("/", 102, 102);panel2.add(t);panel2.add(t2);}// 笑脸public void initsmile() {newJButton b = new newJButton("O", 100, 100); // 将归零按键"O"的坐标设置为(100,100)b.addActionListener(this);panel1.add(b);}// 初级扫雷public void initmine() {panel3.setLayout(new GridLayout(10, 10, 1, 1));// panel3.setSize(250,250);for (int i = 0; i < size; i++) {for (int j = 0; j < size; j++) {// button.setSize(25,25);panel3.add(buttons[i][j]);}}}// 总界面的组合public void initcombine() {frame.setLayout(new BorderLayout());frame.add(panel1, BorderLayout.NORTH);frame.add(panel2, BorderLayout.CENTER);frame.add(panel3, BorderLayout.SOUTH);// frame.add(panel4);}// 扫雷页面初始化MineTest() {// 产生按钮for (int i = 0; i < size; i++) {for (int j = 0; j < size; j++) {newJButton jb = new newJButton(" ", i, j);jb.setBackground(Color.WHITE);jb.addActionListener(this);buttons[i][j] = jb;}}inittime();initsmile();initmine();initcombine();frame.setVisible(true);frame.setSize(500, 500);frame.setLocation(700, 300);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 可以关闭// frame.pack();// 产生size个雷并加入到矩阵中do {time = 0;pmatrix(); // 初始化原始矩阵boom(); // 加入雷for (int i = 0; i < size; i++) {for (int j = 0; j < size; j++) {if (matrix[i][j] == "*") {time = time + 1;}}}} while (time != 10);caculate(); // 计算扫雷矩阵中的距离// 形成改变颜色的状态矩阵for (int i = 0; i < size; i++) {for (int j = 0; j < size; j++) {if (matrix[i][j] == "0") {tip[i][j] = 0;} else {tip[i][j] = 1;}}}// 打印for (int i = 0; i < size; i++) {for (int j = 0; j < size; j++) {System.out.print(matrix[i][j] + " ");}System.out.println("\n");}}private void pmatrix() {// 扫雷矩阵初始化for (int i = 0; i < size; i++) {for (int j = 0; j < size; j++) {matrix[i][j] = "0";}}}private void boom() {// 产生炸弹;int num = 0;while (num < size) {int i = (int) (Math.random() * size);int j = (int) (Math.random() * size);matrix[i][j] = "*";num = num + 1;}}@Overridepublic void actionPerformed(ActionEvent e) {// 按钮响应事件newJButton temp = (newJButton) e.getSource();if (temp.getText() == "O") {// 产生size个雷并加入到矩阵中do {time = 0;pmatrix(); // 初始化原始矩阵boom(); // 加入雷for (int i = 0; i < size; i++) {for (int j = 0; j < size; j++) {if (matrix[i][j] == "*") {time = time + 1;}}}} while (time != 10);caculate(); // 计算扫雷矩阵中的距离// 形成改变颜色的状态矩阵for (int i = 0; i < size; i++) {for (int j = 0; j < size; j++) {if (matrix[i][j] == "0") {tip[i][j] = 0;} else {tip[i][j] = 1;}}}// 打印for (int i = 0; i < size; i++) {for (int j = 0; j < size; j++) {System.out.print(matrix[i][j] + " ");}System.out.println("\n");}for (int i = 0; i < size; i++) {for (int j = 0; j < size; j++) {buttons[i][j].setText(" ");buttons[i][j].setBackground(Color.WHITE);}}t.setLabel("进行中");t2.setLabel("/");programStart = System.currentTimeMillis();// System.out.println("smile");} else if (matrix[temp.getaxisx()][temp.getaxisy()] == "*") {for (int i = 0; i < size; i++) {for (int j = 0; j < size; j++) {if (matrix[i][j] != "0") {buttons[i][j].setText(matrix[i][j]);if (matrix[i][j] == "*") {buttons[i][j].setBackground(Color.RED);}}}}t.setLabel("失败");programOver = System.currentTimeMillis();t2.setLabel("" + (programOver - programStart) / 1000 + "s");} else if (matrix[temp.getaxisx()][temp.getaxisy()] != "0") {buttons[temp.getaxisx()][temp.getaxisy()].setText(matrix[temp.getaxisx()][temp.getaxisy()]);buttons[temp.getaxisx()][temp.getaxisy()].setBackground(Color.gray);} else if (matrix[temp.getaxisx()][temp.getaxisy()] == "0") {digui(temp.getaxisx(), temp.getaxisy());}}private void digui(int i, int j) {// 递归调用该函数,处理按钮是“0”的情况if (i == 0 && j == 0) {if (tip[i][j] == 0) {buttons[i][j].setBackground(Color.gray);tip[i][j] = 1;digui(i, j + 1);digui(i + 1, j + 1);digui(i + 1, j);} else {if (matrix[i][j] == "0") {buttons[i][j].setBackground(Color.gray);tip[i][j] = 1;} else {buttons[i][j].setText(matrix[i][j]);buttons[i][j].setBackground(Color.gray);tip[i][j] = 1;}}} else if (i == 0 && j == size-1) {if (tip[i][j] == 0) {buttons[i][j].setBackground(Color.gray);tip[i][j] = 1;digui(i, j - 1);digui(i + 1, j - 1);digui(i + 1, j);} else {if (matrix[i][j] == "0") {buttons[i][j].setBackground(Color.gray);tip[i][j] = 1;} else {buttons[i][j].setText(matrix[i][j]);buttons[i][j].setBackground(Color.gray);tip[i][j] = 1;}}} else if (i == size-1 && j == 0) {if (tip[i][j] == 0) {buttons[i][j].setBackground(Color.gray);tip[i][j] = 1;digui(i, j + 1);digui(i - 1, j + 1);digui(i - 1, j);} else {if (matrix[i][j] == "0") {buttons[i][j].setBackground(Color.gray);tip[i][j] = 1;} else {buttons[i][j].setText(matrix[i][j]);buttons[i][j].setBackground(Color.gray);tip[i][j] = 1;}}} else if (i == size-1 && j == size-1) {if (tip[i][j] == 0) {buttons[i][j].setBackground(Color.gray);tip[i][j] = 1;digui(i, j - 1);digui(i - 1, j - 1);digui(i - 1, j);} else {if (matrix[i][j] == "0") {buttons[i][j].setBackground(Color.gray);tip[i][j] = 1;} else {buttons[i][j].setText(matrix[i][j]);buttons[i][j].setBackground(Color.gray);tip[i][j] = 1;}}} else if (i == 0) {if (tip[i][j] == 0) {buttons[i][j].setBackground(Color.gray);tip[i][j] = 1;digui(i, j - 1);digui(i, j + 1);digui(i + 1, j - 1);digui(i + 1, j);digui(i + 1, j + 1);} else {if (matrix[i][j] == "0") {buttons[i][j].setBackground(Color.gray);tip[i][j] = 1;} else {buttons[i][j].setText(matrix[i][j]);buttons[i][j].setBackground(Color.gray);tip[i][j] = 1;}}} else if (j == 0) {if (tip[i][j] == 0) {buttons[i][j].setBackground(Color.gray);tip[i][j] = 1;digui(i - 1, j);digui(i + 1, j);digui(i - 1, j + 1);digui(i, j + 1);digui(i + 1, j + 1);} else {if (matrix[i][j] == "0") {buttons[i][j].setBackground(Color.gray);tip[i][j] = 1;} else {buttons[i][j].setText(matrix[i][j]);buttons[i][j].setBackground(Color.gray);tip[i][j] = 1;}}} else if (i == size-1) {if (tip[i][j] == 0) {buttons[i][j].setBackground(Color.gray);tip[i][j] = 1;digui(i - 1, j - 1);digui(i - 1, j);digui(i - 1, j + 1);digui(i, j - 1);digui(i, j + 1);} else {if (matrix[i][j] == "0") {buttons[i][j].setBackground(Color.gray);tip[i][j] = 1;} else {buttons[i][j].setText(matrix[i][j]);buttons[i][j].setBackground(Color.gray);tip[i][j] = 1;}}} else if (j == size-1) {if (tip[i][j] == 0) {buttons[i][j].setBackground(Color.gray);tip[i][j] = 1;digui(i - 1, j);digui(i + 1, j);digui(i - 1, j - 1);digui(i - 1, j);digui(i - 1, j);} else {if (matrix[i][j] == "0") {buttons[i][j].setBackground(Color.gray);tip[i][j] = 1;} else {buttons[i][j].setText(matrix[i][j]);buttons[i][j].setBackground(Color.gray);tip[i][j] = 1;}}} else {if (tip[i][j] == 0) {buttons[i][j].setBackground(Color.gray);tip[i][j] = 1;digui(i - 1, j - 1);digui(i - 1, j);digui(i - 1, j + 1);digui(i, j - 1);digui(i, j + 1);digui(i + 1, j - 1);digui(i + 1, j);digui(i + 1, j + 1);} else {if (matrix[i][j] == "0") {buttons[i][j].setBackground(Color.gray);tip[i][j] = 1;} else {buttons[i][j].setText(matrix[i][j]);buttons[i][j].setBackground(Color.gray);tip[i][j] = 1;}}}}public static void main(String[] args) {new MineTest();}private void caculate() {// 计算扫雷矩阵中的距离for (int i = 0; i < size; i++) {for (int j = 0; j < size; j++) {if (matrix[i][j] == "*") {if (i == 0 && j == 0) {if (matrix[i + 1][j] != "*") {matrix[i + 1][j] = String.valueOf(Integer.parseInt(matrix[i + 1][j]) + 1);}if (matrix[i + 1][j + 1] != "*") {matrix[i + 1][j + 1] = String.valueOf(Integer.parseInt(matrix[i + 1][j + 1]) + 1);}if (matrix[i][j + 1] != "*") {matrix[i][j + 1] = String.valueOf(Integer.parseInt(matrix[i][j + 1]));}} else if (i == 9 && j == 0) {if (matrix[i - 1][j] != "*") {matrix[i - 1][j] = String.valueOf(Integer.parseInt(matrix[i - 1][j]) + 1);}if (matrix[i - 1][j + 1] != "*") {matrix[i - 1][j + 1] = String.valueOf(Integer.parseInt(matrix[i - 1][j + 1]) + 1);}if (matrix[i][j + 1] != "*") {matrix[i][j + 1] = String.valueOf(Integer.parseInt(matrix[i][j + 1]) + 1);}} else if (i == 0 && j == 9) {if (matrix[i + 1][j] != "*") {matrix[i + 1][j] = String.valueOf(Integer.parseInt(matrix[i + 1][j]) + 1);}if (matrix[i + 1][j - 1] != "*") {matrix[i + 1][j - 1] = String.valueOf(Integer.parseInt(matrix[i + 1][j - 1]) + 1);}if (matrix[i][j - 1] != "*") {matrix[i][j - 1] = String.valueOf(Integer.parseInt(matrix[i][j - 1]) + 1);}} else if (i == 9 && j == 9) {if (matrix[i][j - 1] != "*") {matrix[i][j - 1] = String.valueOf(Integer.parseInt(matrix[i][j - 1]) + 1);}if (matrix[i - 1][j] != "*") {matrix[i - 1][j] = String.valueOf(Integer.parseInt(matrix[i - 1][j]) + 1);}if (matrix[i - 1][j - 1] != "*") {matrix[i - 1][j - 1] = String.valueOf(Integer.parseInt(matrix[i - 1][j - 1]) + 1);}} else if (i == 0) {if (matrix[i][j - 1] != "*") {matrix[i][j - 1] = String.valueOf(Integer.parseInt(matrix[i][j - 1]) + 1);}if (matrix[i][j + 1] != "*") {matrix[i][j + 1] = String.valueOf(Integer.parseInt(matrix[i][j + 1]) + 1);}if (matrix[i + 1][j - 1] != "*") {matrix[i + 1][j - 1] = String.valueOf(Integer.parseInt(matrix[i + 1][j - 1]) + 1);}if (matrix[i + 1][j] != "*") {matrix[i + 1][j] = String.valueOf(Integer.parseInt(matrix[i + 1][j]) + 1);}if (matrix[i + 1][j + 1] != "*") {matrix[i + 1][j + 1] = String.valueOf(Integer.parseInt(matrix[i + 1][j + 1]) + 1);}} else if (j == 0) {if (matrix[i - 1][j] != "*") {matrix[i - 1][j] = String.valueOf(Integer.parseInt(matrix[i - 1][j]) + 1);}if (matrix[i - 1][j + 1] != "*") {matrix[i - 1][j + 1] = String.valueOf(Integer.parseInt(matrix[i - 1][j + 1]) + 1);}if (matrix[i][j + 1] != "*") {matrix[i][j + 1] = String.valueOf(Integer.parseInt(matrix[i][j + 1]) + 1);}if (matrix[i + 1][j] != "*") {matrix[i + 1][j] = String.valueOf(Integer.parseInt(matrix[i + 1][j]) + 1);}if (matrix[i + 1][j + 1] != "*") {matrix[i + 1][j + 1] = String.valueOf(Integer.parseInt(matrix[i + 1][j + 1]) + 1);}} else if (i == 9) {if (matrix[i][j - 1] != "*") {matrix[i][j - 1] = String.valueOf(Integer.parseInt(matrix[i][j - 1]) + 1);}if (matrix[i][j + 1] != "*") {matrix[i][j + 1] = String.valueOf(Integer.parseInt(matrix[i][j + 1]) + 1);}if (matrix[i - 1][j - 1] != "*") {matrix[i - 1][j - 1] = String.valueOf(Integer.parseInt(matrix[i - 1][j - 1]) + 1);}if (matrix[i - 1][j] != "*") {matrix[i - 1][j] = String.valueOf(Integer.parseInt(matrix[i - 1][j]) + 1);}if (matrix[i - 1][j + 1] != "*") {matrix[i - 1][j + 1] = String.valueOf(Integer.parseInt(matrix[i - 1][j + 1]) + 1);}} else if (j == 9) {if (matrix[i - 1][j] != "*") {matrix[i - 1][j] = String.valueOf(Integer.parseInt(matrix[i - 1][j]) + 1);}if (matrix[i + 1][j] != "*") {matrix[i + 1][j] = String.valueOf(Integer.parseInt(matrix[i + 1][j]) + 1);}if (matrix[i - 1][j - 1] != "*") {matrix[i - 1][j - 1] = String.valueOf(Integer.parseInt(matrix[i - 1][j - 1]) + 1);}if (matrix[i][j - 1] != "*") {matrix[i][j - 1] = String.valueOf(Integer.parseInt(matrix[i][j - 1]) + 1);}if (matrix[i + 1][j - 1] != "*") {matrix[i + 1][j - 1] = String.valueOf(Integer.parseInt(matrix[i + 1][j - 1]) + 1);}} else {if (matrix[i - 1][j - 1] != "*") {matrix[i - 1][j - 1] = String.valueOf(Integer.parseInt(matrix[i - 1][j - 1]) + 1);}if (matrix[i - 1][j] != "*") {matrix[i - 1][j] = String.valueOf(Integer.parseInt(matrix[i - 1][j]) + 1);}if (matrix[i - 1][j + 1] != "*") {matrix[i - 1][j + 1] = String.valueOf(Integer.parseInt(matrix[i - 1][j + 1]) + 1);}if (matrix[i][j - 1] != "*") {matrix[i][j - 1] = String.valueOf(Integer.parseInt(matrix[i][j - 1]) + 1);}if (matrix[i][j + 1] != "*") {matrix[i][j + 1] = String.valueOf(Integer.parseInt(matrix[i][j + 1]) + 1);}if (matrix[i + 1][j - 1] != "*") {matrix[i + 1][j - 1] = String.valueOf(Integer.parseInt(matrix[i + 1][j - 1]) + 1);}if (matrix[i + 1][j] != "*") {matrix[i + 1][j] = String.valueOf(Integer.parseInt(matrix[i + 1][j]) + 1);}if (matrix[i + 1][j + 1] != "*") {matrix[i + 1][j + 1] = String.valueOf(Integer.parseInt(matrix[i + 1][j + 1]) + 1);}}}}}}}

用Java实现简单扫雷程序相关推荐

  1. java实现简单扫雷

    package com.test.swing;import java.awt.event.ActionEvent; import java.awt.event.ActionListener; impo ...

  2. java 实现简单扫雷

    package com.test.swing;import java.awt.event.ActionEvent; import java.awt.event.ActionListener; impo ...

  3. java udp简单聊天程序_Java基于UDP协议实现简单的聊天室程序

    最近比较闲,一直在抽空回顾一些java方面的技术应用. 今天没什么事做,基于udp协议,写了一个非常简单的聊天室程序. 现在的工作,很少用到socket,也算是对java网络编程方面的一个简单回忆. ...

  4. JAVA实现简单扫雷游戏

    这是我第一次写博客,初衷是想把我学到的东西展示出来,通过写博客的方式再捋一遍自己的思路.希望自己的一点点想法能够给其他人启发,我也要把自己存在的问题提出来,以此文为起点,树立写博客的习惯,在之后的日子 ...

  5. java实现简单扫雷小游戏

    本文实例为大家分享了java实现扫雷游戏的具体代码,供大家参考,具体内容如下 import java.awt.BorderLayout; import java.awt.Color; import j ...

  6. java扫雷教程_java实现简单扫雷游戏

    本文实例为大家分享了java实现简单扫雷游戏的具体代码,供大家参考,具体内容如下 package com.test.swing; import java.awt.event.ActionEvent; ...

  7. 扫雷java程序算法设计_基于Java的Windows扫雷游戏的设计与实现毕业论文+任务书+翻译及原文+源码+辅导视频...

    基于Java的Windows扫雷游戏的设计与实现 摘 要 扫雷这款游戏有着很长的历史,从扫雷被开发出来到现在进行了无数次的优化,这款游戏变得越来越让人爱不释手了,简单的玩法在加上一个好看的游戏界面,每 ...

  8. java 验证码图片识别_JavaSE图像验证码简单识别程序详解

    本文为大家分享了JavaSE图像验证码简单识别程序,供大家参考,具体内容如下 首先你应该对图片进行样本采集,然后将样本进行灰度处理,也就是变成黑白两色. 然后你就可以使用该类,对目标文件进行分析.具体 ...

  9. Java图形编程实验总结_JAVA实验报告简单绘图程序

    <JAVA实验报告简单绘图程序>由会员分享,可在线阅读,更多相关<JAVA实验报告简单绘图程序(8页珍藏版)>请在人人文库网上搜索. 1.实验三绘制图形一.实验目的学会JBut ...

最新文章

  1. AI 复活已故漫画家手冢治虫,出版新作续写传奇
  2. NameServer的总控逻辑
  3. MySQL【问题记录 01】报错 1709 - Index column size too large. The maximum column size is 767 bytes. 可能是最简单的方法
  4. 程序员面试金典 - 面试题 17.08. 马戏团人塔(最长上升子序 DP/二分查找)
  5. 231 · 自动补全
  6. spark streaming之 windowDuration、slideDuration、batchDuration​
  7. 灵思致远测色仪色差宝和颜色识别器APP介绍
  8. 【学习笔记】极其美妙的算法——FFT(快速傅里叶变换)
  9. 微信小程序云开发如何修改后台手动添加的数据
  10. Acrobat 虚拟打印机打印失败故障解决之一
  11. python批量更改word文件名_python批量修改word文件名
  12. 基于MATLAB的神经网络进行手写体数字识别(含鼠绘GUI / 数据集:MNIST)
  13. microstation level3 10 elliptical cone solid 、ellipsoid、polyhedron
  14. 跨越2009之华为总裁任正非
  15. 10组团队项目-中期总结
  16. Apache iceberg:Netflix 数据仓库的基石
  17. python空间分析库_空间分析:5-1.空间分析库PySAL的使用
  18. 关于primarykey 和key的注意事项
  19. 全志H6 Android7.0 OTA 相关
  20. 诺基亚x6 云服务器,诺基亚X6使用一周后的真实体验,看完决定买不买?

热门文章

  1. 如何获取可靠的国外服务器IP地址?
  2. WPF教程(十四)文本框
  3. 使用Go Fiber构建微服务
  4. PHP 首页导航栏源代码
  5. 【马斯克命悬一线】SpaceX打完最贵广告后,特斯拉宣布近7亿美元史上最大季度亏损...
  6. 单片机定时器c语言程序,单片机C语言编程定时器的几种表达方式
  7. 平安科技高级算法工程师瞿晓阳:云端终端双场景的AI加速研究 | 2018FMI人工智能与大数据高峰论坛(深圳站)
  8. Google大数据之——三篇著名论文中文版
  9. ios屏蔽更新的插件
  10. 聊聊这次试用期“被”离职和感悟(大前端组)