从零开始开发Android版2048 (四) 分数、重置、结束
时间:2014-04-30 22:12:40
收藏:0
阅读:425
这一篇的内容主要是在上一篇的基础上,加入分数计算(包括当前分数和最高分数)、游戏结束的判断以及游戏界面的重置这三个部分的功能。
一、分数的计算和保存
首先,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中所有的空格上都有数字,而且没有可以合并的数字时,我们就会判定游戏结束。我这里的逻辑处理是,如果在没有空白格的情况下,遍历所有的数字格,如果在这个格子的上下左右(实际判断是只判断右和下即可)都没有相同的数字格的时候,就算作了结束。
/**
* 通过格子对应的横纵坐标来获取其对应的数字
* @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() {
@Override
public void onClick(DialogInterface dialog, int which) {
MainActivity.this.finish();
}
}).show();
} 到现在这个游戏的主体内容就基本都完成,这个程序算是我学习Android以来写的第一个小程序,虽然还有很多不完善的地方,但是在开发的过程中还是学到了很多东西。果然看书看再多,还是不如自己写上几段代码学习得更快。希望和我一样,从头开始学习Android的朋友们,大家一起努力吧。
之后我还会利用闲暇的时间来不断完善和优化这个小游戏。怎么也算是第一个Android的程序,不能这么马马虎虎就结束掉。
最后附上本篇的源码,欢迎大家指正:http://download.csdn.net/detail/johnsonwce/7276123
评论(0)