zoukankan      html  css  js  c++  java
  • android 模拟2048

    利用节日休息时间在ANDROID上进行学习并模拟2048游戏。

    效果如下图:

    制作思路:

    1、画出2048游戏主界面,根据手机屏幕宽高度进行计算并画出每个方块的大小。

     1 @Override
     2     protected void onSizeChanged(int w, int h, int oldw, int oldh) {
     3         super.onSizeChanged(w, h, oldw, oldh);
     4         int cW = (Math.min(w, h) - 10) / 4;
     5 
     6         addCards(cW, cW);
     7 
     8         startGame();
     9     }
    10 
    11     private void startGame() {
    12         MainActivity aty = MainActivity.getMainActivity();
    13         aty.clearScore();
    14 
    15         for (int y = 0; y < 4; y++) {
    16             for (int x = 0; x < 4; x++) {
    17                 cardsMap[x][y].setNum(0);
    18             }
    19         }
    20         addRandomNum();
    21         addRandomNum();
    22     }

    2、建立一个二维数组用于存储卡面上的值

    3、建立一个list<point>用于存储每个卡片的位置

        private Card[][] cardsMap = new Card[4][4];
        private List<Point> emptyPoints = new ArrayList<Point>();
    
        private void addCards(int cardWidth, int cardHeight) {
            Card c;
            LinearLayout line;
            LinearLayout.LayoutParams lineLp;
    
            for (int y = 0; y < 4; y++) {
                line = new LinearLayout(getContext());
                lineLp = new LayoutParams(-1, cardHeight);
                addView(line, lineLp);
    
                for (int x = 0; x < 4; x++) {
                    c = new Card(getContext());
                    line.addView(c, cardWidth, cardHeight);
    
                    cardsMap[x][y] = c;
                }
    
            }
        }
    

      

    4、游戏开始时进行,添加随机卡片数据。

    private void addRandomNum() {
            emptyPoints.clear();
            for (int y = 0; y < 4; y++) {
                for (int x = 0; x < 4; x++) {
                    if (cardsMap[x][y].getNum() <= 0) {
                        emptyPoints.add(new Point(x, y));
                    }
                }
            }
            if (emptyPoints.size() > 0) {
                Point p = emptyPoints.remove((int) (Math.random() * emptyPoints.size()));
                cardsMap[p.x][p.y].setNum(Math.random() > 0.1 ? 2 : 4);
            }
        }

    5、利用android touch事件进行记录手指在屏幕滑动方向。

    private void initGameView() {
            setOrientation(LinearLayout.VERTICAL);
            setBackgroundColor(0xffbbada0);
    
            setOnTouchListener(new OnTouchListener() {
                private float startX
                        ,
                        startY
                        ,
                        offsetX
                        ,
                        offsetY;
    
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    switch (event.getAction()) {
                        case MotionEvent.ACTION_DOWN: //当屏幕点击时进行记录点击的X和Y值
                            startX = event.getX();
                            startY = event.getY();
                            break;
                        case MotionEvent.ACTION_UP:
                            offsetX = event.getX() - startX;//进行计算点击偏移值
                            offsetY = event.getY() - startY;
    
                            if (Math.abs(offsetX) > Math.abs(offsetY)) {
                                if (offsetX < -5) {
                                    //left
                                    swipeLeft();
                                } else if (offsetX > 5) {
                                    //right
                                    swipeRight();
                                }
                            } else {
                                if (offsetY < -5) {
                                    //up
                                    swipeUp();
                                } else if (offsetY > 5) {
                                    //down
                                    swipeDown();
                                }
                            }
                            break;
                    }
                    return true;
                }
            });
        }
    

      

    6、根据滑动的方向进行循环每个方向的卡片 进行卡片的位置移动及相同的卡片相加

        private void swipeLeft() {
            boolean merge = 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--;
                                merge = 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().addScore(cardsMap[x][y].getNum());
                                merge = true;
                            }
    
                            break;
                        }
    
                    }
                }
    
                if (merge) {
                    addRandomNum();
                    checkComplete();
                }
            }
        }
    

      

  • 相关阅读:
    Vue2.5
    Vue --- :is
    Vue面试中经常会被问到的面试题
    100道JS构造函数面试题
    100道前端面试题
    占位
    06-验证码-基本功能实现
    由ES规范学JavaScript(二):深入理解“连等赋值”问题
    JS中keyup, keypress, keydown以及oninput四个事件的区别
    Java中class的声明
  • 原文地址:https://www.cnblogs.com/tom-zhu/p/4199688.html
Copyright © 2011-2022 走看看