连连看原理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用 JAVA 开发游戏连连看
(注:这篇文章是在2004.12完成的,当时是为了向《电脑爱好者》投稿,这是原稿,由于此杂志面向的读者原因,因此文章中有些地方显得过“白”,在此后,稿子经过两次修改,虽然最终得以发表,但已改得基本上没有太多的技术性了,而且两次改稿下来,一共写了近6万字,累~~~,现在将其略作修改放在主页上,希望对大家有所帮助)
提起 JAVA ,相信大家也不会陌生了吧, JAVA 是一门相当优秀的语言。目前 JAVA 领域 J2EE 、 JSP 、STRUTS 等技术不知有多么的热门,他们的主要用途是用来进行企业开发, J2ME 也由于能够被大量的移动设备所支持,因此,也有不少的程序,特别是游戏是在 J2ME 平台上开发的,反而是 J2SE ,似乎只是被人们用来做一做程序界面的,就连 APPLET 也很少有人使用了(有了 FLASH ,谁还用 APPLET 啊)。用 JAVA 来开发桌面平台的游戏,似乎很少有人这么做,也可能大家一想到做游戏都会想到 C 、 C++ 、汇编等。
前段日子我迷上的 QQ 游戏中的“连连看”,游戏之余,突发奇想,也想自己用做一个试试,经过十来天的奋战,终于完成了。
我选择了 JAVA 来开发这个游戏,之所以选择 JAVA ,是因为:
1.很少有人用 JAVA 来开发桌面游戏,是因为 JAVA 在网络方面的强大优势使人们忽略了 JAVA
在桌面平台上的开发,特别是游戏方面,而并不是因为 JAVA 做不到,而我,却希望通过我的尝试来告诉大家:原来 JAVA 也能做出漂亮的桌面游戏的(我可不是在夸我的程序:))
2.由于 JAVA 生来就是为网络服务的,因此,一旦有需要,很容易将单机版的游戏改为网络版的(我
现在就在做:))
3.由于现在有很多手机都支持 J2ME ,而 J2ME 和 J2SE 是一脉相承的,因此,用 JAVA 编写的
游戏可以很容易移植到 J2ME 平台上,想想当你的游戏在手机上运行是一样多么愉快的事情啊。开发的周期并不是很长,可是开发过程中我也遇到不少困难,也有不少收获,我希望将我的开发过程写下来,与大家共同进步:)
在我的开发过程中,你可以发现我是这么做的:
1.使用数组实现算法的核心
2.使用布局和按钮来实现操作
3.使用布局实现用户界面
4.使用线程在同一时间做更多的事情
5.使用静态变量来减少内存的开销,并且保持信息的一致性
6.使用文件来保存用户的配置信息
7.使用声音让程序更有生气
(之一)动手前的准备
看看别人现成的游戏
在盖房子之前,我们都会先打好地基,然后搭起框架,最后再就是一点一点添砖加瓦,做软件也是一样的道理,都是从大体的框加向细节部分设计实现,现在,我们开始吧。
其实不管是做软件也好,做游戏也好,只要是写程序,在动手之前是一定会存在需求和分析的,如果不经过一定的分析就开始动手写程序,那么,这个程序一定会很难写下去的,最后的结果可能会导致放弃。
那么,在我们动手之前,让我们先简单的分析一下吧。由于“连连看”并不是一个我们凭空开发的游戏,并且网上也已经有很多别人已经开发好的版本,因此,对于我们来说,我们已经拥有了一个很好的原型(比如说 QQ 游戏中的“连连看”),分析起来也应该是轻松得多。由于 QQ 中的“连连看”是网络版,为了开发上的简便,我们先放弃网络功能,做一个简单的单机版就行了。现在,让我们现在来看一看 QQ 中的连连看吧。
“连连看”的游戏规则其实并不复杂,首先,游戏开始的时候,地图上会有由数张不同的图片随机分散在地图上(并且每张图片会出现偶数次,通常是 4 次),只需要在地图上找出两张相同的图片(点),并且这
两个点之前可以用不超过 3 条的直线连接起来就可以消除这两点,如此下去,直到地图上的点全部消除完就算游戏结束,怎么样,规则很简单吧?:)我们的开发就完全按照些规则来吧。
分析游戏规则找出算法
通过上面的分析,我们已经知道了游戏规则,可是,我们怎么样去实现呢?
其实所谓的实现也就是算法,那我们怎么样找出算法呢?别急,让我们来看一看上图,或者自己动手玩一玩别人做好的。
通过对上图的观察,我们发现,可以将游戏中的地图看作是一个二维数组,其中的所有图片(以下称“点”)可以看作是数组中的一个具体的元素。那么,游戏中相同的图片可以看作是数组中不同位置两个值相同的元素。至于直线,让我们给组数中的每一个元素赋一个特殊的值如 0 ,以表示地图上空白的位置。并且同时规定:当连续的具有该特殊值的点的横向索引或纵向索引相同时,可以认为这是一条直线,比如下图:
当数组中两点的值相同并且两点间只需要不超过 3 根直线能连接起来的时候,就让这两点的值变为 0 ,如果数组中全是 0 值的点,就认为游戏已经结束:)
怎么样,算法够简单了吧:)
用伪代码来描述程序的结构
现在,我们用伪代码来描述一下游戏,假设用户开始了游戏:
if ( 存在上次选择的点 ) {
if ( 当前点与上次选择的点可消除 ) {
消除两点;
上次选择的点 = null ;
if ( 地图上已没有可消除的点 ) {
游戏结束;
}
}
else {
上次选择的点 = 当前点;
}
}
else {
上次选择的点 = 当前点;
}
}
游戏结束;
看看有没有什么问题?如果没有问题,我们进入下一步吧:)
确定程序需要的模块
当伪代码完成后,并且在我们的大脑里转了几圈发现没有问题后,现在就可以开始进行模块的划分工作了。我们还是再看一看 QQ 中的“连连看”,整个程序只需要通过鼠标操作就可以了,按照 MVC 的结构来进行程序设计,那么我们需要一个 Model ,用来完成整个程序的核心算法;一个 View ,用来显示用户界面,当然还需要一个 Control ,用来处理用户鼠标的操作,这样一来,只需要三个模块就可以完成了。