您的位置:首页 > 移动开发 > Android开发

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android