利用節日休息時間在ANDROID上進行學習並模擬2048遊戲。java
效果以下圖:android
製做思路:數組
一、畫出2048遊戲主界面,根據手機屏幕寬高度進行計算並畫出每一個方塊的大小。dom
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 }
二、創建一個二維數組用於存儲卡面上的值ide
三、創建一個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; } } }
四、遊戲開始時進行,添加隨機卡片數據。spa
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); } }
五、利用android touch事件進行記錄手指在屏幕滑動方向。code
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; } }); }
六、根據滑動的方向進行循環每一個方向的卡片 進行卡片的位置移動及相同的卡片相加blog
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(); } } }