Android 配對記憶遊戲 解說

完整範例 在此

範例0:畫面佈局(Layout)

範例程式檔案下載 MemGame0 下載後解壓縮

圖形

程式圖示: AndroidManifest.xml 中 application 的 android:icon="@drawable/icon" 為程式的圖示

程式所需要的圖示:將所需要的圖示,複製到 res/drawable 目錄下 (不同解析度)

畫面佈局(Layout) res/layout/main.xml

包含有 TextView(未來更改為Chronometer) 與 TableLayout

自行建立步驟

  1. 將程式圖形與所需要的圖形複製到 res/drawable 目錄下
  2. 將 res/layout/main.xml 布置widget: TextView(未來更改為Chronometer) 與 TableLayout
  3. 在 TableLayout內設定4個TableRow, 每個TableRow內再放4個ImageButton、並選擇適當的圖形

範例1:使用程式建立畫面佈局(Layout)

範例程式檔案下載 MemGame1 下載後解壓縮

使用 Java 的 Collections(ArrayList, List) 與 Generics 來儲存陣列

程式邏輯

載入 Resources 內的圖形檔 (Drawable);使用 getResources().getDrawable
取得xml的widget;使用 findViewById
佈局畫面
	移除目前所有的Views; 使用 removeAllViews
	產生 rowCount 列的 TableRow
		每個 TableRow 產生 columeCount 個 ImageButton
			每個 ImageButton 放置背景圖形 setBackgroundDrawable
			每個 ImageButton 設定唯一的編號 setId

範例2:洗牌與碼表計時

範例程式檔案下載 MemGame2 下載後解壓縮

加入洗牌動作,顯示所有的圖片來確認洗牌OK

使用 Chronometer 來計時

範例:現在時間(Digital Clock):使用 多執行緒

範例程式檔案下載 ClockInThread 下載後解壓縮

使用 Java Runnable 建立 Thread, 0.1秒喚醒一次

Android架構的UI Widget 無法直接在Thread中更改,Thread中需要送給Handler Message(sendMessage). 由Handler 來處理

Handler 中實作 handleMessage , 更新Widget 狀態

範例:現在時間(Digital Clock):使用 TimerTask

範例程式檔案下載 ClockTimerTask 下載後解壓縮

若要定時執行,用TimerTask代替 多執行緒 降低複雜度

使用 scheduleAtFixedRate 來設定執行Delay時間與頻率

範例3:洗牌與碼表計時

範例程式檔案下載 MemGame3 下載後解壓縮

加入Class來存放圖形的位置與參考(Reference)

實作 OnClickListener 來處理Button的Click

取得代號
算出位置
翻牌(顯示圖形),判斷是否配對並作適當處理

翻牌(顯示圖形)程式邏輯

顯示該位置的圖形
假如為第1張牌
	則將該張牌的位置與圖形存放於 firstCard
否則
	假如此張牌與第1張牌相同的位置,則return
	否則
		則將該張牌的位置與圖形存放於 secondCard
	設定 TimerTask 傳送 Message 給 Handler 處理
	暫停短暫時間 0.5秒

Handler 將牌再翻面

範例4:洗牌與碼表計時

範例程式檔案下載 MemGame4 下載後解壓縮

上述範例中Handler 除了將牌再翻面外,加入判斷兩張牌是否相同,並作適當處理

Toast 顯示短暫訊息後,自動關閉

假如兩張牌相同
	將兩張牌設定為 disable, 防止再度被Click
	使用 Toast顯示「配對成功!」短暫訊息
	配對成功數目加1
	假如全部配對完成
		建立 Dialog,來恭喜使用者
否則
	將兩張牌翻面為面朝下
	使用 Toast顯示「配對錯誤」短暫訊息

將 firstCard 與 secondCard 復原為為選取狀態

完整範例:加上Menu選單

完整範例程式請前往 Android 遊戲程式設計 選擇「配對記憶遊戲」下載

範例檔案直接下載點 配對記憶遊戲 下載後解壓縮

Menu 建立: onCreateOptionsMenu()

Menu 被Clcik: onOptionsItemSelected()

程式結束 this.finish()