【Android】基于GridLayout的Game2048开发

一、2048游戏的玩法

每次可以选择上下左右任何一个方向去滑动,每滑动一次,所有的数字方块都会往滑动的方向靠拢外,系统也会在空白的地方随机出现一个数字方块,数字一般是2或4,相同数字的方块会相加成一个数字。不断的叠加最终拼凑出2048这个数字就算成功。

二、 游戏的开发

(一)游戏的布局

【Android】基于GridLayout的Game2048开发
总项目结构及主要布局GridLayout:
【Android】基于GridLayout的Game2048开发

(二)实现游戏的主类

在初始化一个GameView,继承GradView,并加入一个初始化游戏view的方法initGameView
【Android】基于GridLayout的Game2048开发
在layout文件中将gridLayout用自己定义的GameView来绑定。

(三)游戏触控的交互设计

在gameview中重新触控的方法,判读手指滑动的方向。
在initGameView中加上setOnTouchListener
【Android】基于GridLayout的Game2048开发
【Android】基于GridLayout的Game2048开发

(四)实现卡片类Card.java

1.定义一个Card.java
2、在构造方法中初始化label
3.添加构造方法
4、定义一个num的成员变量,来显示卡片上的值

【Android】基于GridLayout的Game2048开发
5、定义一个TextView的标签label在卡片上显示文字
【Android】基于GridLayout的Game2048开发
6、在num的set方法中实现label的值显示
7、写一个判断两个卡片是否相同的方法
8、设置不同数字对应的颜色
【Android】基于GridLayout的Game2048开发

(五)在GameView中添加游戏卡片

1、计算卡片的宽度
为了让卡片铺满整个gameview,要根据屏幕的大小,动态的计算每个卡片的大小
在gameView中重写onSizeChanged方法:
【Android】基于GridLayout的Game2048开发
为了防止手机的旋转导致屏幕的宽高变化,先设置手机屏幕的样式为竖屏
【Android】基于GridLayout的Game2048开发
【Android】基于GridLayout的Game2048开发
2、增加一个addCards的方法,并在onSizeChange中
【Android】基于GridLayout的Game2048开发
并在initGameView中添加,网格每行4列
【Android】基于GridLayout的Game2048开发
最后运行后效果如下:
【Android】基于GridLayout的Game2048开发

3、.设置GameView的背景色,card的背景色,card的label显示居中,label的margin
【Android】基于GridLayout的Game2048开发
在card的初始化中
【Android】基于GridLayout的Game2048开发
4、在GameView定义一个二维数据来记录卡片的方阵
【Android】基于GridLayout的Game2048开发
并在添加卡片的方法addCards中为卡片矩阵赋值
【Android】基于GridLayout的Game2048开发

(六)在GameView中添加随机数

在新建游戏时,会随机在gameView中出现两个卡片,并加上2、4两个值。2和4出现的概率大致是9:1。

1、为了遍历所有的空的卡片,我们在Card.java中设定当num=0是为空
【Android】基于GridLayout的Game2048开发
2、在GameView中定义一个集合来存放card的值为0的card的位置
【Android】基于GridLayout的Game2048开发
3、在GameView中定义一个addRandomNum的方法
【Android】基于GridLayout的Game2048开发【Android】基于GridLayout的Game2048开发

4 在GameView中定义一个startGame的方法
【Android】基于GridLayout的Game2048开发
在onSizeChange中引入一个startGame的方法。
【Android】基于GridLayout的Game2048开发

(七)在MainActivity中实现重启游戏的按钮功能

【Android】基于GridLayout的Game2048开发
【Android】基于GridLayout的Game2048开发

这里调用,startGame()函数,所以函数不能为private

(八)实现2048的游戏逻辑

重新写四个滑动函数 swipeLeft等:
【Android】基于GridLayout的Game2048开发
【Android】基于GridLayout的Game2048开发

(九)游戏的计分

1、利用layout上的TextView显示计分
【Android】基于GridLayout的Game2048开发
定义一个计分变量,定义一个清理计分,显示计分,增加计分的方法
【Android】基于GridLayout的Game2048开发
2、为了能在GameView类中调用这个方法,定义一个MainActivity的静态对象mainAcitivity,并定义一个get接口。
【Android】基于GridLayout的Game2048开发
为了给这个mainActivity设为当前加载的MainActivity的对象,在构造法中增加一个赋值的方法。
【Android】基于GridLayout的Game2048开发
3、在GameView中加上,一个计分的方法
【Android】基于GridLayout的Game2048开发
在每次滑动后有卡片叠加,就执行一次计分
【Android】基于GridLayout的Game2048开发
4、在startGame中的startGame方法中增加一个计分清零代码
【Android】基于GridLayout的Game2048开发
5 在每次滑动后,如果有卡片合并或有卡片滑动,再次添加新的卡片。
在每个滑动的方法中加上:
【Android】基于GridLayout的Game2048开发
【Android】基于GridLayout的Game2048开发
如果有合并加上
【Android】基于GridLayout的Game2048开发

(十)检查游戏结束

在GameView中增加一个checkOver的方法,在每次新增随机数后,都要做一次游戏结束检查。
【Android】基于GridLayout的Game2048开发
判断依据:当所以card都有数据,请每一个card的前后左右的都不相同
【Android】基于GridLayout的Game2048开发
【Android】基于GridLayout的Game2048开发
运行效果:
【Android】基于GridLayout的Game2048开发

三、Github源码

~