首页 > 代码库 > Android版2048

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实现的基本逻辑,可能有些不详细。如果需要详细的源码,可以联系我哈。