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 ...
随机推荐
- Django学习 之后端视图与ajax
一.Ajax简介 在此之前你一定需要先学习下JavaScript JSON 可见: 前端学习 之 JavaScript 之 JSON 1.简单介绍 我们以前知道的前端向后端发送数据的方式有: GET: ...
- 140、Java内部类之实例化内部类对象
01.代码如下: package TIANPAN; class Outer { // 外部类 private String msg = "Hello World !"; class ...
- C语言动静态链接库使用(笔记)
看了视频一直没空写........... C静态链接库不用说了跟你写在cpp文件里的函数一样不会有单独的模块 不再赘述生活中用的比较少 例子 .h文件 int Plus(int x, int y); ...
- redis、mongodb、memcache安装好后设置开机自启动
vim /etc/rc.d/rc.local /usr/local/mongodb/bin/mongod --smallfiles /usr/local/bin/redis-server/usr/lo ...
- 易升地址,windows 10, 1511 升级 1607 仍然有效
https://www.microsoft.com/zh-cn/software-download/windows10 易升地址, windows 10 ,1511 升级 1607 仍然有效
- 公用表表达式(CTE) with as 片段
1.为什么用CTE,而不用表变量, declare @t table(CountryRegionCode nvarchar(3)) insert into @t(CountryRegionCode) ...
- Java中很少用的CopyOnWriteArrayList
类注释 /** * A thread-safe variant of {@link java.util.ArrayList} in which all mutative * operations ({ ...
- 小程序canvas 变换
var ctx = wx.createCanvasContext('base'); var centerX = 375/ 2; var centerY = 200; var rotate = 90; ...
- LoadRunner回放脚本时,显示浏览器的设置
打开LoadRunner的VuGen,选择Tools-->General Options-->Display,在Display里将 Show browser during replay打钩 ...
- Linux系统-----包管理器的演变
每个电脑设备都使用某种形式的软件来执行其预定任务.在软件开发的早期,对产品进行了严格的bug和其他缺陷测试.在过去的十多年里,软件通过互联网发布,目的是通过应用新版本的软件来修复任何错误.在某些情况下 ...