2048
2016-07-11 14:29
543 查看
简单2048 游戏开发
主布局
一个TextView用来显示分数一个GridLayout用来显示游戏界面,4X4的方格
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/score" /> <TextView android:id="@+id/tv_score" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> <GridLayout android:id="@+id/gameview" android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="1" > </GridLayout> </LinearLayout>
自定义GrildLayout,编写GameView类 继承自 GrildLayout
写上三个构造方法编写初始化方法:initView()
设置为4列,并设置背景颜色
添加触摸事件 的监听
在监听器中判断手指移动的方向
先判断是竖直方向还是水平方向
在根据偏移量判断具体方向
根据判断出的方向,调用具体的方法,方法先声明,此时不必实现
定义卡片类
可以将每个数字看做是一个卡片,定义这个类,继承自FrameLayout定义两个变量 int num,TextView lable;
在构造方法中对lable初始化
num的get和set方法
equals方法,判断两个卡片的数字是否相等
在GameView中添加卡片
首先要获得屏幕的宽高来确定卡片的宽以及添加卡片在onSizeChanged方法中获得卡片宽
int cardWidth = (Math.min(w, h) - 10) / 4;
调用addCards(cardWidth,cardWidth)方法
调用startGame方法
声明Card数组,4*4
在addCards方法中初始化数组
Card card; for (int y = 0; y < 4; y++) { for (int x = 0; x < 4; x++) { card = new Card(getContext()); card.setNum(0); addView(card, cardWidth, cardHeight); cardMap[x][y] = card; } }
startGame方法是要重新开始游戏的方法,所以要对cardMap数组进行初始化,之后调用两次addRandomNum方法添加两个随机数
addRandomNum方法
声明一个Arraylist用来存放Point对象
首先清空list
循环遍历cardMap数组,如果cardMap[x][y].getNum()== 0则add到list中
循环结束后,从list中随机remove出一个Point对象,这个Point就是要设置随机数的位置
对该位置设置随机数 2:4 = 9:1
实现四个方向滑动的方法
/** * 手指向左移动 */ public void moveLeft() { // 一行一行的遍历 for (int y = 0; y < 4; y++) { // 从左开始 for (int x = 0; x < 4; x++) { // 从当前位置向右遍历 for (int x1 = x + 1; x1 < 4; x1++) { // 找到有数字的位置 if (cardMap[x1][y].getNum() > 0) { // 当前位置为0 if (cardMap[x][y].getNum() <= 0) { cardMap[x][y].setNum(cardMap[x1][y].getNum()); cardMap[x1][y].setNum(0); x--; } else if (cardMap[x1][y].equals(cardMap[x][y])) { // 如果两个数字相等 cardMap[x][y].setNum(cardMap[x][y].getNum() * 2); cardMap[x1][y].setNum(0); // 设置分数 } break; } } } } } /** * 向右 */ public void moveRight() { // 一行一行遍历 for (int y = 0; y < 4; y++) { // 从右开始 for (int x = 3; x >= 0; x--) { // 从当前位置向左 for (int x1 = x - 1; x1 >= 0; x1--) { if (cardMap[x1][y].getNum() > 0) { // 当前位置为0 if (cardMap[x][y].getNum() <= 0) { cardMap[x][y].setNum(cardMap[x1][y].getNum()); cardMap[x1][y].setNum(0); // 重新遍历一遍 x++; } else if (cardMap[x][y].equals(cardMap[x1][y])) { // 如果两个数字相等 cardMap[x][y].setNum(cardMap[x1][y].getNum() * 2); cardMap[x1][y].setNum(0); } break; } } } } } /** * 向上 */ public void moveUp() { // 一列一列遍历 for (int x = 0; x < 4; x++) { // 从上向下 for (int y = 0; y < 4; y++) { // 当前位置向下 for (int y1 = y + 1; y1 < 4; y1++) { // 找到数字 if (cardMap[x][y1].getNum() > 0) { // 当前位置数字为0 if (cardMap[x][y].getNum() <= 0) { cardMap[x][y].setNum(cardMap[x][y1].getNum()); cardMap[x][y1].setNum(0); y--; } else if (cardMap[x][y].equals(cardMap[x][y1])) { cardMap[x][y].setNum(cardMap[x][y1].getNum() * 2); cardMap[x][y1].setNum(0); } break; } } } } } /** * 向下 */ public void moveDown() { // 一列一列遍历 for (int x = 0; x < 4; x++) { // 向上遍历 for (int y = 3; y >= 0; y--) { // 从当前位置向上遍历 for (int y1 = y - 1; y1 >= 0; y1--) { // 找到值 if (cardMap[x][y1].getNum() > 0) { // 当前位置为0 if (cardMap[x][y].getNum() <= 0) { cardMap[x][y].setNum(cardMap[x][y1].getNum()); cardMap[x][y1].setNum(0); y++; } else if (cardMap[x][y].equals(cardMap[x][y1])) { cardMap[x][y].setNum(cardMap[x][y1].getNum() * 2); cardMap[x][y1].setNum(0); } break; } } } } }
此时可以多生成几个随机数来测试一下是否实现滑动的方法
判断游戏结束
判断游戏不结束的条件:1.当前位置的数字为0
2.当前数字和它四个方向上的数字有相同
若游戏结束,弹出一个对话框
设置按钮 重来
设置分数显示
在MainActivity中设置一系列的方法static MainActivity getInstance()用来获取MainActivity的实例
clearScore()清空得分
addScore(int num)添加得分
showScore()显示得分
然后在GameView中,startGame中调用clearScore清空得分
在每一步滑动之后 addScore
游戏开发完成
源码:http://pan.baidu.com/s/1skPY8l3相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories