游戏主界面类名称:MainActivity.java,负责显示游戏主操作界面,提供调用其他类的接口。
其中issave变量用于控制是否显示继续游戏按钮,当第一次运行游戏时,不显示该按钮,所以设置一个boolean量issave用于控制主界面显示的Button,当暂停游戏或者退出游戏时,设置issave变量为true,当完成游戏后设置为false。
在onResume()中判断issave的值通过对数据库的访问判断issave的值,去设置是否显示继续游戏的按钮是否为可见。
其中定义一个广播接受者用来接收是否已完成数独。完成的话从当前表中删除。同时设置butt_backgame不可见。
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("cn.abel.action.over");
this.registerReceiver(new MyBroadcastReciver(), intentFilter);
//创建一广播类并继承BroadcastReceiver
private class MyBroadcastReciver extends BroadcastReceiver { @Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if(action.equals("cn.abel.action.over")) {
String author = intent.getStringExtra("author");
issave=false;//设置标记量为假
System.out.println("mianzhong jieshoh");
Button butt_backgame=(Button) findViewById(R.id.butt_backgame);
butt_backgame.setVisibility(View.INVISIBLE);
}
}
}
(1)游戏难度选择
游戏关卡选择模块主要包括游戏难度等级选择。游戏难度等级选择如图4.5所示。
游戏难度选择通过实例化一个AlertDialog来实现,传入定义好的难度数组XML,监听选择的项,将索引值传递给游戏开始类GameActivity.java。
protected Dialog onCreateDialog(int id) {
Dialog dialog = null;
switch (id) {
case LISTDIALOG:
Builder builder = new AlertDialog.Builder(this);
builder.setTitle("难度选择");
DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int which) {
if (which == 4) {
Intent intent = new Intent();
intent.setClass(MainActivity.this, MyGameActivity.class);
startActivity(intent);
} else {
String Str_nandu = getResources().getStringArray(R.array.hobby)[which];
Intent intent = new Intent();
intent.putExtra("nandu", String.valueOf(which));
intent.setClass(MainActivity.this, GameActivity.class);
startActivity(intent);
}
}
};
builder.setItems(R.array.hobby, listener);
dialog = builder.create();
break;
}
return dialog;
}
点击继续游戏按钮,进入继续游戏模块。
(1)定义一个广播接收,接收是否完成游戏。从数据库获取当前游戏时间,并开启线程计时。
DataBaseHelper dbHelper = new DataBaseHelper(BackgameActivity.this, "save_table", null,1);
SQLiteDatabase db = dbHelper.getWritableDatabase();
Cursor cursor = db.query("save_table", new String[] { "id","sshudu", "mshudu","time"},null,null, null, null, null);
while (cursor.moveToNext()) {
t = cursor.getString(cursor.getColumnIndex("time"));
}
int a[]=Timer.getTime(t);
h=a[0];
m=a[1];
s=a[2];
handler.post(HandlerThread);
Runnable HandlerThread = new Runnable() {
public void run() {
if (s < 60)
{
s += 1;
} else if (m < 60) {
m += 1;
s = 1;
} else {
h += 1;
m = 1;
s = 1;
}
handler.postDelayed(HandlerThread, 1000);
}
};
(2)在onPause()中停止计时,以及判断是否完成游戏,完成则发送广播到MainActivity,否则保存数据到数据库。
protected void onPause() {
// TODO Auto-generated method stub
handler.removeCallbacks(HandlerThread);
if(!is_over){
save();
}else{
Intent overintent = new Intent();
overintent.setAction("cn.abel.action.over");
//要发送的内容
overintent.putExtra("author", "true");
//发送 一个无序广播
BackgameActivity.this.sendBroadcast(overintent);
}
super.onPause();
}
保存游戏执行save()方法:得到一个可写的数据save_table用来存储当前进行的游戏进度及所用时间。插入时先把之前的数据删除并存入当前数据,关闭数据库。
public void save(){
String save_shudu=BackView.tiles;
String msave_shudu=BackView.newtiles;
DataBaseHelper dbHelper = new DataBaseHelper(BackgameActivity.this, "save_table", null,1);
// 得到一个可写的数据库
SQLiteDatabase db = dbHelper.getWritableDatabase();
String whereClauses = "id=?";
String[] whereArgs = { String.valueOf(0) };
// 调用delete方法,删除数据
db.delete("save_table", whereClauses, whereArgs);
System.out.println("删除ID为0");
// 生成ContentValues对象 //key:列名,value:想插入的值
ContentValues cv = new ContentValues();
// 往ContentValues对象存放数据,键-值对模式
cv.put("id", 0);
cv.put("sshudu", save_shudu);
cv.put("mshudu", msave_shudu);
// 调用insert方法,将数据插入数据库
db.insert("save_table", null, cv);
// 关闭数据库
db.close();
}