目录

  • 一、2048游戏的玩法
  • 二、 游戏的开发
  • (一)游戏的布局
  • (二)实现游戏的主类
  • (三)游戏触控的交互设计
  • (四)实现卡片类Card.java
  • (五)在GameView中添加游戏卡片
  • (六)在GameView中添加随机数
  • (七)在MainActivity中实现重启游戏的按钮功能
  • (八)实现2048的游戏逻辑
  • (九)游戏的计分
  • (十)检查游戏结束
  • (十一)游戏背景音乐
  • 三、Github源码


一、2048游戏的玩法

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

android gridlayout网格线 安卓开发gridlayout_初始化

二、 游戏的开发

(一)游戏的布局

android gridlayout网格线 安卓开发gridlayout_Android_02


总项目结构及主要布局GridLayout:

android gridlayout网格线 安卓开发gridlayout_Android_03

(二)实现游戏的主类

在初始化一个GameView,继承GradView,并加入一个初始化游戏view的方法initGameView

android gridlayout网格线 安卓开发gridlayout_初始化_04


在layout文件中将gridLayout用自己定义的GameView来绑定。

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

在gameview中重新触控的方法,判读手指滑动的方向。

在initGameView中加上setOnTouchListener

android gridlayout网格线 安卓开发gridlayout_Android_05


android gridlayout网格线 安卓开发gridlayout_Android_06

(四)实现卡片类Card.java

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

android gridlayout网格线 安卓开发gridlayout_GridLayout_07


5、定义一个TextView的标签label在卡片上显示文字

android gridlayout网格线 安卓开发gridlayout_java_08


6、在num的set方法中实现label的值显示

7、写一个判断两个卡片是否相同的方法

8、设置不同数字对应的颜色

android gridlayout网格线 安卓开发gridlayout_java_09

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

1、计算卡片的宽度

为了让卡片铺满整个gameview,要根据屏幕的大小,动态的计算每个卡片的大小

在gameView中重写onSizeChanged方法:

android gridlayout网格线 安卓开发gridlayout_Game2048_10


为了防止手机的旋转导致屏幕的宽高变化,先设置手机屏幕的样式为竖屏

android gridlayout网格线 安卓开发gridlayout_Android_11


android gridlayout网格线 安卓开发gridlayout_java_12


2、增加一个addCards的方法,并在onSizeChange中

android gridlayout网格线 安卓开发gridlayout_初始化_13


并在initGameView中添加,网格每行4列

android gridlayout网格线 安卓开发gridlayout_GridLayout_14


最后运行后效果如下:

android gridlayout网格线 安卓开发gridlayout_初始化_15

3、.设置GameView的背景色,card的背景色,card的label显示居中,label的margin

android gridlayout网格线 安卓开发gridlayout_初始化_16


在card的初始化中

android gridlayout网格线 安卓开发gridlayout_java_17


4、在GameView定义一个二维数据来记录卡片的方阵

android gridlayout网格线 安卓开发gridlayout_初始化_18


并在添加卡片的方法addCards中为卡片矩阵赋值

android gridlayout网格线 安卓开发gridlayout_GridLayout_19

(六)在GameView中添加随机数

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

1、为了遍历所有的空的卡片,我们在Card.java中设定当num=0是为空

android gridlayout网格线 安卓开发gridlayout_Game2048_20


2、在GameView中定义一个集合来存放card的值为0的card的位置

android gridlayout网格线 安卓开发gridlayout_Android_21


3、在GameView中定义一个addRandomNum的方法

android gridlayout网格线 安卓开发gridlayout_Game2048_22

android gridlayout网格线 安卓开发gridlayout_java_23

4 在GameView中定义一个startGame的方法

android gridlayout网格线 安卓开发gridlayout_初始化_24


在onSizeChange中引入一个startGame的方法。

android gridlayout网格线 安卓开发gridlayout_初始化_25

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

android gridlayout网格线 安卓开发gridlayout_java_26


android gridlayout网格线 安卓开发gridlayout_Android_27

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

(八)实现2048的游戏逻辑

重新写四个滑动函数 swipeLeft等:

android gridlayout网格线 安卓开发gridlayout_Game2048_28


android gridlayout网格线 安卓开发gridlayout_java_29

(九)游戏的计分

1、利用layout上的TextView显示计分

android gridlayout网格线 安卓开发gridlayout_GridLayout_30


定义一个计分变量,定义一个清理计分,显示计分,增加计分的方法

android gridlayout网格线 安卓开发gridlayout_初始化_31


2、为了能在GameView类中调用这个方法,定义一个MainActivity的静态对象mainAcitivity,并定义一个get接口。

android gridlayout网格线 安卓开发gridlayout_java_32


为了给这个mainActivity设为当前加载的MainActivity的对象,在构造法中增加一个赋值的方法。

android gridlayout网格线 安卓开发gridlayout_Game2048_33


3、在GameView中加上,一个计分的方法

android gridlayout网格线 安卓开发gridlayout_Android_34


在每次滑动后有卡片叠加,就执行一次计分

android gridlayout网格线 安卓开发gridlayout_Game2048_35


4、在startGame中的startGame方法中增加一个计分清零代码

android gridlayout网格线 安卓开发gridlayout_Android_36


5 在每次滑动后,如果有卡片合并或有卡片滑动,再次添加新的卡片。

在每个滑动的方法中加上:

android gridlayout网格线 安卓开发gridlayout_Game2048_37


android gridlayout网格线 安卓开发gridlayout_Game2048_38


如果有合并加上

android gridlayout网格线 安卓开发gridlayout_GridLayout_39

(十)检查游戏结束

在GameView中增加一个checkOver的方法,在每次新增随机数后,都要做一次游戏结束检查。

android gridlayout网格线 安卓开发gridlayout_Game2048_40


判断依据:当所以card都有数据,请每一个card的前后左右的都不相同

android gridlayout网格线 安卓开发gridlayout_Android_41


android gridlayout网格线 安卓开发gridlayout_Game2048_42


运行效果:

android gridlayout网格线 安卓开发gridlayout_java_43

(十一)游戏背景音乐

界面:

android gridlayout网格线 安卓开发gridlayout_Android_44


自定义的MediaService:

用法在上一篇博客中有讲解 链接点这儿

android gridlayout网格线 安卓开发gridlayout_java_45


配置文件:

android gridlayout网格线 安卓开发gridlayout_Android_46


Main函数调用方法:

android gridlayout网格线 安卓开发gridlayout_java_47


android gridlayout网格线 安卓开发gridlayout_Game2048_48

三、Github源码

本次项目源码链接:
https://github.com/cungudafa/Game2048