標籤:
根據教程寫的簡單的2048遊戲。
極客學院教程地址:http://www.jikexueyuan.com/course/43.html
我的原始碼地址:https://github.com/myCodingTrip/2048Game
項目有3個類。
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 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 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
Android 2048遊戲開發