前一段时间迷恋玩手游2048,周末无聊,就想着自己实现一个。源代码在“我分享的代码”中。下面是游戏的设计思路。
在设计的时候将整个程序分为两个部分,游戏模型部分和界面展示交互部分。
游戏模型部分主要是处理整个游戏的执行逻辑,首先介绍一下2048的游戏规则,根据用户滑动的方向,界面上的所有数字块会向那个方向靠边,并且将相同的数字合并,合并的数字越大,分数越高。例如向上滑动,所有数字块都会向上滑动合并直到不能上移为止。
根据游戏规则,游戏模型部分做以下处理,用一个table(数组)存储所有数字块,key(下标)作为数字块所在的位置(1-16),value(数组值)作为数字块上记录的值。
根据滑动的方向,首先需要做一次移动,然后做一次数字块的合并,最后再做一次移动。移动操作是一行一行的向所给方向移动,且移动到无法移动为止。合并从最靠边的倒数第二排向前一排合并,直到离边最远的一排。
经过这些步骤,完成用户的一次操作达到的效果。
如果第一次操作所有数字块均不能够移动并且没有能够合并的块,那么认为用户这次操作是无效的,不产生新的数字块。否则产生一个新的数字块。
产生新的数字块的方法是:将所有空闲的位置插入一个table中,然后在该table中随机选择一个位置作为新块的位置。然后产生该新块的值,即一个2或者一个4。我设定的产生概率是4:1。
产生新块后,检查是否所有位置都被占用,如果都被占用则检查向所有方向是否有能够合并的块,如果有,则继续等待用户的下一步操作,否则标记游戏结束。
计分方式:产生一个新块+1分,合并出一个新块,分数等于原来的分数+新块的值。
展示与交互
不断重绘数字块所在的table就可以获得需要的展示效果。
通过鼠标的拖动来确定移动的方向,那么按下时记录一个位置信息,放开时记录一个位置信息,根据两个位置信息确定拖动的方向,调用相应的操作。
可运行的程序可以在百度网盘上下载:http://pan.baidu.com/s/1gdJwDAN