Android版2048

虽然说2048是好久前比较火的小游戏,但直到最近才有机会去研究下2048实现的源码,这里就简单写一下我(bie)的(ren)思路:

首先2048需要有十六个卡片,这个卡片可以用FrameLayout的子类来实现(继承),里面可以用TextView来实现设置背景颜色,显示的数字等。这样我们就可以简单实现这个卡片啦:

public class Card extends FrameLayout {

private int num = 0;
    private TextView label;

public Card(Context context) {
        super(context);

label = new TextView(getContext());
        label.setTextSize(32);
        label.setGravity(Gravity.CENTER);
        label.setBackgroundColor(0x33ffffff);
        LayoutParams lp = new LayoutParams(-1, -1);
        lp.setMargins(10, 10, 0, 0);
        addView(label, lp);
        setNum(0);
    }

**********************************************

其次,我们需要添加十六个卡片到屏幕上,应该怎样实现这个屏幕呢?我们可以用GridLayout的子类(继承)实现,并用一个二维数组来存储下每个卡片的状态:

public class GameView extends GridLayout {

private Card cardsMap[][] = new Card[4][4];
    private List<Point> emptyPoint = new ArrayList();//记录空的位置

***********************************************

private void addCards(int cardWidth, int cardHeight) {//添加卡片
        Card cd;
        for (int x = 0; x < 4; x++) {
            for (int y = 0; y < 4; y++) {
                cd = new Card(getContext());
                cd.setNum(0);
                addView(cd, cardWidth, cardHeight);
                cardsMap[x][y] = cd;
            }
        }

}

******************************************

然后我们就需要去判断用户的手势。通过设置一个setOnTouchListener(new OnTouchListener())去监听用户的操作,当用户按下屏幕时,记录下此时的坐标,当用户手指离开屏幕时,计算坐标的偏移量,根据坐标偏移量的相对差来判断用户的意图是向上,向下,还是向左,向右:

public boolean onTouch(View arg0, MotionEvent arg1) {

switch (arg1.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    startX = arg1.getX();
                    startY = arg1.getY();
                    break;
                case MotionEvent.ACTION_UP:
                    offsetX = arg1.getX() - startX;
                    offsetY = arg1.getY() - startY;

if (Math.abs(offsetX) > Math.abs(offsetY)) {
                        if (offsetX < -3) {
                            slideLeft();
                        } else if (offsetX > 2) {
                            slideRight();
                        }
                    } else {
                        if (offsetY < -3) {
                            slideUp();
                        } else if (offsetY > 3) {
                            slideDown();
                        }
                    }
                    break;

}
                return true;

}

**************************************

判断出用户的意图后,我们就应该去处理相应的事件啦,这里只贴上向左滑动的处理代码,其他三个方向的处理相类似:

boolean flag = false;

for (int y = 0; y < 4; y++) {
            for (int x = 0; x < 4; x++) {
                for (int x1 = x + 1; x1 < 4; x1++) {
                    if (cardsMap[x1][y].getNum() > 0) {
                        if (cardsMap[x][y].getNum() <= 0) {
                            cardsMap[x][y].setNum(cardsMap[x1][y].getNum());
                            cardsMap[x1][y].setNum(0);
                            x--;
                            flag = true;

} else if (cardsMap[x][y].equals(cardsMap[x1][y])) {
                            cardsMap[x][y].setNum(cardsMap[x][y].getNum() * 2);
                            cardsMap[x1][y].setNum(0);
                            MainActivity.getMainActivity().addMyScore(
                                    cardsMap[x][y].getNum());
                            flag = true;
                        }
                        break;
                    }
                }
            }
        }
        if (flag) {
            addRandom();//随机地添加一个卡片(实际上设置相应位置上卡片的数字)
            checkComplete();//判断游戏是否结束

**************************************************

以上就是android版的2048实现的基本逻辑,可能有些不详细。如果需要详细的源码,可以联系我哈。

Android版2048

时间: 2024-08-07 09:20:25

Android版2048的相关文章

从零開始开发Android版2048 (二)获取手势信息

今天是尝试開始Android版2048小游戏的第二天.在今天,我主要学习了怎样获取用户在屏幕滑动的手势,以及对布局进行了一些小小的完好. 获取用户操作的手势(比方向左滑.向右滑等)主要用到了GestureDetector.这个类能够帮助我们获取一些常见的用户对屏幕的操作.比如单击.双击.按压.拖动等.详细的使用说明.大家能够查API也能够去百度,或者看我之前有一篇使用GestureDetector实现的小样例(http://blog.csdn.net/xiapinnong/article/det

从零开始开发Android版2048 (五) 撤销的实现

本篇的内容是,在前一篇的基础上加入了撤销的功能.撤销其实就是将当前的用户界面恢复到这次滑动值前的样子.我实现撤销的主要原理是,将每次滑动后界面上的格子和对应的数字记录下来,当然还有分数,把这些数据写入一个栈中,然后点击撤销操作的时候,将栈顶pop掉,读取下一个栈中的对象,并根据对象中存储的数据重新绘制界面. 下面是我用于存储每次界面情况的类,在这个类中保存了界面中主要的三个数据,空白格.数字格和当前的分数. package com.example.t2048; import java.util.

从零开始开发Android版2048 (三)逻辑判断

最近工作比较忙,所以更新的慢了一点,今天的主要内容是关于Android版2048的逻辑判断,经过本篇的讲解,基本上完成了这个游戏的主体部分. 首先还是看一下,我在实现2048时用到的一些存储的数据结构.我在实现时,为了省事存储游戏过程中的变量主要用到的是List. 比如说:List<Integer> spaceList = new ArrayList<Integer>();这个spaceList主要用于保存,所有空白格的位置,也就是空白格在GridLayout中的位置(从0到15)

从零開始开发Android版2048 (一)初始化界面

自学Android一个月多了,一直在工作之余零零散散地看一些东西.感觉经常使用的东西都有些了解了,可是一開始写代码总会出各种奇葩的问题.感觉还是代码写得太少.这样继续杂乱地学习下去进度也太慢了,并且学一点忘一点,效率太低.所以从今天開始.我打算实际做点小程序.在开发中不断地学习吧. 恰好近期Android上有个游戏2048比較火,所以就那这个练手吧. 由于对Android还没有太深入的了解,所以我写的东西都会比較基础,所以须要看一些高阶开发的朋友能够绕过了,也希望能够有高手们给我一些指导和建议,

从零開始开发Android版2048 (四) 分数、重置、结束

这一篇的内容主要是在上一篇的基础上,增加分数计算(包含当前分数和最高分数).游戏结束的推断以及游戏界面的重置这三个部分的功能. 一.分数的计算和保存 首先,2048这个游戏的分数包含,两个部分当前游戏分数和最高分,当前的游戏分数我们能够保存在程序的变量中,由于它仅仅对当前这盘游戏实用,游戏结束就能够清空:而最高分则须要以一种方式保存在手机中,这样当我们下次再打开游戏时,还能读取到之前操作的最高分. 1.当前分数 当前分数的计算还是非常easy.我们仅仅须要在每次发生合并的时候,将产生的分数加到我

从零开始开发Android版2048 (四) 分数、重置、结束

这一篇的内容主要是在上一篇的基础上,加入分数计算(包括当前分数和最高分数).游戏结束的判断以及游戏界面的重置这三个部分的功能. 一.分数的计算和保存 首先,2048这个游戏的分数包括,两个部分当前游戏分数和最高分,当前的游戏分数我们可以保存在程序的变量中,因为它只对当前这盘游戏有用,游戏结束就可以清空:而最高分则需要以一种方式保存在手机中,这样当我们下次再打开游戏时,还能读取到之前操作的最高分. 1.当前分数 当前分数的计算还是很简单.我们只需要在每次发生合并的时候,将产生的分数加到我们声明的分

影梭Android版使用教程

影梭Android版使用教程 2015年5月13日  admin  影梭使用教程 下载影梭Android版客户端 安卓客户端下载:下载地址 安装并打开影梭 按下图说明设置服务器.远程端口.密码和加密方式,填写完成后,右上角点击开启 服务器购买连接 影梭 影梭安卓教程 影梭教程

android开发2048时候屏幕过度敏感

============问题描述============ android开发2048时候屏幕过度敏感,在屏幕滑动的时候手势敏感,轻轻滑动一次就会移动好几次触发,在里面加入 thread.wait(1000)也没有用,只是时间延长了 ============解决方案1============ 常见的处理有 1. ACTION_DOWN 的时候记录按下的坐标,并标记正在"处理中". 2. ACTION_MOVE 的时候,如果正在"处理中",则与之前按下的坐标比较,看移动

Android版九连环NineRings

喜欢九连环以及想玩九连环的小伙伴们,送福利了,Android版本的九连环小游戏NineRings上线了!!!快来尝鲜吧,如果觉得好玩,请帮忙转发.游戏演示及下载地址 http://onestraw.net/ninerings 91助手下载: http://url.cn/W4R4Eo 百度助手下载: http://url.cn/PhqcRq 安卓市场下载: http://url.cn/JgDfoN Android版九连环NineRings,布布扣,bubuko.com