直接先上效果图

1.核心算法将扫雷看成是一个二维数组,每个格子分别用一个x,y来标识。如下图:

2.定义雷:我们需要生产10组随机(如0,4)这样的数据来表示一个雷。

3.当我们点击一个按钮时,拿到按钮的x,y值和我定义的10组随机数去比较,如果当前点击的按钮的x,y存在于我的随机数集合中,那么这个按钮即为雷

好了不废话了直接上代码,代码中有详细的注释。

1.扫雷主程序入口

packagecom.yh;/*** 扫雷主程序入口

* 1.自定义一个jframe(SaoLeiFrame)窗体用来展示我们扫雷

* 2.使用jframe默认布局

* 3.向jframe放入一个jpanel(由于我们的jframe是borderLayout布局所以默认放在中部)

* 4.创建一个自jpanel(SaoLeiPanel)设置为GirdLayout布局为10*10

* 5.初始化(initPanel)我们的SaoLeiPanel

* 6.initPanel中我们需要在每一个格子里面放一个button,我们通过嵌套for循环来放入

* 外层循环表示行数,内层循环放入button

* 7.创建我们自己button(SaoLeiBut),自定义int x,y这两个属性用来记录当前but

* 在SaoLeiPanel网格布局中的位置

* 8.在我们把but放入到SaoLeiPanel中时我们需要记录x,y的值,对应的是for中i和j

* 9.我们需要在创建but时候对but进行一个鼠标点击事件的监听。为了方便我们点击but时对其进行处理

* 10.创建一个事件类,我们这使SaoLeiPanel实现MouseListener。SaoLeiPanel来处理鼠标点击的事件

* 11.创建我们的雷,由于我们的but都有一个xy来确定,所有我们只需要创建10组xy来表示我们的雷即可

* 12.点击按钮进行处理,

* 1.获取你点击的是哪个按钮。通过e.getComponent()方法来获取

* 2.判断你是点击左键还右键。左键是打开按钮,右键标记按钮

* ①左键:拿到点击的按钮的xy值并与我的雷的集合进行比较,如果是雷,提示你踩雷了并游戏结束

* 如果不是雷,以此but为中心,找到周边8个按钮,依次对8个按钮进行判断

**/

public classSaoLeiMain {public static voidmain(String[] args) {

SaoLeiFrame sf= newSaoLeiFrame();

sf.initFrame();

}

}

2.扫雷Frame初始化

packagecom.yh;importjavax.swing.JFrame;/*** 初始化面板

*

**/

