扫雷项目总结
扫雷项目总结
语言选择
我们选择了Java作为编程语言,理由如下:Java语言适用于开发窗体和简单的动画效果;因为学过C++,所以Java学起来比较容易;学习Java语言可以为以后在Android平台上开发APP打基础;Java的可移植性比较强。
项目选择
扫雷是一个经典的小游戏,自从1992年发布了windows3.1之后便风靡全球,成为每个操作系统都必备的游戏。考虑到剩余时间和项目大小,我们便选择了扫雷这个经典的windows游戏作为开发目标,目的便是重现经典扫雷的界面和玩法,并通过扫雷来检验一下学习的Java的成果,熟悉Java语言的具有可视界面项目开发。
扫雷游戏基本玩法
游戏区包括雷区、地雷计数器(位于左上角,记录剩余地雷数)和计时器(位于右上角,记录游戏时间),确定大小的矩形雷区中随机布置一定数量的地雷(初级为9*9个方块10个雷,中级为16*16个方块40个雷,高级为16*30个方块99个雷,自定义级别可以自己设定雷区大小和雷数,但是雷区大小不能超过24*30),玩家需要尽快找出雷区中的所有不是地雷的方块,而不许踩到地雷。
游戏的基本操作包括左键单击(Left Click)、右键单击(Right Click)、双击(Chording)三种。其中左键用于打开安全的格子,推进游戏进度;右键用于标记地雷,以辅助判断,或为接下来的双击做准备;双击在一个数字周围的地雷标记完时,相当于对数字周围未打开的方块均进行一次左键单击操作:
左键单击:在判断出不是雷的方块上按下左键,可以打开该方块。如果方块上出现数字,则该数字表示其周围3×3区域中的地雷数(一般为8个格子,对于边块为5个格子,对于角块为3个格子。所以扫雷中最大的数字为8);如果方块上为空(相当于0),则可以递归地打开与空相邻的方块;如果不幸触雷,则游戏结束。
右键单击:在判断为地雷的方块上按下右键,可以标记地雷(显示为小红旗)。重复一次或两次操作可取消标记(如果在游戏菜单中勾选了“标记(?)”,则需要两次操作来取消标雷)。 双击:同时按下左键和右键完成双击。当双击位置周围已标记雷数等于该位置数字时操作有效,相当于对该数字周围未打开的方块均进行一次左键单击操作。地雷未标记完全时使
用双击无效。若数字周围有标错的地雷,则游戏结束,标错的地雷上会显示一个“ ×”。(摘自百度百科)
项目核心
我们从零做起,重载了Java的java.swing.JFrame类用来做界面,并重载了java.swing.JButton类来做按钮。因为界面和win的扫雷很相似所以无需过多的描述。有一点不同是我们为了照顾新手加入了新的内容,就是在不易判断是不是地雷的时候使用菜单里的提示并点击一个没有点过的按钮可以自动把旗子标上,这是一个很像作弊的设定所以我们在一局中只能使用三次。并且每用一次时间就会加30秒。
首先我们来看一些重要的算法。第一便是生成雷,怎样生成指定的地雷数呢?我们经过考虑和实践,决定声明一个重载按钮类的二维数组,用Random函数随机生成数字来指定地雷。用一个循环语句来确定地雷分布。因为有可能随机到一个相同的按钮,所以我们用了一个递归来解决重复问题。
第二便是解决获得格子周围雷数的算法。我们在按钮类里加入了一个整数值,在生成雷的时候把这个整数值设为-1,然后再用循环遍历了不是雷的方格。将数字记录下来,根据数字来决定怎么显示点击后的图片。
第三就是按钮类的实现了。我们需要在进行游戏时对按钮左击,右击和同时点击的事件设计不同的监听器并对其响应,还有新加入的辅助功能。因为事件颇多,所以在这方面下了很多功夫,调试出了很多bug,比如有一个bug就是我们运行程序的时候竟然没有绘出方格,原因是没有把引用类型的变量实例化,这也是常见的错误,估计很多C++学过的人都会犯这种错。还有就是在判断是否点击过我们发生了分歧,一个想法是新加入一个boolean类型的成员变量visted,另一个是直接使用之前用来记录周围地雷数的int变量。两种方法各有优劣,为了简单方便并且直观地编程,我们最后选择了boolean类型的visited。
项目难点
项目过程中有一个非常困扰我们的事,就是怎么实现按钮只能按一次的效果。经过讨论,我们决定把指针正常,按下和悬浮的Icon都设置了为点击过的,这样就形成了一种没办法再点的错觉。同时我们当然也把事件的原监听器移除了,改成了笑脸的变化,这样一来就出现了无法点击的效果,但其实那是可以点击的。其中还有一个大麻烦就是设置旗子之后按钮还是可以触发地雷,我们最后决定把上述思路也做了调整,把右键点击的监听器也做了修改。
所以,总的来说,这个项目最大的难度就在于一堆Button的属性应该怎么改变还有监
听器应该如何设置和工作。虽然做界面什么的我们完全是照搬经典windows扫雷的,但是我们也有创新点,就是刚打开游戏的时候就选择了是什么难度,尽管有时候觉得麻烦,但是这对不想到菜单里找难度的人来说还是方便了一些。
最终总结
我们虽然没有接触过Java但是经过了不懈的努力和网上查阅大量的资料也算是做出来了个还算差不多的项目,也许这个项目没有什么创新点,也许很多人都会觉得太过简单,但是我们却做得不太容易,这虽然是一个简单的项目但是很有实践意义。我们的主要目的就是去熟悉Java和创造用户界面,这些经验都是很宝贵的。
2014年9月