package minesweeping;
/*游戏功能介绍 1.显示N*N的雷区
2.随机埋下n个雷
3、用户点击某个位置
判断该位置是否有雷
(1)有雷 游戏结束
(2)没有雷
a翻转该位置、
b计算周围雷的个数
周围有雷 显示雷的个数
周围没有雷 翻转周围
4游戏过关的检测
附加功能: 计时 排行榜
编程实现
1创建工程SaoLei
2定义游戏的界面类
GUI界面的布局
JFrame:默认采用的是orderLayout边框布局
将整个屏幕分成了东西南北中
JPanel 中间容器 可以在其中放置多个其他界面元素
默认的是采用流式布局FlowLayout 从左到右放置 如果一行放不下,自动转到下一行
用户点击某个位置,进行一下处理
(1)判断该位置是否有雷
如果有雷,则游戏结束
没有雷 (1)将该位置翻转
(2)提示周围雷的个数
实现对按钮点击操作的处理--事件处理机制
用户在界面进行某个操作,触发一个事件(事件源,事件类型)
创建监视器,定义事件的处理方法
将监视器对象安装到事件源上
定义一个监视器类MyButtonListener
当第i个位置周围没有雷,实现自动翻转,将周围位置全部翻开,并传递下去
游戏过关的判断checkGameOver
判断status数组中值为-1的个数为N*N-M
*/
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.*;
//定义游戏的界面类
public class GameFrame extends JFrame {
/**
*
*/
// 定义游戏相关变量
JButton btnStart=new JButton("开始");
JLabel lblTime = new JLabel("时间:60");
int N = 9;// 雷区的大小N*N
int M = 10;// 雷的个数
// 定义雷区中N*N个按钮的数组、
JButton[] btns = new JButton[N * N];
// 表示N*N按钮下面是否有雷的状态 0--没有雷 1--有雷
int[] status = new int[N * N];
//定义游戏结束的标志
boolean isGameOver=false;
// 定义构造方法,进行界面的初始化
public GameFrame() {
setSize(400, 400);// 定义窗口的大小
setTitle("我的菜鸟扫雷vo.1");// 设置窗口标题
// 1.产生N*N个按钮,排列到屏幕的中央部分
createButtons();
// 随机产生M个雷
createLei();
// 定义产生M个雷的方法
// 给N*N个按钮设置事件的监听
MyButtonListener listener = new MyButtonListener();
for (int i = 0; i < N * N; i++) {
btns[i].addActionListener(listener);
btns[i].setEnabled(false);
}
// 设置开始按钮的时间监听
// btnStart.addActionListener(new MyButtonListener());
btnStart.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0)
{
if(arg0.getSource()==btnStart) {
for (int i = 0; i < N * N; i++) {
btns[i].setEnabled(true);
}
btnStart.setEnabled(false);
}
Global.GameIsRunning=true;
// 创建并启动倒计时线程
TimeThread t2 = new TimeThread(lblTime);
t2.start();
}
});
}
private void createLei() {
// TODO Auto-generated method stub
// 1.定义随机数产生雷
Random rd = new Random();
for (int i = 1; i <= M; i++) {
// 随机产生一个[0,N*N-1]个数
int x = rd.nextInt(N * N);
if(status[x]==0)
status[x] = 1;
// 设置该位置的状态为1--有雷
else
i--;
}// 显示雷的分布
/*for (int i = 0; i < N * N; i++) {
if (status[i] == 1)
btns[i].setBackground(Color.red);
}*/
}// end createLei
private void createButtons() {
// TODO Auto-generated method stub
for (int i = 0; i < N * N; i++) {
// 产生一个按钮对象
JButton btn = new JButton();
btn.setBackground(Color.blue);
// 加到数组中
btns[i] = btn;
}
// 2.将按钮放置到屏幕中
// 创建一个中间容器
JPanel pCenter = new JPanel();
// 设置屏幕的布局方式为网格布局(GridLayout)
pCenter.setLayout(new GridLayout(N, N));
for (int i = 0; i < N * N; i++) {
pCenter.add(btns[i]);// 将按钮放置到中间容器
this.add(pCenter, BorderLayout.CENTER);
}
// 3底部放置提示
JPanel pButton = new JPanel();
JLabel lbiNumber = new JLabel("雷的个数:10");
pButton.add(btnStart);
pButton.add(lblTime);
pButton.add(lbiNumber);
this.add(pButton, BorderLayout.SOUTH);
}// end MyButtonListener
// 定义按钮点击事件的监视器类
class MyButtonListener implements ActionListener {
@Override
// 重写按钮点击后的处理方法
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
if(isGameOver)return;
System.out.println("按钮被点击");
// 区分哪个按钮被点击
// 获得发生点击事件的事件源
Object obj = arg0.getSource();
for (int i = 0; i < N * N; i++) {
if (obj == btns[i]) {
doSaoLei(i);// 调用详细的处理方法
}
}// end for
}
}
// 定义处理第i个按钮被点击的详细方法
public void doSaoLei(int i) {
// 1.判断第i个位置是否有雷
if (status[i] == 1) {
isGameOver=true;//设置游戏结束
Global.GameIsRunning=false;
JOptionPane.showMessageDialog(null, "呵呵,你被砸死了!");
// 显示雷的分布让玩家死得
for (int j = 0; j < N * N; j++) {
if (status[j] == 1)
btns[j].setBackground(Color.red);
}
return;
}
/** 没有雷**/
// 将该位置翻转
status[i]=-1;
btns[i].setBackground(Color.white);
checkGameOver();//进行游戏是否过关的判断
//统计周围位置雷的个数
int total=0;
//1.上方向的位置
if(i>=N&&status[i-N]==1) total++;
//2.下方向
if(i<N*(N-1)&&status[i+N]==1) total++;
//3.左方向
if(i%N>0&&status[i-1]==1) total++;
//4.右方向
if(i%N<N-1&&status[i+1]==1)total++;
//5.左上位置i-1-N
if(i>=N&&i%N>0&&status[i-1-N]==1) total++;
//6.右上位置i+1-N
if(i%N<N-1&&i>=N&&status[i+1-N]==1) total++;
//7左下位置i-1+N
if(i%N>0&&i<N*(N-1)&&status[i-1+N]==1) total++;
//8右下位置i+1+N
if(i%N<N-1&&i<N*(N-1)&&status[i+1+N]==1) total++;
if(total>0)//周围有雷提示雷的个数
btns[i].setText(""+total);
else{
//周围没有雷,自动翻转周围
doAutoSaoLei(i);
}
}// end createButtons end doSaoLei
//定义以i为中心对周围进行自动扫雷的方法
public void doAutoSaoLei(int i) {
//1.自动翻转上方位置
if(i>=N&&status[i-N]!=-1) doSaoLei(i-N);
//2.下方位置
if(i<N*(N-1)&&status[i+N]!=-1) doSaoLei(i+N);
//3.左方
if(i%N>0&&status[i-1]!=-1) doSaoLei(i-1);
//4右
if(i%N<(N-1)&&status[i+1]!=-1) doSaoLei(i+1);
}//end doAutoSaoLei
//定义判断游戏过关的方法
public void checkGameOver() {
//判断雷区中不是雷的位置是否全部被翻转
//status数组中-1的个数为N*N-M
int total=0;
for(int i=0;i<N*N;i++)
if(status[i]==-1)total++;
if(total>=N*N-M) {
Global.GameIsRunning=false;
JOptionPane.showMessageDialog(null, "帅呆了,你真牛");
}
}// end checkGameOver
public static void main(String[] args) {
GameFrame frame = new GameFrame();
frame.setVisible(true);
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
基于JavaSwing实现的扫雷小游戏
共11个文件
class:5个
java:3个
project:1个
需积分: 5 1 下载量 135 浏览量
2023-02-20
14:45:21
上传
评论
收藏 10KB RAR 举报
温馨提示
该游戏为扫雷小游戏,已经实现类似电脑的扫雷基本功能。 扫雷游戏操作主要用鼠标操作,可以使用左键,右键和左右键同时按下,一般是开始时是从四个角先用左键点开,这样的话在游戏后期的不容易被四个角卡死。 游戏中的数字是上下左右周围九个格子的雷的数量,可以通过当前位置和周边的位置的数字想减,判断隐藏的格子后边是否有累,比如当前鼠标位置数字是1,左右键同时按下只有一个格子,这样就能判断出来这个格子是雷,判断出雷之后用右键选择标记它是雷。 感兴趣的小伙伴可以下载研究学习一下。
资源推荐
资源详情
资源评论
收起资源包目录
MineSweeping.rar (11个子文件)
MineSweeping
.classpath 232B
.settings
org.eclipse.jdt.core.prefs 598B
src
minesweeping
GameFrame.java 6KB
TimeThread.java 568B
Global.java 96B
bin
minesweeping
GameFrame$MyButtonListener.class 1KB
Global.class 369B
GameFrame$1.class 1KB
GameFrame.class 4KB
TimeThread.class 922B
.project 388B
共 11 条
- 1
资源评论
zwhdlb
- 粉丝: 1930
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功