我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何使用Java开发扫雷游戏

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何使用Java开发扫雷游戏

小编给大家分享一下如何使用Java开发扫雷游戏,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

一、效果图

如何使用Java开发扫雷游戏  如何使用Java开发扫雷游戏    如何使用Java开发扫雷游戏

二、实现思路

界面上可以点开的各种实际都是按钮,创建9行9列的二维数组,然后根据这个数组来创建JButton。

对应创建二维数组data,用来存取数据,0表示周围无雷,-1表示当前是雷,其他数字表示周围雷的数量。

对应创建二维数组state,用来存取按钮状态,0未打开,1 打开  2旗子  3 未知(控制显示对应的图标)

设置雷:随机行数 i 和列数 j,根据随机到 i、j 从二维数组data中取出对应的元素值,若值不为-1(不是雷),则将此元素data[i][j]设置为-1,若值是-1(已经是雷了),则跳过,不管是否跳过都进行递归,直到雷的数量达到设定的最大数量,跳出递归。

设置周围雷的数量:计算每个元素周围的雷数量(周围指的是 左上、上、右上、右、右下、下、左下、左 这8个位置),循环二维数组data,判断当前值不是-1,则需要计算周围雷的数量,等会细说。

有任一格子被揭开,则游戏开始并且计时,当格子被揭开的时候分3种情况

(1)格子是雷,执行爆炸动画,游戏结束。

(2)当前格子周围有雷,则仅仅打开此格子,对应显示周围雷数量的数字图片。

(3)当前格子不是雷且周围没有雷(data取到的元素值为0),则依次打开周围,并且被打开的周围元素也没有雷的情况下,继续打开(递归)。

右键可以进行插小旗、打问号等操作(对数组state进行的操作)。

三、代码实现

3.1 设置头部

//设置头部private void setHeader() {Container container = new Container();container.setLayout(new GridLayout(1, 3));timeJLabel = new JLabel("时间:"+time,JLabel.CENTER);timeJLabel.setForeground(Color.DARK_GRAY);timeJLabel.setFont(new Font("微软雅黑",Font.BOLD, 16));leiJLabel = new JLabel("雷:"+curLeiCount,JLabel.CENTER);leiJLabel.setForeground(Color.DARK_GRAY);leiJLabel.setFont(new Font("微软雅黑",Font.BOLD, 16));reStart = new JButton((ImageIcon)imageMap.get(21));Dimension preferredSize = new Dimension(100,40);reStart.setPreferredSize(preferredSize);reStart.addActionListener(this);//注意添加顺序container.add(timeJLabel);container.add(reStart);container.add(leiJLabel);mainFrame.add(container,BorderLayout.NORTH);}

如何使用Java开发扫雷游戏

3.2 设置游戏区域按钮

创建容器,并采用GridLayout 布局。

根据设定的ROWS、COLS创建二维数组,数组存储JButton,给每个按钮设置图标。

给每个按钮添加鼠标点击事件,右键事件。

private void setButtons() {Container container = new Container();container.setLayout(new GridLayout(ROWS, COLS));ImageIcon icon=null;for (int i = 0; i <ROWS; i++) {for (int j = 0; j < COLS; j++) {JButton btn = new JButton();btn.setBounds(0, 0, 39, 39);icon = (ImageIcon)imageMap.get(10);setBtnImage(btn,icon);container.add(btn);btns[i][j]=btn;btn.addActionListener(this);btn.addMouseListener(this);}}mainFrame.add(container,BorderLayout.CENTER);}

如何使用Java开发扫雷游戏 

3.3 设置雷

随机行数 i 和列数 j,根据随机到 i、j 从二维数组data中取出对应的元素值。

判断值,若值不为-1(不是雷),则将此元素data[i][j]设置为-1,若值是-1(已经是雷了),则跳过。

不管上一步是否跳过都进行递归,直到雷数量达到设定的最大数量,跳出递归。

