• Android版2048


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

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

     1 public class Card extends FrameLayout {
     2 
     3     private int num = 0;
     4     private TextView label;
     5 
     6     public Card(Context context) {
     7         super(context);
     8 
     9         label = new TextView(getContext());
    10         label.setTextSize(32);
    11         label.setGravity(Gravity.CENTER);
    12         label.setBackgroundColor(0x33ffffff);
    13         LayoutParams lp = new LayoutParams(-1, -1);
    14         lp.setMargins(10, 10, 0, 0);
    15         addView(label, lp);
    16         setNum(0);
    17     }

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

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

     1 public class GameView extends GridLayout {
     2 
     3 
     4     private Card cardsMap[][] = new Card[4][4];
     5     private List<Point> emptyPoint = new ArrayList();//记录空的位置
     6 
     7 ***********************************************
     8 
     9 private void addCards(int cardWidth, int cardHeight) {//添加卡片
    10         Card cd;
    11         for (int x = 0; x < 4; x++) {
    12             for (int y = 0; y < 4; y++) {
    13                 cd = new Card(getContext());
    14                 cd.setNum(0);
    15                 addView(cd, cardWidth, cardHeight);
    16                 cardsMap[x][y] = cd;
    17             }
    18         }
    19 
    20     }

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

    然后我们就需要去判断用户的手势。通过设置一个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;
    
    }

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

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

     1 boolean flag = false;
     2 
     3         for (int y = 0; y < 4; y++) {
     4             for (int x = 0; x < 4; x++) {
     5                 for (int x1 = x + 1; x1 < 4; x1++) {
     6                     if (cardsMap[x1][y].getNum() > 0) {
     7                         if (cardsMap[x][y].getNum() <= 0) {
     8                             cardsMap[x][y].setNum(cardsMap[x1][y].getNum());
     9                             cardsMap[x1][y].setNum(0);
    10                             x--;
    11                             flag = true;
    12 
    13                         } else if (cardsMap[x][y].equals(cardsMap[x1][y])) {
    14                             cardsMap[x][y].setNum(cardsMap[x][y].getNum() * 2);
    15                             cardsMap[x1][y].setNum(0);
    16                             MainActivity.getMainActivity().addMyScore(
    17                                     cardsMap[x][y].getNum());
    18                             flag = true;
    19                         }
    20                         break;
    21                     }
    22                 }
    23             }
    24         }
    25         if (flag) {
    26             addRandom();//随机地添加一个卡片(实际上设置相应位置上卡片的数字)
    27             checkComplete();//判断游戏是否结束

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

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

  • 相关阅读:
    狄利克雷卷积
    洛谷P2044 [NOI2012]随机数生成器
    Miller Rabin算法详解
    BZOJ3667: Rabin-Miller算法
    洛谷P3383 【模板】线性筛素数(Miller_Rabin)
    洛谷P3806 【模板】点分治1
    BZOJ1468: Tree
    Android Camera调用过程分析
    安卓开发37:自定义的HorizontalScrollView类,使其pageScroll的时候焦点不选中
    Android抖动动画
  • 原文地址:https://www.cnblogs.com/WoodJim/p/3909193.html
Copyright © 2020-2023  润新知