Java Swing实现扫雷小游戏

网友投稿 263 2023-01-27


Java Swing实现扫雷小游戏

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);// hang

int j = (int) (Math.random() * map[0].length);// lie

if (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 stub

for (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);

}

}

@Override

public void actionPerformed(ActionEvent e) {// 事件监听处理

// TODO Auto-generated method stub

if (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 tJZbQijzustub

int 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);

}

}

}

@Override

public void mouseClicked(MouseEvent e) {

// TODO Auto-generated method stub

int 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;

}

}

}

@Override

public void mousePressed(MouseEvent e) {

// TODO Auto-generated method stub

}

@Override

public void mouseReleased(MouseEvent e) {

// TODO Auto-generated method stub

}

@Override

public void mouseEntered(MouseEvent e) {

// TODO Auto-generated method stub

}

@Override

public void mouseExited(MouseEvent e) {

// TODO Auto-generated method stub

}

}

3.实现效果

4.主要功能实现

(1)基础扫雷功能(随机布雷,插旗)

(2)可以选择难度

(3)可以自定义扫雷的雷的数量以及格子数

(4)设置时间

(5)添加排行榜功能(根据时间存入数据库排序)

(6)外打包成exe文件(带jre)可以多平台运行. (使用exe4j打包jar包)

需要源码的可以留个邮箱!这是源码:扫雷游戏


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:java版微信公众平台后台接入
下一篇:共享文件系统怎么找(计算机共享文件怎么找)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~