public class SaoLeiFrame extendsJFrame {/** */

private static final long serialVersionUID = 583932182092822117L;public voidinitFrame(){

SaoLeiPanel saoleipanel= new SaoLeiPanel(this);

saoleipanel.initPanel();this.add(saoleipanel);this.setTitle("扫雷");this.setVisible(true);this.setSize(600, 600);this.setLocationRelativeTo(null);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

}

3.扫雷的panel(核心)

packagecom.yh;importjava.awt.Color;importjava.awt.GridLayout;importjava.awt.event.MouseEvent;importjava.awt.event.MouseListener;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjavax.swing.JOptionPane;importjavax.swing.JPanel;/***

* 展示扫雷的按钮

* 采用网格布局

*

**/

public class SaoLeiPanel extends JPanel implementsMouseListener{/** */

private static final long serialVersionUID = 61864807539421288L;//保存我们生成的雷

List booms = new ArrayList<>();//保存我们所有按钮

Map butsMap = new HashMap<>();//将父窗口直接传过来方便我们操作

SaoLeiFrame frame;publicSaoLeiPanel(SaoLeiFrame frame){this.frame =frame;

}//初始化panel

public voidinitPanel(){this.setLayout(new GridLayout(10,10));//渲染格子

for(int i = 0;i<10;i++){//循环格子的行数

for(int j = 0;j<10;j++){//加入格子

SaoLeiBut but = newSaoLeiBut();

but.addMouseListener(this);//添加鼠标事件

but.setText(i+","+j);//设置每个格子展示内容

but.x=i;//设置标识

but.y=j;

butsMap.put(i+","+j, but);//将产生的所有格子放入保存到map方便我们操作

this.add(but);

}

}

createBoom();//生成10组随机数来标识我们的雷

}//生成雷

public voidcreateBoom(){//放雷

List bs = new ArrayList<>();while(bs.size()<10){

Double d1= Math.random()*10;int x =d1.intValue();

Double d2= Math.random()*10;int y =d2.intValue();

String boom= x+","+y;if(!bs.contains(boom)){//判断雷是否已存在

System.out.println(boom);

bs.add(boom);

}

}

booms=bs;

}

@Override//鼠标点击

public voidmouseClicked(MouseEvent e) {

SaoLeiBut slb= (SaoLeiBut)e.getComponent();//获取当前点击的按钮

if(e.getModifiers() == 16){//如果是左键点击则打开我们的按钮

String slbAdds = slb.x+","+slb.y;//获取当前点击的按钮标识

if(booms.contains(slbAdds)){//踩雷提示

JOptionPane.showMessageDialog(null, "哈哈哈 你踩雷!!!!!");

frame.remove(this);//重置frame

frame.initFrame();//重新初始化

}else{//没有踩雷 这个时候我们需要判断我们周边的情况//打开自己及周边雷

Map aroundMap = getAround(slb);//获取周边格子的信息

openButton(aroundMap,slb);//打开自己和周边

}

}else if(e.getModifiers() == 4){//如果是右键点击标记小红旗.这里我没有写

System.out.println("鼠标点击右");

}

}

@SuppressWarnings("unchecked")public void openButton(MaparoundMap,SaoLeiBut slb){int leicount = (int)aroundMap.get("i");//周边有没有雷

List arounds = (List)aroundMap.get("arounds");//周边的按钮

butsMap.put(slb.x+","+slb.y, null);if(leicount>0){//有雷 显示雷的数量

slb.setText(leicount+"");

slb.setBackground(Color.white);//设置背景为白色

slb.removeMouseListener(this);// }else{//没有雷

slb.setText("");//设置内容为空

slb.setBackground(Color.white);//设置背景为白色

slb.removeMouseListener(this);//取消监听//遍历 递归调用

for(String key:butsMap.keySet() ){if(null!=butsMap.get(key)){

SaoLeiBut but= butsMap.get(key);//转换成我们but

if(null!=arounds && arounds.contains(key)){//如果是当前点击的but的周边的but则记录

Map ms = getAround(but);//获取周边的雷的情况和周边按钮

openButton(ms,but);

}

}

}

}

}/*** 返回周边雷的数量及雷坐标

**/

public MapgetAround(SaoLeiBut slb){int x = slb.x;//获取当前点击but的xy

int y =slb.y;

List arounds = new ArrayList<>();//定义一个集合用来存储周边but下标//获取周边but下标并保存至arounds

if(y>0){

String top= x+","+(y-1);//上

arounds.add(top);

}if(y<9){

String bottom= x+","+(y+1);//下

arounds.add(bottom);

}if(x>0){

String left= (x-1)+","+y;//左

arounds.add(left);

}if(x<9){

String right= (x+1)+","+y;//右

arounds.add(right);

}if(x>0&&y>0){

String left_top= (x-1)+","+(y-1);//左上

arounds.add(left_top);

}if(x>0 && y<9){

String left_bottom= (x-1)+","+(y+1);//左下

arounds.add(left_bottom);

}if(x<9&&y>0){

String right_top= (x+1)+","+(y-1);//右上

arounds.add(right_top);

}if(x<9&&y<9){

String right_bottom= (x+1)+","+(y+1);//右下

arounds.add(right_bottom);

}//判断周边的but是否是雷 用i来记录

int i=0;for(String s:arounds){if(booms.contains(s)){

i++;

}

}

Map aroundMap = new HashMap<>();

aroundMap.put("i", i);

aroundMap.put("arounds", arounds);returnaroundMap;

}

@Overridepublic voidmouseEntered(MouseEvent e) {

}

@Overridepublic voidmouseExited(MouseEvent e) {

}

@Overridepublic voidmousePressed(MouseEvent e) {

}

@Overridepublic voidmouseReleased(MouseEvent e) {

}

}

1,自定义的button来表示我们每一个格子

packagecom.yh;importjavax.swing.JButton;/*** 定义我们扫雷的按钮

*

**/

public class SaoLeiBut extendsJButton{private static final long serialVersionUID = -8176636345385709660L;intx,y;

}

package com.yh;/** * 扫雷主程序入口 * 1.自定义一个jframe(SaoLeiFrame)窗体用来展示我们扫雷 * 2.使用jframe默认布局 * 3.向jframe放入一个jpanel(由于我们的jframe是borderLayout布局所以默认放在中部) * 4.创建一个自jpanel(SaoLeiPanel)设置为GirdLayout布局为10*10 * 5.初始化(initPanel)我们的SaoLeiPanel * 6.initPanel中我们需要在每一个格子里面放一个button,我们通过嵌套for循环来放入 * 外层循环表示行数,内层循环放入button * 7.创建我们自己button(SaoLeiBut),自定义int x,y这两个属性用来记录当前but * 在SaoLeiPanel网格布局中的位置 * 8.在我们把but放入到SaoLeiPanel中时我们需要记录x,y的值,对应的是for中i和j * 9.我们需要在创建but时候对but进行一个鼠标点击事件的监听。为了方便我们点击but时对其进行处理 * 10.创建一个事件类,我们这使SaoLeiPanel实现MouseListener。SaoLeiPanel来处理鼠标点击的事件 * 11.创建我们的雷,由于我们的but都有一个xy来确定,所有我们只需要创建10组xy来表示我们的雷即可 * 12.点击按钮进行处理, * 1.获取你点击的是哪个按钮。通过e.getComponent()方法来获取 * 2.判断你是点击左键还右键。左键是打开按钮,右键标记按钮 * ①左键:拿到点击的按钮的xy值并与我的雷的集合进行比较,如果是雷,提示你踩雷了并游戏结束 * 如果不是雷,以此but为中心,找到周边8个按钮,依次对8个按钮进行判断 * */

public class SaoLeiMain {public static void main(String[] args) {SaoLeiFrame sf =  new SaoLeiFrame();sf.initFrame();}

}

java 扫雷注释_swing 扫雷简单版实现代码-附注释相关推荐

