碰见这款大名鼎鼎的游戏是在我失意之时,玩着玩着竟有了用java写写看的想法,毕竟我java用的不熟,也算是一个锻炼。
drop7的算法很简单,把每个球看成一个元素,元素内的数字如果和其所在的行(空位即止)或列上的元素个数相同,就可以被消除。
因此核心算法应该是这样的:
元素状态有三种,0表示正常,2表示白色块,需要周围消除两次才能显示数字。随机产生元素上的数字,30%的概率设置元素为状态2。
1.使用元素二维数组记录棋盘上的状态
2.元素下落时,做如下判断
元素所在的列中元素个数是否等于元素上的数字
向左向右遍历该行,判断所在的行中元素个数是否等于元素上的数字
3.判断通过时,元素爆炸,爆炸时遍历上下左右四个元素,如果出现状态>0的元素,则将状态减1。
4.设定轮次,若所走的步数达到要求,则从底部增加一行状态为2的白色元素。
5.开盘可考虑随机在棋盘上添加任意个元素,而后计算一轮的方式,也可以使用随机下落N个元素的方式。因为当时已经写好了下落的方法,为了偷懒,选了后者。
最后的效果图:
核心算法并不复杂,开发的难度主要是在swing的设计上:
1.窗体用JFrame无问题,旁边的等级,步数等都是JLabel,直接添加在JFrame上。右下的规则也是JLabel,点击后会弹出一个预设好的图片,进行规则简介。
2.棋盘使用JPanel,横竖线用paint方法来写,定好窗体大小,两个for循环分别画出8条横线和8条竖线。
3.元素使用JTextArea,主要是为了上面写数字比较方便。同样是为了方便,没有使用圆形的元素,这样直接用setBackground方法就能设置好颜色。
4.建立7个透明的jpanel,覆盖在每一列上,并添加鼠标动作,点击任意一个时判断在其所覆盖的列下落元素。
5.右侧的下一个下落的元素比较重要,每次下落时,我用的方法是新实例化一个对象,对象复制右侧元素的状态,而后让对象下落并重置右侧元素。当然也可以直接拿右侧的元素下落到棋盘然后重新生成新的右侧元素。
6.下落时的一系列动作涉及到棋盘的刷新,我选择的方法是直接让新元素落位后,开一个新的线程来加载一系列动作,因为如果使用主线程,动画都会消失,只会显示最后的结果。
7.当然分数的算法是我自己定的,第一轮消除每个7分,第二轮每个14分,以此类推。
8.最后为了推广,用redis做了一个排行版,每次玩完一局输入名字(类似街机),而后记录在redis的一个hashmap里。
纯为好玩,欢迎交流。