因为是我的课程设计,要是有冲突就不好了,转载注明出处!!!

程序很简单,毕竟我是搞acm的,我就只介绍一下闪光点。

中心空白搜索的时候,我用的DFS;

有一点是要注意的,就是JFrame不支持重画,还好机智我用的是JPanel,利用这个画板重画游戏区。

API文档之后补上。

package com.TreeDream.MyGame;

public class Block {

    String name;
int number;
boolean boo = false; public void setName(String name) {
this.name = name;
} public void setNumber(int n) {
number = n;
} public int getNumber() {
return number;
} public String getName() {
return name;
} public void setIsMine(boolean boo) {
this.boo = boo;
} public boolean isMine() {
return boo;
} }

Block

package com.TreeDream.MyGame;

import java.awt.CardLayout;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel; public class BlockView extends JPanel {
JLabel blockName; //标签
JButton blockCover; //按钮
CardLayout card; public BlockView() {
card = new CardLayout();
setLayout(card); blockName = new JLabel();
blockCover = new JButton(); add("cover",blockCover);
add("name",blockName); } public void setName(String name) {
blockName.setText(name);
} public String getName() {
return blockName.getText();
} public void seeBlockName() {
card.show(this, "name");
} public void seeBlockCover() {
card.show(this, "cover");
validate();
} public JButton getBlockCover() {
return blockCover;
} public JLabel getBlockName () {
return blockName;
} }

BlockView

package com.TreeDream.MyGame;

import java.util.LinkedList; 

public class LayMines {

    public void layMinesForBlock(Block[][] block,int mineCount){

        int row=block.length;
int colum=block[0].length;
LinkedList<Block> list=new LinkedList<Block>();//创建空链表 for(int i=0;i<row;i++){
for(int j=0;j<colum;j++){
list.add(block[i][j]);
}
}
while(mineCount>0){
int size=list.size();
int randomIndex=(int)(Math.random()*size);
Block b=(Block)list.get(randomIndex);
b.setName("*");
b.setIsMine(true);
list.remove(randomIndex);
mineCount--;
} for(int i=0;i<row;i++){//非雷
for(int j=0;j<colum;j++){
if(block[i][j].isMine()==false){
int mineNumber=0;//周围雷的设置
for(int k=Math.max(i-1,0);k<=Math.min(i+1,row-1);k++){
for(int t=Math.max(j-1,0);t<=Math.min(j+1,colum-1);t++){
if(block[k][t].isMine()==true){
mineNumber++;
}
}
} if(mineNumber==0){
block[i][j].setName("");
block[i][j].setNumber(mineNumber);
} else{
block[i][j].setName(""+mineNumber);
block[i][j].setNumber(mineNumber);
} }
}
}
} }

LayMines

 package com.TreeDream.MyGame;

 import java.applet.Applet;