  1. 史上最详细的Pytorch版yolov3代码中文注释详解(四)

    史上最详细的Pytorch版yolov3代码中文注释详解(一):https://blog.csdn.net/qq_34199326/article/details/84072505 史上最详细的Pyt ...

  2. 1 PyTorch版YOLOv3 代码中文注释 之 训练 train.py test.py detect.py

    文章目录 PyTorch版YOLOv3 代码中文注释 1. 相关链接: 2. 代码结构: 3. train.py 3.1. train.py 中包含的主要功能 4. test.py 4.1. test ...

  3. java飞鸽传书_java简单版飞鸽传书

    [实例简介] 使用java实现的简单版飞鸽传书,可以单聊.群聊.发送文件,使用UPD获取在线用户及聊天,使用TCP发送文件.代码比较简洁,界面工整,学习使用. [实例截图] [核心代码] simple ...

  4. java随机yujie_植物大战僵尸简单版教程java版

    作者:叁念 1.闲来无事,做了个简单版的植物大战僵尸,不多说直接看效果图: 2.程序的项目结构如下: 3.先上素材 图片素材 链接:https://pan.baidu.com/s/1dGqqIkx 密 ...

  5. 简单返回顶部代码及注释说明(转)

    最近做了一个排行榜页面,分类较多,并且以图文形式展示......最后页面明显过长了,用户体验自然不够好.最后想着在页面上部增加了页面内跳转导航,直接导航到本页的分类命名锚块.当然这就需要结合" ...

