根据教程写的简单的2048游戏。
极客学院教程地址:http://www.jikexueyuan.com/course/43.html
我的源代码地址:https://github.com/myCodingTrip/2048Game
项目有3个类,分别是Card、GameView和MainActivity。
Card类代码概要:
Card extends FrameLayout{ private int num; private TextView label; public Card(Context context) public int getNum() public void setNum(int num) public boolean equals(Card o) }
自定义概念:
1 num不为0的Card称为卡片,在游戏中显示num(2^n)。
2 num为0的Card称为空卡片,0是不显示的。
3 存放Card的容器成为格子。
界面+交互 GameView代码概要
GameView extends GridLayout{ private Card[][] cardsMap = new Card[4][4]; private List<Point> emptyPoints = new ArrayList<Point>(); public GameView(Context context, AttributeSet attrs, int defStyleAttr) public GameView(Context context) public GameView(Context context, AttributeSet attrs) private void initGameView() @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) private void addCards(int cardWidth, int cardHeight) private void startGame() private void addRandomNum() private void swipeLeft() private void swipeRight() private void swipeUp() private void swipeDown() private void checkComplete() }
public GameView(Context context, AttributeSet attrs, int defStyleAttr)
public GameView(Context context)
public GameView(Context context, AttributeSet attrs)
构造方法,调用initGameView()方法。
private void initGameView()
用于初始化游戏,通过调用setOnTouchListener并重写其中的public boolean onTouch(View v, MotionEvent event)方法调用swipeLeft()、swipeRight()、swipeUp()、swipeDown()四个方法来定义程序与用户的交互。
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh)
该方法先计算出每个小格子的边长cardWidth,然后调用addCards(cardWidth, cardWidth)、 startGame();
private void addCards(int cardWidth, int cardHeight)
通过循环调用addView(c, cardWidth, cardHeight)来添加16张空卡片
private void startGame()
用于(重新)开始游戏,首先调用MainActivity.getMainactivity().clearScore()清零分数,然后将16个Card的数字设置为0,即添加16张空卡片,然后调用2次addRandomNum()方法。
swipeLeft()、swipeRight()、swipeUp()、swipeDown()
这四个方法是游戏的主要逻辑部分,包含卡片的移动和合并的逻辑,例如向左划调用的swipeLeft()方法原理是从左向右(上下顺序随意)搜索判断是否可以移动(左边一张空卡片右边一张卡片)或者合并(存在两张num相等的卡片),通过改变16张Card的num来达到视觉上移动、合并卡片的效果,如果发生了卡片的移动或合并,则调用addRandomNum()、checkComplete()这两个方法。
private void checkComplete()
用于检查游戏是否结束,条件是16个Card的num都不为0并且无卡片合并的可能,如果结束则弹出一个系统级别的对话框,可调用startGame()重新开始游戏。
private void addRandomNum()
首先统计出所有格子中的空卡片,然后随机找出一个空卡片修改其数值(90%为2,10%为4),使其变成卡片。
MainActivity代码概要:
MainActivity extends Activity{ private int score = 0; private TextView tvScore; private static MainActivity mainactivity = null; public static MainActivity getMainactivity() @Override protected void onCreate(Bundle savedInstanceState) @Override public boolean onCreateOptionsMenu(Menu menu) public void clearScore() public void showScore() public void addScore(int s) }
public static MainActivity getMainactivity()
使得GameView可以修改MainActivity上的score