import java.applet.AudioClip;
import java.awt.BorderLayout;
import sun.audio.*;
import java.io.*;
import java.net.MalformedURLException;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.MenuBar;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.security.cert.TrustAnchor; import javax.sound.midi.MidiChannel;
import javax.sound.sampled.AudioInputStream;
import javax.swing.BorderFactory;
import javax.swing.BoundedRangeModel;
import javax.swing.Icon;
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.JPanel;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.RowFilter;
import javax.swing.border.Border; /**
* 游戏布局
* @author YinJian
*
*/ public class MineMainFrame extends JFrame implements ActionListener,MouseListener { /**
* 菜单条
*/
JMenuBar menuBar = new JMenuBar();
/**
* 菜单
*/
JMenu about = new JMenu("关于");
/**
* 子菜单
*/
JMenuItem exItem,aboutItem; /**
* 行数输入文本框
*/
JTextField inputRow = new JTextField(5); /**
* 列数输入文本框
*/
JTextField inputColum = new JTextField(5); /**
* 雷数输入文本
*/
JTextField inputMineCount = new JTextField(5); /**
* 游戏对象
*/
MineMainFrame mainFrame = this; /**
* 开始按钮
*/
JButton start; /**
* 方块的二维数组
*/
Block block[][];
/**
* 方块的视图数组
*/
BlockView blockView[][]; /**
* 深搜标记
*/
boolean vis[][]; /**
* 雷是否被插旗
*/
boolean isFlag[][]; /**
* 当前插旗的数目
*/
int flagNum; /**
* 游戏行数
*/
int row; /**
* 游戏列数
*/
int colum; /**
* 游戏雷数
*/
int mineCount; /**
* 游戏中心区
*/
JPanel pCenter; /**
* 游戏输入区
*/
JPanel pNorth; /**
* 游戏雷的布局对象
*/
LayMines lay; Icon icon1 = new ImageIcon("img/1.jpg");
Icon icon2 = new ImageIcon("img/2.jpg");
Icon icon3 = new ImageIcon("img/3.jpg");
Icon icon4 = new ImageIcon("img/4.jpg");
Icon icon5 = new ImageIcon("img/5.jpg");
Icon icon6 = new ImageIcon("img/6.jpg");
Icon icon7 = new ImageIcon("img/7.jpg");
Icon icon8 = new ImageIcon("img/8.jpg");
Icon icon9 = new ImageIcon("img/9.jpg");
Icon iconflag = new ImageIcon("img/红旗.jpg");
Icon iconmine = new ImageIcon("img/雷.jpg"); /**
* 音乐
*/
AudioClip music; /**
* 游戏初始化,构造函数
* @param title 游戏标题
*/
public MineMainFrame(String title) {
setTitle(title); //插入音乐
File file = new File("musics/Lone Ranger.wav"); try {
music = Applet.newAudioClip(file.toURI().toURL());
music.play();
} catch (MalformedURLException e) {
e.printStackTrace();
} //菜单制作
exItem = new JMenuItem("退出");
aboutItem = new JMenuItem("介绍"); aboutItem.addActionListener(new AboutListen());
exItem.addActionListener(new exitActionListen()); about.add(aboutItem);
about.add(exItem); menuBar.add(about); setJMenuBar(menuBar); //画游戏区域
start = new JButton("开始");
pCenter = new JPanel();
pNorth = new JPanel();
pNorth.setBackground(Color.red); start.addActionListener(this);
inputColum.addActionListener(this);
inputMineCount.addActionListener(this);
inputRow.addActionListener(this); pNorth.add(new JLabel("row"));
pNorth.add(inputRow);
pNorth.add(new JLabel("col"));
pNorth.add(inputColum);
pNorth.add(new JLabel("count"));
pNorth.add(inputMineCount);
pNorth.add(start);
add(pNorth, BorderLayout.NORTH);
setBounds(300, 100, 550, 550);
setVisible(true);
validate();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
} /**
* 监听文本框,开始按钮,和游戏区的动作
*/
public void actionPerformed(ActionEvent e) {
String str = e.getActionCommand();
if (e.getSource() == inputRow) {
row = Integer.parseInt(str);
System.out.println(row);
}
if (e.getSource() == inputColum) {
colum = Integer.parseInt(str);
System.out.println(colum);
}
if (e.getSource() == inputMineCount) {
mineCount = Integer.parseInt(str);
System.out.println(mineCount);
} else {
JButton source = (JButton) e.getSource();
if (source != start) {
int m = -1, n = -1;
for (int i = 0; i < row; i++) {
for (int j = 0; j < colum; j++) {
if (source == blockView[i][j].getBlockCover()) {
m = i;
n = j;
break;
}
}
}
if (block[m][n].isMine()) {
for (int i = 0; i < row; i++) {
for (int j = 0; j < colum; j++) {
blockView[i][j].getBlockCover().removeActionListener(this);
if (block[i][j].isMine()) {
blockView[i][j].seeBlockName();
}
}
}
JOptionPane.showMessageDialog(this, "小朋友你挂了哦!快看看你踩到哪个雷了啊"); } else {
if (block[m][n].getNumber() > 0) {
vis[m][n] = true;
blockView[m][n].seeBlockName();
} else if (block[m][n].getNumber() == 0) {
dfs(m, n);
}
}
}
if (source == start) {
remove(this.pCenter);
pCenter = new JPanel();
flagNum = 0;
System.out.println("hello");
block = new Block[row][colum];
vis = new boolean[row][colum];
isFlag = new boolean[row][colum]; for (int i = 0; i < row; i++) {
for (int j = 0; j < colum; j++) {
block[i][j] = new Block();
vis[i][j] = false; }
} lay = new LayMines();
lay.layMinesForBlock(block, mineCount); blockView = new BlockView[row][colum]; pCenter.setLayout(new GridLayout(row, colum)); for (int i = 0; i < row; i++) {
for (int j = 0; j < colum; j++) {
blockView[i][j] = new BlockView();
// blockView[i][j].setName(block[i][j].getName());
// 给blockView视图添加上图片
if (block[i][j].getNumber() > 0) { if (block[i][j].getNumber() == 1)
blockView[i][j].getBlockName().setIcon(icon1);
if (block[i][j].getNumber() == 2)
blockView[i][j].getBlockName().setIcon(icon2);
if (block[i][j].getNumber() == 3)
blockView[i][j].getBlockName().setIcon(icon3);
if (block[i][j].getNumber() == 4)
blockView[i][j].getBlockName().setIcon(icon4);
if (block[i][j].getNumber() == 5)
blockView[i][j].getBlockName().setIcon(icon5);
if (block[i][j].getNumber() == 6)
blockView[i][j].getBlockName().setIcon(icon6);
if (block[i][j].getNumber() == 7)
blockView[i][j].getBlockName().setIcon(icon7);
if (block[i][j].getNumber() == 8)
blockView[i][j].getBlockName().setIcon(icon8);
if (block[i][j].getNumber() == 9)
blockView[i][j].getBlockName().setIcon(icon9);
} if (block[i][j].isMine()) {
blockView[i][j].getBlockName().setIcon(iconmine);
isFlag[i][j] = false;
} pCenter.add(blockView[i][j]);
blockView[i][j].getBlockCover().addActionListener(this);
blockView[i][j].getBlockCover().addMouseListener(this);
}
} add(pCenter, BorderLayout.CENTER);
setVisible(true);
validate();
}
} } /**
* dfs的方向
*/
int dr[] = { -1, -1, -1, 0, 0, 1, 1, 1 };
/**
* dfs的方向
*/
int dc[] = { -1, 0, 1, -1, 1, -1, 0, 1 }; /**
* 深度优先搜索
* @param x 行坐标
* @param y 列坐标
*/
public void dfs(int x, int y) { vis[x][y] = true;
blockView[x][y].seeBlockName(); for (int i = 0; i < 8; i++) {
int dx = x + dr[i];
int dy = y + dc[i]; if (dx >= 0 && dx < row && dy >= 0 && dy < colum && !block[dx][dy].isMine() && !vis[dx][dy]) {
if (block[dx][dy].getNumber() == 0) {
dfs(dx, dy);
} else {
vis[dx][dy] = true;
blockView[dx][dy].seeBlockName();
}
}
} } /**
* 判断是否胜利
*/
void win() {
int flag = 0;
for (int i = 0; i < row; i++) {
for (int j = 0; j < colum; j++) {
if (block[i][j].isMine()==true&&isFlag[i][j] == true)
flag ++;
}
}
if (flag == mineCount) {
for (int i = 0; i < row; i++) {
for (int j = 0; j < colum; j++) {
blockView[i][j].getBlockCover().removeActionListener(this);
blockView[i][j].getBlockCover().removeMouseListener(this);
}
}
JOptionPane.showMessageDialog(this, "小朋友,恭喜你胜利了啊"); } if (flagNum>mineCount) {
for (int i = 0; i < row; i++) {
for (int j = 0; j < colum; j++) {
blockView[i][j].getBlockCover().removeActionListener(this);
blockView[i][j].getBlockCover().removeMouseListener(this);
}
}
JOptionPane.showMessageDialog(this, "小朋友,你违规了,你的小红旗数目太多了!");
} } /**
* 鼠标右击插上红旗
*/
@Override
public void mouseClicked(MouseEvent e) { // 鼠标单击
JButton button = (JButton) e.getSource(); if (e.getButton() == MouseEvent.BUTTON3) { // 右击鼠标插上红旗在JButton上,不能是JLabel上,不然就给出答案了;
button.setIcon(iconflag);
flagNum ++;
// isFlag[][]
int m=-1, n=-1;
for (int i = 0; i < row; i++) {
for (int j = 0; j < colum; j++) {
if (button == blockView[i][j].getBlockCover()) {
m = i;
n = j;
break;
}
}
}
isFlag[m][n] = true;
button.removeMouseListener(this);
win();
} } @Override
public void mouseEntered(MouseEvent e) { // 鼠标进入 } @Override
public void mouseExited(MouseEvent e) { // 鼠标离开组件 } @Override
public void mousePressed(MouseEvent e) { // 鼠标按下 } @Override
public void mouseReleased(MouseEvent e) { // 鼠标释放 } /**
* 菜单退出的动作事件
* @author YinJian
*
*/
public class exitActionListen implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
} /**
* 菜单关于的动作时间
* @author YinJian
*
*/
public class AboutListen implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(mainFrame, "尹建制作", "关于扫雷", JOptionPane.PLAIN_MESSAGE);
}
} }

MineMainFrame

 package com.TreeDream.MyGame;

 /**
* 游戏创建
* @author YinJian
*
*/ public class Main { /**
* 主函数创建游戏
* @param args
*/
public static void main(String[] args) {
new MineMainFrame("winmine");
} }

Main

最新文章

  1. 高性能网站架构设计之缓存篇(2)- Redis C#客户端
  2. 关于SQL中的Update语句
  3. ### 学习《C++ Primer》- 8
  4. [一]初识SpringMVC
  5. (原创)speex与wav格式音频文件的互相转换(二)
  6. 设计模式之开篇(C#语法)
  7. Linux内核设计基础(十)之内核开发与总结
  8. pythonBasic
  9. SQL Server 性能调优培训引言
  10. Linux网络管理之net-tools VS iproute2
  11. css中的text-overflow
  12. 游戏里的动态阴影-ShadowMap实现原理
  13. vue路由跳转 vue-router的使用
  14. SpriteBuilder物理对象的父子关系
  15. java导入excel时处理日期格式(已验证ok)
  16. django csrftoken
  17. centos7搭建ELK Cluster集群日志分析平台(三):Kibana
  18. SQL Server双机热备之后项目的FailOver自动连接
  19. 【CSS小技巧】 用 CSS 实现一个宽高等比自适应容器
  20. 【RF库Collections测试】Create Dictionary

热门文章

  1. ASP.Net的两种开发模式
  2. 改善你的jQuery的25个步骤 千倍级效率提升
  3. JMeter学习-025-JMeter 命令行(非GUI)模式详解(三)-测试图形化 HTML 报表(dashboard)生成
  4. 定时器中实现数据库表数据移动的功能,Exception in thread &quot;Timer-0&quot; isExist java.lang.NullPointerException定时器中线程报错。
  5. 学霸数据处理项目之数据处理网页以及后台以及C#代码部分开发者手册
  6. .net 调用java rest ful api 实例
  7. RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.0 版新增消息管理
  8. powershell
  9. 一些有意思的VR设备介绍
  10. 对点餐APP现阶段开发的问题