import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
import static java.awt.Color.*;
/**
* 扫雷说明
* 用判断递归法对周围信息进行判断,如果周围9格内有炸弹则停止并显示数字或越界,要类似那样的
* 遮挡与不遮挡和炸弹由数组内的1和0和2组成 显示炸弹的数字由计算炸弹组成
* 开始? GOGOGO
* <p>
* 自动显示迷雾中炸弹思路:以炸弹为中心每点击到空地就遍历所有的炸弹,如果9格内没有迷雾则变为Show状态
* 自动拓张周围的思路:如果点击到了0,递归自己,9个格子之内如果周围没有的数字(遇到必然为数字),则都进行显示并递归为0的
* 如果点击了数字就CLICK
* 如果点击了炸弹则游戏结束
*/
public class WindowMake extends JFrame {
//参数列表
int Row = 9;//长
int Col = 9;//宽
int SIZE = 80;//格子大小
int Boom = 10;//炸弹的数量
MapElement[][] arr = new MapElement[Row][Col];//地图元素 Zero,Math
int[][] ShadowMate = new int[Row][Col];//迷雾数组 判断是否点击过 当迷雾都为1时游戏胜利
int[][] AnswerMate = new int[Row][Col];//实体数组,空地为零,炸弹为1
//int[][] shadow = new int[Row][Col];//遮挡个数所属数组
//炸弹存放的集合
Set<point> pointSet = new HashSet<>();
//判断游戏是否胜利
static int statics = 0;
//次数
static int count = 0;
public void start() throws InterruptedException {
//设置窗口标题
this.setTitle("扫雷");
//窗口是否可见
this.setVisible(true);
//窗口大小
this.setSize(Row * SIZE + SIZE * 7, Col * SIZE + SIZE * 2);
//设置在中央出现
this.setVisible(true);
this.setLocationRelativeTo(null);
//初始化数组都赋予迷雾
initMap(arr);
initOneMate(ShadowMate);//初始化迷雾数组,记录哪里被点击了和哪里可以点击
//生成随机标准答案并修改arr 0为空,-1为炸弹
RandomAnswerMate(AnswerMate, arr);
//对炸弹周围进行数字计算
CalculateAnswer(AnswerMate);
//加工答案获得掩盖数组
//Shadow(OneMate,shadow,TwoMate);
//添加键盘事件迷雾数组加+1事件
//重写鼠标点击 若点击成功就+1且不能减退(第一个不能为炸弹的规则?待定)
this.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
if (e.getButton() == 1) //按下的是鼠标左键
{
int click = 0;
click++;//测试用数值
int x = e.getX();
int y = e.getY();
//需要把系统的数值调成自己想要的
int xIntarr = (x - 30 + SIZE / 3 + 30) / SIZE - 1;
int yIntarr = (y - 10 + SIZE / 2 + 50) / SIZE - 2;
System.out.println("第" + click + "次点击");
System.out.println(xIntarr + "," + yIntarr);
System.out.println(x + "," + y);
//点击到了图案,消除数组当前的x,y坐标,并进行Reset,加分
point point = new point();
//点击就变为点击模块,且迷雾++
if (ShadowMate[xIntarr][yIntarr] == 0 && AnswerMate[xIntarr][yIntarr] == 0)//进行递归判断
{
//判断是否可以递归
ShowMore(ShadowMate, xIntarr, yIntarr);
} else if (ShadowMate[xIntarr][yIntarr] == 0 && AnswerMate[xIntarr][yIntarr] != -1
&& AnswerMate[xIntarr][yIntarr] != 0)//进行炸弹是否能完全显示判断
{
ShadowMate[xIntarr][yIntarr] = 1;
arr[xIntarr][yIntarr] = MapElement.Show;
for (point point2 : pointSet) {
Boolean ShowBoom = Boolean.TRUE;
int pointStartX = point2.getX() - 1;
//相对自身的9个格子内加1
for (; pointStartX <= point2.getX() + 1; pointStartX++) {
for (int pointStartY = point2.getY() - 1; pointStartY <= point2.getY() + 1; pointStartY++) {
if (pointStartX < Row && pointStartX >= 0 && pointStartY < Col && pointStartY >= 0) {
//为中间时跳过
if (pointStartX == point2.getX() && pointStartY == point2.getY()) {
continue;
}
if (ShadowMate[pointStartX][pointStartY] == 0
&& AnswerMate[pointStartX][pointStartY] != -1)//存在不完全显示但不为炸弹
{
ShowBoom = false;
}
}
}
}
if (ShowBoom)//周围都显示了
{
//显示该炸弹
ShadowMate[point2.getX()][point2.getY()] = 1;
arr[point2.getX()][point2.getY()] = MapElement.Show;
}
}
} else if (ShadowMate[xIntarr][yIntarr] == 0 && AnswerMate[xIntarr][yIntarr] == -1)//为炸弹 游戏结束
{
//游戏结束
//JOptionPane.showMessageDialog(this, "摸到炸弹,游戏结束");
}
}
}
});
while (true) {//点击了没反应,属于鼠标信息点击获取失败的问题
//另一种解释是不能变移动边点击
this.update(this.getGraphics());
}
}
private void ShowMore(int[][] shadowMate, int xIntarr, int yIntarr) {
if (shadowMate[xIntarr][yIntarr] == 0 && AnswerMate[xIntarr][yIntarr] == 0)//为其它数字时终止
{
ShadowMate[xIntarr][yIntarr] = 1;//标记已显示 可能会产生重复 也可以通过是否等于1进行判断冗余的递归
arr[xIntarr][yIntarr] = MapElement.Show;//映射渲染
System.out.println("第"+count+"次"+"打开了"+xIntarr+":"+yIntarr+"的格子");
count++;
int StartX = xIntarr - 1;
for (; StartX <= xIntarr + 1; StartX++) {
for (int StartY = yIntarr - 1; StartY <= yIntarr + 1; StartY++) {
//如果没有越界
if (StartX < Row && StartX >= 0 && StartY < Col && StartY >= 0) {
if (StartY == yIntarr || StartX == xIntarr)//只判断临近四格之间的十字架
{
//遍历1-9格,如果为空执行递归
if (AnswerMate[StartX][StartY] == 0) {
ShowMore(shadowMate, StartX, StartY);
}
//为不可见且不为炸弹的数值则显示
else if (AnswerMate[StartX][StartY] !=-1)
{
System.out.println("终止-----"+"第"+count+"次"+"打开�
没有合适的资源?快使用搜索试试~ 我知道了~
Java9*9A大型小游戏-扫雷
共20个文件
xml:9个
class:5个
java:3个
需积分: 0 0 下载量 25 浏览量
2023-07-02
09:12:33
上传
评论 1
收藏 26KB ZIP 举报
温馨提示
扫雷
资源推荐
资源详情
资源评论
收起资源包目录
CleanBoom.zip (20个子文件)
CleanBoom
pom.xml 650B
src
test
java
main
resources
java
MapElement.java 220B
point.java 1KB
WindowMake.java 15KB
.idea
jarRepositories.xml 879B
ZeppelinRemoteNotebooks
easyCodeTableSetting.xml 5KB
uiDesigner.xml 9KB
workspace.xml 5KB
misc.xml 633B
inspectionProfiles
Project_Default.xml 155B
compiler.xml 570B
.gitignore 237B
sonarlint
issuestore
8
1
index.pb 0B
a
b
9
0
4
4
securityhotspotstore
8
1
index.pb 0B
a
b
9
0
4
4
encodings.xml 267B
target
classes
WindowMake$1.class 3KB
MapElement.class 933B
point.class 2KB
WindowMake.class 7KB
WindowMake$2.class 605B
generated-sources
annotations
共 20 条
- 1
资源评论
狗头版猫头鹰
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功