private void setLei() {if(computedLeiCount==LEICOUNT){//如果达到雷的最大数量则跳出return;}Random random = new Random();int r = random.nextInt(ROWS);int c = random.nextInt(COLS);//0 无; -1表示雷 ; 其他表示周围的雷数量if(data[r][c]!=-1){//如果不是雷则设置为雷data[r][c]=-1;computedLeiCount++;}setLei();//递归调用}

3.4 计算周围雷的数量并显示

循环之前的二维数组data,元素值是-1(雷)跳过,不是-1则继续。

如果当前元素的下标是(i,j),则左上为(i-1,j-1),上为(i-1,j ),右上为(i-1,j+1),以此类推,如下图所示:

如何使用Java开发扫雷游戏

分别取出这8个元素,并判断他们是不是雷,如果是则计数累加,最后把这个计数赋值给元素data[i][j]。

//设置周围雷的数量private void setAroundLei() {for (int i = 0; i <ROWS; i++) {for (int j = 0; j < COLS; j++) {if(data[i][j]!=-1){如果当前不是雷,则判断他周围有几个雷,并设置值data[i][j] = computedLei(i,j);}}}}//计算周围雷的数量private int computedLei(int i,int j) {int count=0;//左上int ci = i-1;int cj = j-1;if(ci>=0 && cj>=0){if(data[ci][cj]==-1){count++;}}//上ci = i-1;cj = j;if(ci>=0){if(data[ci][cj]==-1){count++;}}//右上ci = i-1;cj = j+1;if(ci>=0 && cj<COLS){if(data[ci][cj]==-1){count++;}}//右ci = i;cj = j+1;if(cj<COLS){if(data[ci][cj]==-1){count++;}}//右下ci = i+1;cj = j+1;if(ci<ROWS && cj<COLS){if(data[ci][cj]==-1){count++;}}//下ci = i+1;cj = j;if(ci<ROWS){if(data[ci][cj]==-1){count++;}}//左下ci = i+1;cj = j-1;if(ci<ROWS && cj >=0){if(data[ci][cj]==-1){count++;}}//左ci = i;cj = j-1;if(cj >= 0){if(data[ci][cj]==-1){count++;}}return count;}

3.5 添加点击事件

让代码实现 ActionListener

重写方法actionPerformed,获取点击的按钮进行揭开操作(分3种情况):

(1)格子是雷,执行爆炸动画,游戏结束。

(2)当前格子周围有雷,则仅仅打开此格子,显示周围雷数量的数字图片。

(3)当前格子不是雷且周围没有雷(data取到的元素值为0),则依次打开周围,并且被打开的周围元素也没有雷的情况下,继续打开(递归)。

3.6 打开指定按钮

//打开指定的buttonprivate void open(int i,int j) {JButton button = btns[i][j];if(state[i][j]==1){//已经打开直接返回return ;}state[i][j]=1;//设置打开状态int num = data[i][j];if(num==-1){//直接使用雷的图片setBtnImage(button,(ImageIcon)imageMap.get(18));//游戏结束,并爆炸boom(button);}else{//如果当前不是雷,显示对应数字类图片if(num==0){num=9;//显示周围的图标,并且递归openAround(i,j);}setBtnImage(button,(ImageIcon)imageMap.get(num));setBtnEnabled(button,false);//按钮被打开设置不能再点击了//判定是否成功successOrNot(1);}}

3.7 触雷爆炸

爆炸采用线程来执行,就是切换图片,图片切换到最后一张后线程结束,回调定义好的方法进行结束提示、打开所有格子等操作。

//爆炸效果private void boom(JButton button) {flag=true;GameRunnable gameRunnable = new GameRunnable();gameRunnable.setParam(button, boomImageMap,this);thread = new Thread(gameRunnable);thread.start();}//爆炸回调方法public void reback(JButton button) {setBtnImage(button,(ImageIcon)imageMap.get(18));flag=false;//设置全部按钮打开openAll();//弹出结束提示UIManager.put("OptionPane.buttonFont", new FontUIResource(new Font("宋体", Font.ITALIC, 13)));UIManager.put("OptionPane.messageFont", new FontUIResource(new Font("宋体", Font.ITALIC, 13)));JOptionPane.showMessageDialog(mainFrame, "你失败了!点击上方按钮重新开始");}

3.8 递归打开周围

//打开周围private void openAround(int i,int j) {//左上int ci = i-1;int cj = j-1;if(ci>=0 && cj>=0){open(ci,cj);}//上ci = i-1;cj = j;if(ci>=0){open(ci,cj);}//右上ci = i-1;cj = j+1;if(ci>=0 && cj<COLS){open(ci,cj);}//右ci = i;cj = j+1;if(cj<COLS){open(ci,cj);}//右下ci = i+1;cj = j+1;if(ci<ROWS && cj<COLS){open(ci,cj);}//下ci = i+1;cj = j;if(ci<ROWS){open(ci,cj);}//左下ci = i+1;cj = j-1;if(ci<ROWS && cj >=0){open(ci,cj);}//左ci = i;cj = j-1;if(cj >= 0){open(ci,cj);}}

如何使用Java开发扫雷游戏 

3.9 鼠标右键事件

实现MouseListener,重写mouseClicked方法。

如果按钮是未打开状态则设置为旗子(设置state数组对应的元素值:2)。

如果按钮是旗子状态则设置为未知(设置state数组对应的元素值:3)。

如果按钮是未知状态则设置为原来的状态未打开(设置state数组对应的元素值:0)。

//鼠标右键的处理@Overridepublic void mouseClicked(MouseEvent e) {if(e.getButton()==MouseEvent.BUTTON3){JButton button = (JButton)e.getSource();for (int i = 0; i <ROWS; i++) {for (int j = 0; j < COLS; j++) {if(button.equals(btns[i][j])){//找到对应的按钮if(state[i][j]==0){//如果是未打开状态则设置为旗子state[i][j]=2;setBtnImage(button,(ImageIcon)imageMap.get(12));curLeiCount--;leiJLabel.setText("雷:"+curLeiCount);//需求判断是否成功successOrNot(2);}else if(state[i][j]==2){//如果是旗子状态则设置为未知state[i][j]=3;setBtnImage(button,(ImageIcon)imageMap.get(13));curLeiCount++;leiJLabel.setText("雷:"+curLeiCount);}else if(state[i][j]==3){//如果是未知状态则设置为原来的未打开state[i][j]=0;setBtnImage(button,(ImageIcon)imageMap.get(10));}}}}}}

如何使用Java开发扫雷游戏

四、胜利判定

判断旗子的位置是不是正确的雷,并统计数量,如果统计到的数量刚好和设定的雷总数一样,证明雷全部被查出了,判定为胜利。

如果未打开的数量与设定雷的总数一样,也判定为胜利。

//判断是否成功 参数type=2表示判断右键插旗子,参数 type=其他  表示判断鼠标点击private void successOrNot(int type) {int count=0;if(type==2){for (int i = 0; i <ROWS; i++) {for (int j = 0; j < COLS; j++) {if(state[i][j]==2 && data[i][j]==-1){//是旗子,也是雷,则计数count++;}}}}else{//最终的未打开的数量与雷的数量一样,则表示成功for (int i = 0; i <ROWS; i++) {for (int j = 0; j < COLS; j++) {if(state[i][j]!=1){//未打开就计数count++;}}}}if(count==LEICOUNT){//成功//关闭计时线程gameTimeRunnable.setFlag(false);//设置全部按钮打开openAll();//弹出结束提示UIManager.put("OptionPane.buttonFont", new FontUIResource(new Font("宋体", Font.ITALIC, 13)));UIManager.put("OptionPane.messageFont", new FontUIResource(new Font("宋体", Font.ITALIC, 13)));JOptionPane.showMessageDialog(mainFrame, "恭喜你获得了胜利!你太棒了");}}

如何使用Java开发扫雷游戏

最后加入重新开始事件就完成了。

重新开始就是重新设置相关参数。

//重新开始游戏private void restart() {//关闭计时线程(可能正在进行游戏,所以要把计时线程关闭)gameTimeRunnable.setFlag(false);startFlag=false;computedLeiCount=0;curLeiCount=10;leiJLabel.setText("雷:"+curLeiCount);time=0;timeJLabel.setText("时间:"+time);data= new int[ROWS][COLS];//存取数据state= new int[ROWS][COLS];//存取打开状态,0未打开,1 打开setLei();setAroundLei();ImageIcon icon = null;for (int i = 0; i <ROWS; i++) {for (int j = 0; j < COLS; j++) {icon = (ImageIcon)imageMap.get(10);setBtnImage(btns[i][j],icon);setBtnEnabled(btns[i][j],true);//按钮重新设置可以点击}} }

Java的优点是什么

1. 简单,只需理解基本的概念,就可以编写适合于各种情况的应用程序;2. 面向对象;3. 分布性,Java是面向网络的语言;4. 鲁棒性,java提供自动垃圾收集来进行内存管理,防止程序员在管理内存时容易产生的错误。;5. 安全性,用于网络、分布环境下的Java必须防止病毒的入侵。6. 体系结构中立,只要安装了Java运行时系统,就可在任意处理器上运行。7. 可移植性,Java可以方便地移植到网络上的不同机器。8.解释执行,Java解释器直接对Java字节码进行解释执行。

以上是“如何使用Java开发扫雷游戏”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何使用Java开发扫雷游戏

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何使用Java开发扫雷游戏

小编给大家分享一下如何使用Java开发扫雷游戏,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、效果图 二、实现思路1.界面上可以点开的各种实际都是按钮
2023-06-15

如何使用Java实现扫雷小游戏

这篇文章主要介绍“如何使用Java实现扫雷小游戏”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何使用Java实现扫雷小游戏”文章能帮助大家解决问题。效果展示主类:GameWin类package c
2023-06-30

python用tkinter开发的扫雷游戏

目录2.实现代码3.另一种精致一点的实现1.实现效果2.实现代码# 导入所需库 from tkinter import * import randomclass main:# 定义一个类,继承 tkinter 的 Button# 用来保存按
2022-06-02

如何使用C++实现扫雷游戏

这篇文章主要介绍了如何使用C++实现扫雷游戏,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。扫雷最原始的版本可以追溯到1973年一款名为“方块”的游戏。 不久,“方块”被改写成
2023-06-25

java如何实现扫雷游戏程序

本篇内容介绍了“java如何实现扫雷游戏程序”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!分析:1.首先布一个10*10的雷阵,即二维数组m
2023-07-01

怎么用java实现扫雷游戏

这篇文章主要介绍“怎么用java实现扫雷游戏”,在日常操作中,相信很多人在怎么用java实现扫雷游戏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用java实现扫雷游戏”的疑惑有所帮助!接下来,请跟着小编
2023-06-30

Easyx如何实现扫雷游戏

今天给大家介绍一下Easyx如何实现扫雷游戏。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。代码:#include#include
2023-06-26

C#如何实现扫雷游戏

今天小编给大家分享一下C#如何实现扫雷游戏的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、实验目的:1、掌握c#窗体和控件
2023-07-02

如何利用js+canvas实现扫雷游戏

这篇文章主要介绍“如何利用js+canvas实现扫雷游戏”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何利用js+canvas实现扫雷游戏”文章能帮助大家解决问题。代码如下 胜
2023-07-02

使用C语言制作扫雷游戏

本篇文章和大家了解一下使用C语言制作扫雷游戏。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。实现扫雷1、创建俩12*12的字符数组,一个用作放雷,一个呈现给用户2、利用随机数往防雷数组中产生雷3、设计呈现给用户的数组4、利
2023-06-15

使用C语言实现扫雷游戏

这篇文章主要为大家详细介绍了使用C语言实现扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
2022-11-13

如何使用C语言实现简易扫雷游戏

这篇文章主要介绍了如何使用C语言实现简易扫雷游戏,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、头文件#define _CRT_SECURE_NO_WARNINGS//包含
2023-06-26

如何使用C语言代码实现扫雷游戏

本篇内容主要讲解“如何使用C语言代码实现扫雷游戏”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用C语言代码实现扫雷游戏”吧!概述扫雷是一款大众类的益智小游戏。游戏目标是根据点击格子出现的数
2023-06-08

Python如何实现简单扫雷游戏

本篇内容介绍了“Python如何实现简单扫雷游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!具体代码如下#coding: utf-8__n
2023-07-02

使用 python 实现单人AI 扫雷游戏

AI玩扫雷 很高兴又见面了!扫雷是一款单人益智游戏,相信大部分人都在以前上微机课的时候玩过。游戏的目标是借助每个区域中相邻地雷数量的线索,清除包含隐藏的“地雷”或炸弹的单元格,但不引爆其中任何一个,全部清除后即可获胜。今天我们用 Pytho
2022-06-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录