Android學習 遊戲開發之打地鼠(四,遊戲結束和數據存儲)

遊戲結束彈出保存玩家姓名和分數的窗口,玩家輸入姓名後點擊確定保存到數據庫中。玩家可以通過主界面的排行榜可以查看到分數從高到低排行的榜單。


建立一個玩家類用來處理玩家的信息,該類實現類序列化接口,實例可以被序列化便於數據的傳遞。代碼如下:

package cn.com.cyj.mouse.enity;

import java.io.Serializable;
/**
 * 玩家信息類,可以被序列化
 * @author cyj
 *
 */
public class Gamer implements Serializable{
	// 玩家姓名
	private String name;
	// 玩家分數
	private int score;
	
	public Gamer(String name, int score) {
		this.name = name;
		this.score = score;
	}
	public String getName() {
		return name;
	}
	public int getScore() {
		return score;
	}
	@Override
	public String toString() {
		return "Gamer [name=" + name + ", score=" + score + "]";
	}
}
遊戲窗口是一個Activity,將主題樣式設置成Dialog即在清單文件中GameOver設置屬性android:theme="@android:style/Theme.Dialog"。代碼如下:

package cn.com.cyj.mouse.services;

import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import cn.com.cyj.mouse.R;
import cn.com.cyj.mouse.enity.Gamer;
import cn.com.cyj.mouse.ui.BaseActivity;
import cn.com.cyj.mouse.ui.MouseStart;
/**
 * 遊戲結束窗口
 * @author cyj
 *
 */
public class GameOver extends BaseActivity {
	// 確定按鈕
	Button confirm;
	// 取消按鈕
	Button cancel;
	// 姓名輸入框
	EditText name;
	// 顯示分數
	TextView finalScore;
	Intent intent;
	// 玩家的分數
	int nowScore;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_gameover);
		
		init();
		intent = getIntent();
		nowScore = Integer.parseInt(intent.getStringExtra("score"));
		// 顯示分數
		finalScore.setText(nowScore+"");
		// 設置點擊其他位置不關閉窗口 ,最低版本API11
		this.setFinishOnTouchOutside(false);  
	}
	/**
	 * 初始化組件
	 */
	private void init() {
		confirm = (Button) findViewById(R.id.confirm);
		cancel = (Button) findViewById(R.id.cancel);
		name = (EditText) findViewById(R.id.name);
		finalScore =  (TextView) findViewById(R.id.finalscore);
		/**
		 * 給按鈕設置點擊事件
		 */
		confirm.setOnClickListener(new MyOnClick());
		cancel.setOnClickListener(new MyOnClick());
	}
	class MyOnClick implements OnClickListener{
		@Override
		public void onClick(View v) {
			int id = v.getId();
			switch (id) {
			case R.id.confirm:
				// 判斷輸入內容是否爲空
				if(!TextUtils.isEmpty(name.getText().toString())){
					Gamer gamer = new Gamer(name.getText().toString(), nowScore);
					// 添加數據到數據庫
					MouseStart.controller.insert(gamer);
					// 關閉窗口
					finish();
				}else{
					Toast.makeText(GameOver.this, "姓名不能爲空", Toast.LENGTH_SHORT).show();
				}
				break;
			case R.id.cancel:
				finish();
				break;
			default:
				break;
			}
			
		}
	}
}

數據庫中存儲玩家的姓名和分數,建立MouseSqlite類通過繼承SQLiteOpenHelper來建立數據庫和處理數據庫升級等操作。

package cn.com.cyj.mouse.database;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
 * 玩家信息數據庫的api
 * @author cyj
 *
 */
public class MouseSqlite extends SQLiteOpenHelper {

	public MouseSqlite(Context context) {
		super(context, "gamer.db", null, 1);
		
	}
	/**
	 * 創建gamer.db表
	 */
	@Override
	public void onCreate(SQLiteDatabase db) {
		db.execSQL("create table gamer (id integer primary key autoincrement, name varchar(20), score integer);");
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
	}
}
本遊戲對數據庫的操作主要有添加一條玩家信息和查詢所有玩家信息,查詢的時候按照分數從高到低排列。對數據庫操作一定要關閉數據庫。代碼如下:

package cn.com.cyj.mouse.database;

import java.util.ArrayList;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import cn.com.cyj.mouse.enity.Gamer;
/**
 * 對gamer表進行操作,數據庫使用完畢必須關閉
 * @author cyj
 *
 */
public class GamerDatabase {
	
	MouseSqlite mouseSqlite;
	SQLiteDatabase db;
	// 所有玩家信息
	ArrayList<Gamer> gamerList;
	public GamerDatabase(Context context) {
		mouseSqlite = new MouseSqlite(context);
	}
	/**
	 *  插入一條數據
	 * @param gamer 玩家信息
	 * @return
	 */
	public Boolean insertGamer(Gamer gamer){
		// 獲得可寫數據庫
		db = mouseSqlite.getWritableDatabase();
		// 用於保存玩家信息到數據庫
		ContentValues values = new ContentValues();
		String name = gamer.getName();
		int score = gamer.getScore();
		values.put("name", name);
		values.put("score", score);
		// 插入數據到數據庫
		long res = db.insert("gamer", null, values);
		// 關閉數據庫
		db.close();
		if(res != -1)
			return true;
		return false;
	}
	/**
	 * 查詢所有數據
	 * @return 所有玩家信息
	 */
	public ArrayList<Gamer> queryGamerAll(){
		// 獲得可讀數據庫
		db = mouseSqlite.getReadableDatabase();
		gamerList = new ArrayList<Gamer>();
		// 查詢所有玩家信息,按分數從高到低排序
		Cursor cursor = db.query("gamer", null, null, null, null, null, "score desc");
		while(cursor.moveToNext()){
			// 獲得當前遊標所指向數據的姓名
			String name = cursor.getString(cursor.getColumnIndex("name"));
			// 獲得當前遊標所指向數據的分數
			int score = cursor.getInt(cursor.getColumnIndex("score"));
			Gamer gamer = new Gamer(name, score);
			// 添加到集合裏
			gamerList.add(gamer);
		}
		// 關閉數據庫
		db.close();
		return gamerList;
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章