  6. ConvNeXt:超越 Transformer?总结涨点技巧与理解代码(附注释)

    文章目录 1. 前言 2. 论文学习 2.1. 发展路线 2.2. 训练策略改进 2.3. 宏观设计 2.3.1. stage compute ratio 2.3.2. stem to "P ...

  7. 五子棋小游戏 java版(代码+详细注释)

    游戏展示         这周闲来无事,再来写个五子棋小游戏.基本功能都实现了,包括人人对战.人机对战.界面布局和功能都写的还行,没做到很优秀,但也不算差.如有需要,做个java初学者的课程设计或者自 ...

  8. Java语言点名器(简单版)

    介绍:这个点名器涉及到文件和集合的知识,通过文件到集合进行实现 设计思路:先在文件中储存所需要参加点名的对象名称,(一定要一个名字占一行,因为后面要通过集合的索引来获得对应的值),然后创建缓冲字符输入 ...

  9. java计算器注释_java计算器实现,百行代码,清晰注释

    写安卓写了三年有余了吧!今天无聊,在网上看看安卓的计算器居然没有一个实现的好的,真实让人心寒啊! 闲着无聊,我也写了一个java实现计算器,代码简单易懂,稍微有那么点不好懂的我都写了详细的注释的! 那 ...

最新文章

  1. C++难题之多态性详细解释
  2. poj 3077Rounders(模拟)
  3. 一维数组工具 OneArryasTools v1.1(doc生成正常)
  4. HarmonyOS之生物特征识别的功能和使用
  5. vtk类之vtkFixedPointVolumeRayCastMapper :一个固定像素点的体数据映射器
  6. QT入门安装篇+helloworld(辛酸血泪)
  7. 嵌入式论文3000字_SCI英文论文一般多少字
  8. SAP Hybris backoffice登录时的语言选择
  9. iPhone 软件:xlate free 编码的好帮手!
  10. ssm提交post_我用spring mvc做,用post方式提交,后台获取不到参数值,用get方式就可以,什么问题...
  11. 压缩软件自动化测试,FOR…IN…ZIP循环——自动化测试精解(14)
  12. 仿人机器人的实时模仿(基于Kinect)
  13. okhttp3+retrofit2+rxjava2
  14. golang struct数组排序_go语言中排序sort的使用方法示例
  15. 凸优化(Convex Optimization)是什么?
  16. 火狐插件 测试浏览器兼容性_在Firefox中测试和报告插件兼容性
  17. 内网穿透-把自己的电脑部署为公网可访问的服务器
  18. 计算机毕业设计抄袭,学生毕业设计抄袭他人纪录片,只算“侵权”? 西安工程大学称属学术不端...
  19. 如何关闭计算机英语作文,英语作文lt;关掉你的电脑gt;
  20. squid+icap测试配置

热门文章

  1. 智慧工地起重机塔吊机在线远程无线监测方案
  2. 计算1+1/2+1/3+…+1/20。
  3. 2023年通信工程施工与管理
  4. VS2012 将工程编译为Release,引用dll找不到的问题
  5. 51单片机c语言延时时间计算,单片机定时器延迟时间计算
  6. 第一篇嘞,重学Burpsuite,还有HTTP协议
  7. CMS垃圾收集器详解(转载)
  8. 【利用python批量把Eyelink的.edf文件转为asc文件】
  9. 社群运营:8个社群运营方法教你打造社群运营专家!
  10. Excel VBA属性、方法、事件大全——Part9(Complete List of Excel VBA attribute/method and event)