swing设计扫雷心得

最近学习swing学习之余做了一个小游戏–扫雷

1,前期设计

2,实现

其实完成这个游戏的核心就在于对数组的操纵,下面贴主要代码Main.java:

package first;import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.Timer;import com.mysql.jdbc.Connection;
import com.mysql.jdbc.Statement;public class Main extends JFrame implements ActionListener, MouseListener {/*** 义建*/private static final long serialVersionUID = 1L;// 前期参数声明JMenuItem JmiNew, JmiSave, JmiOpen, JmiExit, Jmichuji, Jmizhongji, Jmigaoji, JmishowInFo, JmiZiding;Toolkit toolKit = Toolkit.getDefaultToolkit(); // 获取默认工具包。Clipboard clipboard = toolKit.getSystemClipboard();// 获取系统 Calibrate// 的一个实例,作为本机平台提供的剪贴板工具的接口。//两个图标ImageIcon icon = new ImageIcon("G:\\eclipse-workspace\\classTest_ThunderGame\\mine.png");ImageIcon icon1 = new ImageIcon("G:\\eclipse-workspace\\classTest_ThunderGame\\flag.png");private static int NUM = 1;// 这个NUM是雷数,可以编写一个程序来改变// private static final int SNUM = 9;// 这个SNUM是扫雷的格数,可以编写一个程序来改变private JButton[][] jb;private int[][] map;boolean[][] flags;boolean[][] flag;int coutTime;// 声明connection对象Connection con;// 驱动程序名String driver = "com.mysql.jdbc.Driver";// url:指向要访问的数据库名String url = "jdbc:mysql://localhost:3306/testsql3";// mysql配置的用户名String user = "root";// 密码String password = "huang";public Main(int SNUM, int Mines) {// 主要界面构造函数setTitle("扫雷");// 初始雷数量NUM = Mines;JMenuBar greenBar = new JMenuBar();// 菜单容器greenBar.setOpaque(true);greenBar.setBackground(new Color(250, 250, 250));greenBar.setPreferredSize(new Dimension(800, 28));greenBar.setFont(new Font(Font.DIALOG_INPUT, Font.ITALIC, 16));// 菜单JMenu fileMenu1 = new JMenu("游戏");JMenu fileMenu2 = new JMenu("难度");JMenu fileMenu3 = new JMenu("帮助:");greenBar.add(fileMenu1);greenBar.add(fileMenu2);greenBar.add(JmishowInFo = fileMenu3);fileMenu1.setFont(new Font(Font.DIALOG_INPUT, Font.ITALIC, 16));fileMenu2.setFont(new Font(Font.DIALOG_INPUT, Font.ITALIC, 16));fileMenu3.setFont(new Font(Font.DIALOG_INPUT, Font.ITALIC, 16));// 菜单项fileMenu1.add(JmiNew = new JMenuItem(" 新游戏 "));fileMenu1.add(JmiSave = new JMenuItem(" 排行版 "));fileMenu1.add(JmiZiding = new JMenuItem(" 自定义 "));fileMenu1.addSeparator();fileMenu1.add(JmiExit = new JMenuItem(" 退出 "));fileMenu2.add(Jmichuji = new JMenuItem(" 初级 "));fileMenu2.add(Jmizhongji = new JMenuItem(" 中级 "));fileMenu2.add(Jmigaoji = new JMenuItem(" 高级 "));fileMenu3.add(JmishowInFo = new JMenuItem(" 开发者信息 "));JmiNew.addActionListener(this);JmiExit.addActionListener(this);JmiSave.addActionListener(this);JmishowInFo.addActionListener(this);Jmichuji.addActionListener(this);Jmizhongji.addActionListener(this);Jmigaoji.addActionListener(this);JmiZiding.addActionListener(this);JmiZiding.setFont(new Font(Font.DIALOG_INPUT, Font.ITALIC, 16));JmishowInFo.setFont(new Font(Font.DIALOG_INPUT, Font.ITALIC, 16));JmiNew.setFont(new Font(Font.DIALOG_INPUT, Font.ITALIC, 16));JmiSave.setFont(new Font(Font.DIALOG_INPUT, Font.ITALIC, 16));JmiExit.setFont(new Font(Font.DIALOG_INPUT, Font.ITALIC, 16));Jmichuji.setFont(new Font(Font.DIALOG_INPUT, Font.ITALIC, 16));Jmizhongji.setFont(new Font(Font.DIALOG_INPUT, Font.ITALIC, 16));Jmigaoji.setFont(new Font(Font.DIALOG_INPUT, Font.ITALIC, 16));setJMenuBar(greenBar);Image icon = Toolkit.getDefaultToolkit().getImage("G:\\eclipse-workspace\\classTest_ThunderGame\\mine.png");setIconImage(icon);setLayout(new GridLayout(SNUM, SNUM));jb = new JButton[SNUM][SNUM];map = new int[SNUM][SNUM]; // 将按钮映射到数组中flags = new boolean[map.length][map[0].length];// 保存点开记录表flag = new boolean[map.length][map[0].length];// 保存点开记录表int count = 0;// 布雷while (count < NUM) {int i = (int) (Math.random() * map.length);// hangint j = (int) (Math.random() * map[0].length);// lieif (map[i][j] != '*') {map[i][j] = '*';count++;}}for (int i = 0; i < SNUM; i++) {for (int j = 0; j < SNUM; j++) {jb[i][j] = new JButton();jb[i][j].setName(i + "_" + j);jb[i][j].setBackground(new Color(220, 220, 220));jb[i][j].setFont(new Font(Font.DIALOG_INPUT, Font.ITALIC, 10));jb[i][j].addActionListener(this);jb[i][j].addMouseListener(this);// 加入mouse监听add(jb[i][j]);}}// 计时器JLabel ststus = new JLabel();JLabel Times = new JLabel();JLabel miao = new JLabel();add(ststus);add(Times);Times.setText(" 0  ");miao.setText("  秒");setTimer(Times);coutTime = 0;ststus.setText("                                              时间:");greenBar.add(ststus);greenBar.add(Times, RIGHT_ALIGNMENT);greenBar.add(miao, RIGHT_ALIGNMENT);Times.setFont(new Font(Font.DIALOG_INPUT, Font.ITALIC, 16));ststus.setFont(new Font(Font.DIALOG_INPUT, Font.ITALIC, 16));miao.setFont(new Font(Font.DIALOG_INPUT, Font.ITALIC, 16));setSize(700, 700);setLocationRelativeTo(null);setVisible(true);// setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setDefaultCloseOperation(DISPOSE_ON_CLOSE); // 加入这一行}private void setTimer(JLabel time) {// 时间监听final JLabel varTime = time;Timer timeAction = new Timer(1000, new ActionListener() {public void actionPerformed(ActionEvent e) {coutTime++;varTime.setText("" + coutTime);}});timeAction.start();}private void showTheClick(int x, int y) {// 点击事件实现if (map[x][y] == '*') {jb[x][y].setIcon(icon);showMines();} else {int count1 = 0;for (int a = x - 1; a <= x + 1; a++) {for (int b = y - 1; b <= y + 1; b++) {if (!(a < 0 || b < 0 || b >= map[0].length || a >= map.length) && map[a][b] == '*')count1++;}}flags[x][y] = true;if (count1 == 0) {jb[x][y].setBackground(Color.white);} else {jb[x][y].setText(count1 + "");jb[x][y].setFont(new Font(Font.DIALOG_INPUT, Font.ITALIC, 20));jb[x][y].setBackground(Color.white);}if (count1 == 0) {for (int i = x - 1; i <= x + 1; i++) {for (int j = y - 1; j <= y + 1; j++) {if (!(i < 0 || j < 0 || i >= map.length || j >= map[0].length)) {if (!(i == x && j == y) && flags[i][j] == false) {showTheClick(i, j);//循环遍历} else {// 防止重复访问}}}}}}}private void showMines() {// 显示所有雷// TODO Auto-generated method stubfor (int i = 0; i < map.length; i++) {// 显雷for (int j = 0; j < map.length; j++) {if (map[i][j] == '*') {jb[i][j].setIcon(icon);//}}}// 结束游戏int b = JOptionPane.showOptionDialog(null, "哎呀,炸了炸了,新游戏?", "确认框", JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE, null, null, null);if (b == 1) {System.exit(0);} else {setVisible(false);new Main(map.length,NUM);}}@Overridepublic void actionPerformed(ActionEvent e) {// 事件监听处理// TODO Auto-generated method stubif (e.getSource() == JmiNew) {setVisible(false);new Main(map.length,NUM);} else if (e.getSource() == JmiSave) {showRange();} else if (e.getSource() == JmiExit) {System.exit(0);} else if (e.getSource() == JmiZiding) {new SelfMines();} else if (e.getSource() == Jmichuji) {setVisible(false);new Main(5,3);} else if (e.getSource() == JmishowInFo) {new MyInfo();} else if (e.getSource() == Jmizhongji) {setVisible(false);new Main(10,10);} else if (e.getSource() == Jmigaoji) {setVisible(false);new Main(20,60);} else {Object obj = e.getSource();int x, y;String[] strM = ((JButton) obj).getName().split("_");x = Integer.parseInt(strM[0]);y = Integer.parseInt(strM[1]);showTheClick(x, y);checkSuccess();// 检查是否游戏结束}}private void showRange() {// 显示排行榜new Shiyan13(map.length);}private void checkSuccess() {//判断游戏是否结束// TODO Auto-generated method stubint count = map.length * map[0].length;for (int i = 0; i < map.length; i++) {for (int j = 0; j < map[0].length; j++) {if (flags[i][j] == true)count--;}}if (count == NUM) {String uuid = UUID.randomUUID().toString().replaceAll("-", "");//表唯一标示uuid// 链接数据库,存储时间数据try {Class.forName(driver);con = (Connection) DriverManager.getConnection(url, user, password);String sql;if (!con.isClosed()) {// ta.setText("");System.out.println("连接数据库成功");// 创建对象Statement statement = (Statement) con.createStatement();//if (map.length == 10) {// //要执行的sql语句sql = "insert into middlerange(userId,userTime) values(\"" + uuid + "\"," + coutTime + ");";statement.executeUpdate(sql);con.close();} else if (map.length == 5) {sql = "insert into rang(userid,userTime) values(\"" + uuid + "\"," + coutTime + ");";statement.executeUpdate(sql);con.close();} else if (map.length == 20) {sql = "insert into toprange(userId,userTime) values(\"" + uuid + "\"," + coutTime + ");";statement.executeUpdate(sql);con.close();}else{}}} catch (ClassNotFoundException e) {// 数据库驱动类异常处理System.out.println("error");e.printStackTrace();} catch (SQLException e) {// System.out.println(e);System.err.println("找不到数据");// int i=JOptionPane.showConfirmDialog(null, "你输入的sql语句有误",// "找不到",JOptionPane.YES_NO_OPTION);} catch (Exception e) {e.printStackTrace();} finally {System.out.println("数据库获取数据成功!");}int i = JOptionPane.showOptionDialog(null, "恭喜你过关了,是否继续?", "确认框", JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE, null, null, null);// ststus.setText("hello"+i);if (i == 1) {System.exit(0);} else {setVisible(false);new Main(map.length,NUM);}}}@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stubint c = e.getButton();if (c == MouseEvent.BUTTON3) {Object obj1 = e.getSource();int x, y;String[] strM = ((JButton) obj1).getName().split("_");x = Integer.parseInt(strM[0]);y = Integer.parseInt(strM[1]);if (flag[x][y] == false && flags[x][y] == false) {//插旗子jb[x][y].setIcon(icon1);flag[x][y] = true;} else {jb[x][y].setIcon(null);flag[x][y] = false;}}}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}}

3.实现效果:

4,主要功能实现:

(1) 基础扫雷功能(随机布雷,插旗)
(2) 可以选择难度
(3) 可以自定义扫雷的雷的数量以及格子数
(4) 设置时间
(5) 添加排行榜功能(根据时间存入数据库排序)
(6) 外打包成exe文件(带jre)可以多平台运行. (使用exe4j打包jar包)

需要源码的可以留个邮箱!这是源码https://pan.baidu.com/s/1eTijbJc 密码:giqy

使用Java_Swing来实现扫雷小游戏相关推荐

  1. 如何利用C#开发“扫雷”小游戏

    本文详细说明了利用C#语言开发"扫雷"小游戏的开发过程.

  2. 用C语言实现扫雷小游戏(附上思路+项目展示+源代码)

    文章目录 前言 一.扫雷小游戏整体思路讲解. 二.game.c各游戏功能函数的讲解 1.InitBoard 初始化数组函数讲解 2.DisplayBoard 打印格子函数讲解 3.Setmine 电脑 ...

  3. C语言编写扫雷小游戏

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/104992377 扫 ...

  4. 也分享自己做的JS扫雷小游戏

    看了草根程序猿分享的JS扫雷小游戏 想起去年的时候自己也做了一个 于是也拿出来分享之 先上截图~ 引用了jQuery,节省了很多鼠标点击上的判断 界面显然都是照搬Windows的扫雷啦 详细的内容注释 ...

  5. 使用C语言写一个扫雷小游戏

    前言 相信扫雷游戏小伙伴们肯定都玩过吧,学习了C语言中的数组.函数等基础内容之后就可以自己写一个简易的扫雷小游戏了,今天就我写扫雷小游戏的过程及思路写一篇博客,希望大家看完我的博客能有所收获. 软件及 ...

  6. 如何开发一个扫雷小游戏?

    如何用C#开发一个扫雷小游戏? 十分自豪的说,计算机编程就是变魔术,每一个coder都是一个魔术师. 初学C#的时候,我相信很多人都和我一样,学会了基本语法,掌握了基本的数据结构,也见过了不少微软提供 ...

  7. rust游戏亮度怎么调亮点_之前用Rust写的扫雷小游戏

    这次来分享一下之前用Rust写的一个扫雷小游戏,目前能在Windows下运行.Github仓库: https://github.com/crlf0710/charlesmine-rs​github.c ...

  8. 用C语言实现一个简单的扫雷小游戏(附全代码及教程)

    本文实例为大家分享了C语言实现扫雷游戏的具体代码,供大家参考,具体内容如下: 首先,创建一个text.c文件: 编写主函数: int main() {test();return 0; } 定义test ...

  9. C语言实现扫雷小游戏 纯小白 非黑窗口

    C语言实现一个普通的扫雷小游戏 纯小白所编(含代码非黑窗口!) 扫雷 主要功能 1.创建一个图形界面 2.了解扫雷游戏的原理 3.随机生成雷的位置 4.为整个数组加密,并在雷周围的位置加一 5.导入图 ...

最新文章

  1. 添加Soap头来增加Web Service的安全性
  2. 【组队学习】【24期】数据挖掘实践(智慧海洋)
  3. python爬虫程序-Python网络爬虫实战(一)快速入门
  4. UA MATH574M 统计学习V Variable Selection: LASSO
  5. c++动态链接库及静态链接库的生成与使用
  6. JDK5.0新特性系列---11.5.3线程 同步装置之CyclicBarrier
  7. java案例代码11-学生类的录入,查询,对象的封装
  8. 使用 HTML 和 CSS 创建响应式猫猫图片库
  9. PMP第六版十五至尊图记忆方法
  10. acc转mp3最好用的格式转换器推荐?
  11. bandzip、winzip与7-zip
  12. 开发人员的不断流动、让我们更加坚定信念,一定要控制好整个系统的底层架构、核心设计、日常质量检查工作
  13. Linux内核设计与实现(十)| 页高速缓存和页回写
  14. 兄弟们,我又回来了,干货太多让你们久等了
  15. iOS xcode9中framework静态库的创建以及xib和图片的使用记录
  16. easyexcel表头单个字体样式注解使用
  17. mysql查询最新插入的一条_我刚数据库中插入一条记录,紧接着再去查询却查不到?...
  18. Qt5.订餐系统源代码
  19. 用ajax下载csv格式的文件
  20. 机会总是留给有准备的人--韦东山【转】

热门文章

  1. 项目框架:登录跳转页面
  2. 软件工程毕业设计 题目汇总 【不断更新中】
  3. 【ABAP学习笔记】
  4. 左右脑测试小程序的真正逻辑
  5. SaaSBase:最受欢迎的HR人力资源软件有哪些(上篇)
  6. netstat 介绍
  7. 软件工程实践总结——程序员的自我修养
  8. Matlab实现求合成不确定度
  9. 利用VBA移动文件,创建文件
  10. 22个常用Excel函数大全,直接套用,提升工作效率!