標籤:android 2048 分數 重設 結束
這一篇的內容主要是在上一篇的基礎上,加入分數計算(包括當前分數和最高分數)、遊戲結束的判斷以及遊戲介面的重設這三個部分的功能。
一、分數的計算和儲存 首先,2048這個遊戲的分數包括,兩個部分當前遊戲分數和最高分,當前的遊戲分數我們可以儲存在程式的變數中,因為它只對當前這盤遊戲有用,遊戲結束就可以清空;而最高分則需要以一種方式儲存在手機中,這樣當我們下次再開啟遊戲時,還能讀取到之前操作的最高分。 1、當前分數 當前分數的計算還是很簡單。我們只需要在每次發生合并的時候,將產生的分數加到我們聲明的分數的變數中,然後更新一下用於顯示當前分數的控制項即可。 我參考了一下目前大多數2048遊戲的積分規則是,合并後格子的分數是多少,就增加多少分。比如2和2合并成4,那麼就加4分。 2、最高分 最高分需要儲存在手機中,這樣即使我們把遊戲的程式關掉,最高分的資料也不會丟失。就我目前知道的Android儲存資料的方式有這麼幾種:1、儲存在Android內建的sqlite這個資料庫中 2、通過java以檔案的形式儲存在手機儲存中 3、使用Android提供的SharePreferences類來儲存 等等(當然實際可用的方法肯定不止這麼多,這隻是我目前瞭解到的) 比較了幾種方式,我在這個2048程式中,選用了相對比較簡單的SharePreferences類來儲存最高分。SharePreferences是Android提供的一個輕量級的用於資料儲存的類,它儲存的方式是以XML的格式儲存在\data\data\<package name>\shared_prefs\目錄下面。我查了一下,大多數使用這個類的情景是用於儲存一些比如設定資訊之類的,不太適合儲存太複雜,或者太多的資料。但是對於我們來說,正好用來儲存最高分。 參考了網上的一些寫法,最高分的類是這麼寫的:
package com.example.t2048;import android.content.Context;import android.content.SharedPreferences;import android.content.SharedPreferences.Editor;/** * 該類用於儲存和讀取最高分 * @author Mr.Wang * */public class TopScore {private SharedPreferences sp;public TopScore(Context context){//讀取perference檔案,如果沒有,則會建立一個名為TopScore的檔案sp = context.getSharedPreferences("TopScore", context.MODE_PRIVATE);}/** * 用於讀取最高分 * @return 最高分 */public int getTopScode(){//對去鍵“TopScore”對應的值int topScore = sp.getInt("TopScore", 0);return topScore;}/** * 用於寫入最高分 * @param topScore 新的最高分 */public void setTopScode(int topScore){//使用Editor類寫入perference檔案Editor editor = sp.edit();editor.putInt("TopScore", topScore);editor.commit();}}
當我們執行個體化並調用了其中的讀取方法之後,會在手機目錄中產生一個XML檔案,下面是我在手機上截的圖:
然後,我在Activity中寫了一個用於更新分數的方法,在合并的方法裡,調用這個方法就可以了。
/** * 該方法用於更新分數 * @param add 新增的分數 */public void updateScore(int add){score += add;scoreText.setText(score+"");if(score>topScore.getTopScode())topScore.setTopScode(score);topScoreText.setText(topScore.getTopScode()+"");}
二、遊戲的重設 遊戲的重設很簡單,因為我在之前,把填充空白格,隨機生產兩個數字格等初始化的操作都放在了init()方法裡了,所以如果遊戲需要重新開始,那我們只需要將gridLayout中的view清空,並將一些全域變數再重設為初始的數值,然後調用init()方法就可以了。
/** * 清空介面,重新初始化 */public void reset(){spaceList.clear();numberList.clear();score = 0;gridLayout.removeAllViews();init();}
三、遊戲結束的判斷 當一次滑動後,gridLayout中所有的空格上都有數字,而且沒有可以合并的數字時,我們就會判定遊戲結束。我這裡的邏輯處理是,如果在沒有空白格的情況下,遍曆所有的數字格,如果在這個格子的上下左右(實際判斷是只判斷右和下即可)都沒有相同的數字格的時候,就算作了結束。
為了實現這個判斷,我在NumberList這個類中加入了兩個方法:
/** * 通過格子對應的橫縱座標來擷取其對應的數字 * @param x 橫座標 * @param y 縱座標 * @return 格子對應數位指數 */public int getNumberByXY(int x,int y){if(x<0 || x>3 || y<0 || y>3)return -1;else {int order = stuffList.indexOf(4*x+y);return numberList.get(order) ;}}/** * 判斷是否還有可以合并的數字格 * @return 有這返回true */public boolean hasChance(){for(int x = 0;x<=3;x++){for(int y=0;y<=3;y++){if(y<3){if(getNumberByXY(x,y)==getNumberByXY(x, y+1))return true;}if(x<3){if(getNumberByXY(x,y)==getNumberByXY(x+1, y))return true;}}}return false;}
然後在確定遊戲結束之時,彈出對話方塊,供使用者選擇結束還是重新開始:
public void over(){new AlertDialog.Builder(this).setTitle("哎!結束了").setMessage("遊戲結束,您的本局的分數是"+score+"分,繼續加油哦!").setPositiveButton("重新開始",new OnClickListener() {public void onClick(DialogInterface dialog, int which) {reset();}}).setNegativeButton("結束遊戲", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {MainActivity.this.finish();}}).show();}
到現在這個遊戲的主體內容就基本都完成,這個程式算是我學習Android以來寫的第一個小程式,雖然還有很多不完善的地方,但是在開發的過程中還是學到了很多東西。果然看書看再多,還是不如自己寫上幾段代碼學習得更快。希望和我一樣,從頭開始學習Android的朋友們,大家一起努力吧。 之後我還會利用閑暇的時間來不斷完善和最佳化這個小遊戲。怎麼也算是第一個Android的程式,不能這麼馬馬虎虎就結束掉。
最後附上本篇的源碼,歡迎大家指正:http://download.csdn.net/detail/johnsonwce/7276123
從零開始開發Android版2048 (四) 分數、重設、結束