虽然说2048是好久前比较火的小游戏,但直到最近才有机会去研究下2048实现的源码,这里就简单写一下我(bie)的(ren)思路:
首先2048需要有十六个卡片,这个卡片可以用FrameLayout的子类来实现(继承),里面可以用TextView来实现设置背景颜色,显示的数字等。这样我们就可以简单实现这个卡片啦:
1 public class Card extends FrameLayout { 2 3 private int num = 0; 4 private TextView label; 5 6 public Card(Context context) { 7 super(context); 8 9 label = new TextView(getContext()); 10 label.setTextSize(32); 11 label.setGravity(Gravity.CENTER); 12 label.setBackgroundColor(0x33ffffff); 13 LayoutParams lp = new LayoutParams(-1, -1); 14 lp.setMargins(10, 10, 0, 0); 15 addView(label, lp); 16 setNum(0); 17 }
**********************************************
其次,我们需要添加十六个卡片到屏幕上,应该怎样实现这个屏幕呢?我们可以用GridLayout的子类(继承)实现,并用一个二维数组来存储下每个卡片的状态:
1 public class GameView extends GridLayout { 2 3 4 private Card cardsMap[][] = new Card[4][4]; 5 private List<Point> emptyPoint = new ArrayList();//记录空的位置 6 7 *********************************************** 8 9 private void addCards(int cardWidth, int cardHeight) {//添加卡片 10 Card cd; 11 for (int x = 0; x < 4; x++) { 12 for (int y = 0; y < 4; y++) { 13 cd = new Card(getContext()); 14 cd.setNum(0); 15 addView(cd, cardWidth, cardHeight); 16 cardsMap[x][y] = cd; 17 } 18 } 19 20 }
******************************************
然后我们就需要去判断用户的手势。通过设置一个setOnTouchListener(new OnTouchListener())去监听用户的操作,当用户按下屏幕时,记录下此时的坐标,当用户手指离开屏幕时,计算坐标的偏移量,根据坐标偏移量的相对差来判断用户的意图是向上,向下,还是向左,向右:
public boolean onTouch(View arg0, MotionEvent arg1) { switch (arg1.getAction()) { case MotionEvent.ACTION_DOWN: startX = arg1.getX(); startY = arg1.getY(); break; case MotionEvent.ACTION_UP: offsetX = arg1.getX() - startX; offsetY = arg1.getY() - startY; if (Math.abs(offsetX) > Math.abs(offsetY)) { if (offsetX < -3) { slideLeft(); } else if (offsetX > 2) { slideRight(); } } else { if (offsetY < -3) { slideUp(); } else if (offsetY > 3) { slideDown(); } } break; } return true; }
**************************************
判断出用户的意图后,我们就应该去处理相应的事件啦,这里只贴上向左滑动的处理代码,其他三个方向的处理相类似:
1 boolean flag = false; 2 3 for (int y = 0; y < 4; y++) { 4 for (int x = 0; x < 4; x++) { 5 for (int x1 = x + 1; x1 < 4; x1++) { 6 if (cardsMap[x1][y].getNum() > 0) { 7 if (cardsMap[x][y].getNum() <= 0) { 8 cardsMap[x][y].setNum(cardsMap[x1][y].getNum()); 9 cardsMap[x1][y].setNum(0); 10 x--; 11 flag = true; 12 13 } else if (cardsMap[x][y].equals(cardsMap[x1][y])) { 14 cardsMap[x][y].setNum(cardsMap[x][y].getNum() * 2); 15 cardsMap[x1][y].setNum(0); 16 MainActivity.getMainActivity().addMyScore( 17 cardsMap[x][y].getNum()); 18 flag = true; 19 } 20 break; 21 } 22 } 23 } 24 } 25 if (flag) { 26 addRandom();//随机地添加一个卡片(实际上设置相应位置上卡片的数字) 27 checkComplete();//判断游戏是否结束
**************************************************
以上就是android版的2048实现的基本逻辑,可能有些不详细。如果需要详细的源码,可以联系我哈。