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

效果如下图:

android 模拟2048-LMLPHP

android 模拟2048-LMLPHP

制作思路:

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

 @Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
int cW = (Math.min(w, h) - 10) / 4; addCards(cW, cW); startGame();
} private void startGame() {
MainActivity aty = MainActivity.getMainActivity();
aty.clearScore(); for (int y = 0; y < 4; y++) {
for (int x = 0; x < 4; x++) {
cardsMap[x][y].setNum(0);
}
}
addRandomNum();
addRandomNum();
}

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

  

05-02 03:05