android 模拟2048

本文介绍了一位开发者如何利用Android平台,在节日休息时间,通过学习和实践来开发并模拟经典游戏2048的过程。文章详细阐述了从游戏界面设计到触摸事件处理,再到游戏规则实现的全过程,包括游戏主界面的布局、二维数组的使用、随机数添加、游戏开始后的操作逻辑,以及利用触摸事件进行游戏控制。通过实际案例,展示了将理论知识应用于实践的有效方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

利用节日休息时间在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(intcardWidth, 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 (intx = 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(newOnTouchListener() {
            private floatstartX
                   ,
                   startY
                   ,
                   offsetX
                   ,
                   offsetY;
            @Override
            public booleanonTouch(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() {
    booleanmerge = false;
    for(int y = 0; y < 4; y++) {
        for(int x = 0; x < 4; x++) {
            for (intx1 = 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();
        }
    }
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值