Java扫雷游戏: JMine
JMine是用Java和Swing编写的扫雷程序。作者是Jerry Shen(火鸟),代码有一定年头了,最开始是作者的课程设计。阅读这种小程序对编程语言的学习挺有帮助。本文只简单介绍一些关键的地方,实现细节可直接参考源代码。项目地址:https://gitee.com/jerryshensjf/JMine
界面设计
游戏的主界面分为菜单、控制面板、雷区三个部分。控制面板左右是两个计数器,分别显示地雷数量和时间。中间的笑脸是一个按钮,点击笑脸会张开嘴,可以重开一局游戏。
bTest = new JButton(faceIcon[0]);
bTest.addMouseListener(this);
bTest.setPressedIcon(faceIcon[1]);
public void mouseClicked(MouseEvent e) {
if (e.getSource() == bTest) {
setNewGame(numMine);
return;
}
...
雷区是10x10的方阵,左键扫雷,右键插旗子。格子上可以显示数字、旗子、问号等信息。
public class JMineButton extends JButton {
private int col;
private int row;
private int flag = 0;
private boolean clickFlag = false;
...
可以看到虽然界面和交互比较简单,但有很多需要自定义的控件。
游戏规则
介绍几处重要的规则和细节。
地图生成
在地图上随机设置地雷的位置,需要注意第一个点击的位置一定没有地雷,地雷如果出现在这个地方需要跳过。
while (i < mineNum) {
col = (int)(Math.random()*100)%10;
row = (int)(Math.random()*100)%10;
if (mine[col][row]==0 && (row!=Outrow || col!=Outcol || Outrow==10 )) {
mine[row][col]=9;
i++;
}
}
递归消除
如果一个格子周围都没有地雷,即为空白方格,则自动探索并点亮周边的空白方格。这个算法可递归调用checkMine
自身实现。
if (mine.mine[i][j] == 0 && mineButton[i][j].getClickFlag() == false) {
mineButton[i][j].setClickFlag(true);
showLabel(i, j);
for (int ii = i - 1; ii <= i + 1; ii++)
for (int jj = j - 1; jj <= j + 1; jj++)
checkMine(ii, jj);
}
胜利检测
胜利需满足如下条件:
- 所有地雷都被标记。
- 所有非地雷都不被标记。
- 所有非地雷被探测。
总结
这个版本的扫雷还原度还是蛮高的。唯一有些遗憾的是只能设置10x10的雷区。
Java扫雷游戏: JMine的更多相关文章
- Java练习(模拟扫雷游戏)
要为扫雷游戏布置地雷,扫雷游戏的扫雷面板可以用二维int数组表示.如某位置为地雷,则该位置用数字-1表示, 如该位置不是地雷,则暂时用数字0表示. 编写程序完成在该二维数组中随机布雷的操作,程序读入3 ...
- java实现简单扫雷游戏
/** * 一个简单的扫雷游戏 MainFram.java */ package www.waston; import java.awt.BorderLayout; import java.awt.C ...
- Java版的扫雷游戏源码
package com.xz.sl; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; i ...
- Java实现 LeetCode 529 扫雷游戏(DFS)
529. 扫雷游戏 让我们一起来玩扫雷游戏! 给定一个代表游戏板的二维字符矩阵. 'M' 代表一个未挖出的地雷,'E' 代表一个未挖出的空方块,'B' 代表没有相邻(上,下,左,右,和所有4个对角线) ...
- JAVA_扫雷游戏(布置地雷)
1.要为扫雷游戏布置地雷,扫雷游戏的扫雷面板可以用二维int数组表示.如某位置为地雷,则该位置用数字-1表示, 如该位置不是地雷,则暂时用数字0表示. 编写程序完成在该二维数组中随机布雷的操作,程序读 ...
- 【Android】自己动手做个扫雷游戏
1. 游戏规则 扫雷是玩法极其简单的小游戏,点击玩家认为不存在雷的区域,标记出全部地雷所在的区域,即可获得胜利.当点击不包含雷的块的时候,可能它底下存在一个数,也可能是一个空白块.当点击中有数字的块时 ...
- C# -- HttpWebRequest 和 HttpWebResponse 的使用 C#编写扫雷游戏 使用IIS调试ASP.NET网站程序 WCF入门教程 ASP.Net Core开发(踩坑)指南 ASP.Net Core Razor+AdminLTE 小试牛刀 webservice创建、部署和调用 .net接收post请求并把数据转为字典格式
C# -- HttpWebRequest 和 HttpWebResponse 的使用 C# -- HttpWebRequest 和 HttpWebResponse 的使用 结合使用HttpWebReq ...
- [转] java开源游戏
收藏一下 triplea Triplea是一个开放源码的boardgame.它允许玩家选择各种各样的战略版图游戏(如:轴心国或同盟军).TripleA引擎支持联网对战,支持声音,支持使用XML文 ...
- java俄罗斯方块游戏代码
java俄罗斯方块游戏代码: package com; import java.awt.Color; import java.awt.Graphics; import java.awt.event.K ...
随机推荐
- 设计模式课程 设计模式精讲 8-11 单例模式源码解析(jdk+spring+mybaties)
1 源码解析 1.1 单例解析1 1.2 单例解析2(容器单例) 1.3 单例解析3 1.4 单例解析4 1 源码解析 1.1 单例解析1 java.lang.Runtime /** * 饿汉式加载, ...
- 写给想要入门python或者正在入门python的小朋友们
写在前面: 最近好像python挺火,虽然我也在天天写python,但是python毕竟是动态语言,就拿常被人吐槽的java来说,python绝大不多数地方是不如java的.python只能是你的一个 ...
- 解决在高分屏下开发winform界面变形
Form.AutoScaleMode = AutoScaleMode.None; 需要在超大屏下显示的时候,再考虑 AutoScaleMode.Font; AutoScaleMode.Dpi;
- 完全取代VC上原有的view
如果需要在这个VC上放置一个subviewA,作用相当于取代self.view,那么最好不要使用 [self.view addSubView: subviewA]; 而要使用 self.view = ...
- Scrapy 框架结构及工作原理
1.下图为 Scrapy 框架的组成结构,并从数据流的角度揭示 Scrapy 的工作原理 2.首先.简单了解一下 Scrapy 框架中的各个组件 组 件 描 述 类 型 EN ...
- 【快学springboot】在springboot中写单元测试
前言 很多公司都有写单元测试的硬性要求,在提交代码的时候,如果单测通不过或者说单元测试各种覆盖率不达标,会被拒绝合并代码.写单元测试,也是保证代码质量的一种方式. junit单元测试 相信绝大多数的J ...
- Android 隐藏手机号中间四位和隐藏邮箱地址中间四位
/** * 手机号用****号隐藏中间数字 * * @param phone * @return */public static String settingphone(String phone) { ...
- English-Phonics
English-Phonics 1. 音节 1.1 字组 1.2 音节概述及分类 1.3 音节的划分 2. 元音字组的自然发音 2.1 元音字母 2.2 元音字母的长音 2.3 元音字母+r 2.4 ...
- 导弹拦截p1020(LIS问题)
题目描述(题目链接:https://www.luogu.org/problem/P1020) 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够 ...
- 恒大与FF终达成和解!谁赢了,谁输了?
去年11月结束的中超,广州恒大以63分的积分落后上海上港5分,排在第二名的位置.恒大恒可惜地没有创造史无前例的联赛八连冠,与新的亚洲纪录失之交臂.但相比球场上的"失意",许家印在商 ...