1. 从去年实习开始算起,到现在正式工作两月正好是入行一周年,在这一周年之时写个东西总要纪念一下,所以这个扫雷游戏就诞生了,虽然没有什么创新,但我还是尝试加了点我的东西在里面,开发全过程花了我两个周末的时间,今天晚上将他公布出来……
2. 用了经典的MVC软件构加,如下图:
如上图所示显示主要类:
视图层:用Swing实现,非常简单,一个Frame里两个Panel
控制层:所以逻辑的核心,用了两个线程完成,一个主线程,一个协助线程,控制所有逻辑
模型层:负责控制Resource如图片,声音,持久化等操作
3 用Spring AOP的思路实现向Console输出日志记录
没有错我是用动态代理的原理写了一个Commandline,如果以CLiRunner的方式启动可以输出日志,核心代码:
ConsoleHanlder hanlder = new ConsoleHanlder(gamePanel);
Object obj = Proxy.newProxyInstance(MineFrame.class.getClassLoader(), new Class[]{GameListener.class}, hanlder);
proxy = (GameListener) obj;
4 模型层核心类用单例设计模式和工厂设计模式来完成
单例和工厂的妙处这里就不多说,贴出核心代码:
private static ResourceManager instance;
public static ResourceManager getInstance() {
if(instance == null) {
instance = new ResourceManager();
}
return instance;
}
private ResourceManager() {
}
5 DNS算法找出要显示的大片空白
代码:
private Set<Point> searchWhiteArea(int i, int j) {
Set<Point> whiteSet = new HashSet<Point>();
whiteSet.add(new Point(i,j));
blankArea(i, j, whiteSet);
blankAreaEdge(whiteSet);
return whiteSet;
}
private void blankArea(int i, int j, Set<Point> whiteSet) {
if (mines[i][j] != 0) {
return;
}
addWhitePoint(i, j - 1, whiteSet);
addWhitePoint(i + 1, j, whiteSet);
addWhitePoint(i, j + 1, whiteSet);
addWhitePoint(i - 1, j, whiteSet);
}
private void addWhitePoint(int i, int j, Set<Point> whiteSet) {
if(i > paramMap.get(Constants.GRID_X) - 1 || i < 0 || j > paramMap.get(Constants.GRID_Y) - 1 || j < 0) {
return;
}
if(mines[i][j] == 0 ) {
Point p = new Point(i,j);
if(!whiteSet.contains(p)) {
whiteSet.add(p);
blankArea(i,j, whiteSet);
}
}
}
private void blankAreaEdge(Set<Point> whiteSet) {
Set<Point> edgePoints = new HashSet<Point>();
for (Point p : whiteSet) {
addEdgePoint(p.x, p.y - 1, edgePoints);
addEdgePoint(p.x + 1, p.y - 1, edgePoints);
addEdgePoint(p.x + 1, p.y, edgePoints);
addEdgePoint(p.x + 1, p.y + 1, edgePoints);
addEdgePoint(p.x, p.y + 1, edgePoints);
addEdgePoint(p.x - 1, p.y + 1, edgePoints);
addEdgePoint(p.x - 1, p.y, edgePoints);
addEdgePoint(p.x - 1, p.y - 1, edgePoints);
}
whiteSet.addAll(edgePoints);
}
private void addEdgePoint(int i, int j, Set<Point> edgePoints) {
if(i > paramMap.get(Constants.GRID_X) - 1 || i < 0 || j > paramMap.get(Constants.GRID_Y) - 1 || j < 0) {
return;
}
if(mines[i][j] >= 1 || mines[i][j] <= 8) {
Point p = new Point(i,j);
if(!edgePoints.contains(p)) {
edgePoints.add(p);
}
}
}
6. Java代码播放声音
游戏过程会有各种声音发出,这里调用JavaAPI来完成,如下
private static final String[] sounds = {
"continue.wav",
"scoring.wav",
"over.wav",
"winning.wav"
};
private static AudioClip[] pool = new AudioClip[sounds.length];
public static void play(int type) {
if(pool[type] == null) {
try {
URL url = ResourceManager.class.getResource(
"/com/kylin/mine/resource/" + sounds[type]);
if(url != null) {
pool[type] = Applet.newAudioClip(url);
}
} catch(Exception e) {
e.printStackTrace();
}
}
if(pool[type] != null) {
pool[type].play();
}
}
7.贴几个截图
模仿Window扫雷,可以玩三种不同的级别
显示游戏失败画面
显示游戏过程
8. 两个地方不完善:显示动画和统计信息
9.附件文件中有源代码,如有人提出指导我不胜感激。
10. 下载mine.rar解压开文件夹,在该文件夹下点击mine.bat可以正常启动,点击mineCli.bat可以输出日志运行,这样可以明白具体设计思路
分享到:
相关推荐
项目6-经典扫雷游戏-项目源码与素材,Scratch少儿编程,经典教学作品,儿童益智游戏。 连同项目报告,教师参考程序和学生文件
【扫雷游戏-Swing】是一款基于Java Swing图形用户界面(GUI)开发的经典益智游戏,旨在帮助初学者提升编程逻辑,巩固数组运用和深化位运算理解。Swing是Java提供的一个用于创建桌面应用的库,它允许开发者构建美观且...
以前经常玩的扫雷游戏,现在有Java实现它,有代码和打包成jar
9、扫雷游戏--电脑基础知识.docx
扫雷游戏-数组的实际应用
Java游戏扫雷-简易复制品.zipJava游戏扫雷-简易复制品.zip Java游戏扫雷-简易复制品.zipJava游戏扫雷-简易复制品.zip Java游戏扫雷-简易复制品.zipJava游戏扫雷-简易复制品.zip Java游戏扫雷-简易复制品.zipJava游戏...
扫雷游戏(含BCB源码) // 其实很早就写过一个pascal版本的扫雷游戏,很简陋的,觉得不太好,正好工作的时候 // 用到BCB,就想写一个BCB版本的扫雷游戏,其实就是自己写着玩玩. // 从开始写到写完,间隔很久,中间...
深入浅出:扫雷游戏-从设计到代码
********** *扫雷游戏** *java 代码* **********
经典扫雷游戏,jQuery、HTML5、CSS3等技术实现。可选择难度,可自定义难度(宽度、高度、雷数),可选游戏界面主题,界面精美,有非常详细的注释提供参考!
☆ 资料介绍:☆ 游戏名称:经典小游戏 - 扫雷游戏; 开发环境:Visual Studio 2010 SP1;
Java版扫雷游戏-后台功能实现子系统.docx
用BASIC4PPC编写的扫雷游戏 将TXT后缀改为SBP既可 见笑...
这个用java实现的扫雷小游戏是我在课余的时间自己做的,觉得还行啊,要是有bug,还请大家帮忙改进哦。
这是扫雷的Win32SDK源代码,对Windows游戏编程很有帮助,初学者可以参考下。
Matlab的GUI制作的扫雷游戏-拿Matlab的GUI来扫个雷.rar 游戏可选择低级 中级 高级
仿扫雷游戏源代码这个有关很多,看看其实挺好的
经典扫雷游戏 - 微信小程序
由于提供的压缩包子文件名为"实例7-8--扫雷--2个部分",我们可以推断这可能是一个教学序列的一部分,其中"7-8"可能代表课程或章节编号,而“2个部分”可能指的是扫雷游戏的实现被分解为了两部分,比如一部分负责游戏...