2048
来源:互联网 发布:魔法卡片收藏家软件 编辑:程序博客网 时间:2024/05/23 21:49
简单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方法
- 在onSizeChanged方法中获得卡片宽
声明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
0 0
- 2048
- 2048
- 2048
- 2048
- 2048
- 2048
- 2048
- 2048
- 2048
- 2048
- 2048
- 2048
- 2048
- 2048
- 2048
- RFC 2048
- zoj 2048
- hdu 2048
- 关于Activex控件中创建含有子控件的对话框失败问题
- NumPy数组
- PostgreSQL 启动失败解决方法
- 基于WDF的PCI/PCIe接口卡Windows驱动程序(1)-WDF概述及开发环境搭建
- JavaScriptCore.framework简单使用
- 2048
- 语义化标签2
- unity和ue4中的置换材质 dx11曲面细分效果
- 深入剖析Java中的装箱和拆箱
- 全局变量与局部变量的区别7
- Swift - 与OC混编时如何创建桥接头文件
- 浦发银行大数据库表备份设计思路(数据泵)
- SpringMVC 组件类大全
- 语义化标签3