根據教程寫的簡單的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