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();
            }
        }
    }

  

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。