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

256

被折叠的 条评论
为什么被折叠?



