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>用于存储每个卡片的位置

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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事件进行记录手指在屏幕滑动方向。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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、根据滑动的方向进行循环每个方向的卡片 进行卡片的位置移动及相同的卡片相加

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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();
        }
    }
}
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值