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方法
  • 声明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
原创粉丝点击