从零开始开发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() {

				@Override
				public void onClick(DialogInterface dialog, int which) {
					MainActivity.this.finish();

				}
			}).show();
	}

到现在这个游戏的主体内容就基本都完成,这个程序算是我学习Android以来写的第一个小程序,虽然还有很多不完善的地方,但是在开发的过程中还是学到了很多东西。果然看书看再多,还是不如自己写上几段代码学习得更快。希望和我一样,从头开始学习Android的朋友们,大家一起努力吧。

之后我还会利用闲暇的时间来不断完善和优化这个小游戏。怎么也算是第一个Android的程序,不能这么马马虎虎就结束掉。

最后附上本篇的源码,欢迎大家指正:http://download.csdn.net/detail/johnsonwce/7276123

时间: 2024-08-03 22:04:36

从零开始开发Android版2048 (四) 分数、重置、结束的相关文章

从零开始开发Android版2048 (五) 撤销的实现

本篇的内容是,在前一篇的基础上加入了撤销的功能.撤销其实就是将当前的用户界面恢复到这次滑动值前的样子.我实现撤销的主要原理是,将每次滑动后界面上的格子和对应的数字记录下来,当然还有分数,把这些数据写入一个栈中,然后点击撤销操作的时候,将栈顶pop掉,读取下一个栈中的对象,并根据对象中存储的数据重新绘制界面. 下面是我用于存储每次界面情况的类,在这个类中保存了界面中主要的三个数据,空白格.数字格和当前的分数. package com.example.t2048; import java.util.

从零开始开发Android版2048 (三)逻辑判断

最近工作比较忙,所以更新的慢了一点,今天的主要内容是关于Android版2048的逻辑判断,经过本篇的讲解,基本上完成了这个游戏的主体部分. 首先还是看一下,我在实现2048时用到的一些存储的数据结构.我在实现时,为了省事存储游戏过程中的变量主要用到的是List. 比如说:List<Integer> spaceList = new ArrayList<Integer>();这个spaceList主要用于保存,所有空白格的位置,也就是空白格在GridLayout中的位置(从0到15)

从零開始开发Android版2048 (一)初始化界面

自学Android一个月多了,一直在工作之余零零散散地看一些东西.感觉经常使用的东西都有些了解了,可是一開始写代码总会出各种奇葩的问题.感觉还是代码写得太少.这样继续杂乱地学习下去进度也太慢了,并且学一点忘一点,效率太低.所以从今天開始.我打算实际做点小程序.在开发中不断地学习吧. 恰好近期Android上有个游戏2048比較火,所以就那这个练手吧. 由于对Android还没有太深入的了解,所以我写的东西都会比較基础,所以须要看一些高阶开发的朋友能够绕过了,也希望能够有高手们给我一些指导和建议,

从零開始开发Android版2048 (二)获取手势信息

今天是尝试開始Android版2048小游戏的第二天.在今天,我主要学习了怎样获取用户在屏幕滑动的手势,以及对布局进行了一些小小的完好. 获取用户操作的手势(比方向左滑.向右滑等)主要用到了GestureDetector.这个类能够帮助我们获取一些常见的用户对屏幕的操作.比如单击.双击.按压.拖动等.详细的使用说明.大家能够查API也能够去百度,或者看我之前有一篇使用GestureDetector实现的小样例(http://blog.csdn.net/xiapinnong/article/det

从零開始开发Android版2048 (四) 分数、重置、结束

这一篇的内容主要是在上一篇的基础上,增加分数计算(包含当前分数和最高分数).游戏结束的推断以及游戏界面的重置这三个部分的功能. 一.分数的计算和保存 首先,2048这个游戏的分数包含,两个部分当前游戏分数和最高分,当前的游戏分数我们能够保存在程序的变量中,由于它仅仅对当前这盘游戏实用,游戏结束就能够清空:而最高分则须要以一种方式保存在手机中,这样当我们下次再打开游戏时,还能读取到之前操作的最高分. 1.当前分数 当前分数的计算还是非常easy.我们仅仅须要在每次发生合并的时候,将产生的分数加到我

屌丝也能开发安卓版2048(App Inventor)

想编写安卓游戏,java太难,来试试App Inventor,虽然有人认为他是中学生的玩具,但是也能编写2048这样的火爆游戏,不需要太复杂的算法. 整个游戏有几个模块: 一.游戏初始化 数列转化为图形,使用了canvas和精灵,相对应list,这里注意精灵位置是固定的,只是更改图片,多少分,就对于n.jpg,0分是底色图片.左右移动,使用了flung判断,绝对值判断,水平速度和垂直速度哪个大,用来判断是左右移动还是上下移动. 二.计分模块 一般计分在合并处增加,最高分用了tiny db,游戏结

Android版2048

虽然说2048是好久前比较火的小游戏,但直到最近才有机会去研究下2048实现的源码,这里就简单写一下我(bie)的(ren)思路: 首先2048需要有十六个卡片,这个卡片可以用FrameLayout的子类来实现(继承),里面可以用TextView来实现设置背景颜色,显示的数字等.这样我们就可以简单实现这个卡片啦: public class Card extends FrameLayout { private int num = 0;    private TextView label; publ

和我一起开发Android应用(四)——拓词算法分析和“悦词”词库解析

今天我们要部分实现背单词功能,在开始正题之前,还是附上背单词软件的下载链接:http://apk.91.com/Soft/Android/com.carlos.yueci-4.html 最近实验室有了任务,时间会紧些,因此这个项目要加快进度了. 首先把我在系列二中的功能分析拷贝过来: 功能2.背单词. 实现方法:这里要用到第二个数据库,背单词的词库.我们需要一个存放单词的TXT文件,通过解析这个TXT文件,将要背的单词解析并存进数据库中,然后根据一定的规        律弹出单词. 所用到的技术

从零开始学android&lt;Intent初步.四十.&gt;

Intent意图是android中非常重要的部分,他在Activity,service中有较为广泛的应用. 1 public void startActivity(Intent intent) 普通 启动一个Activity,并通过Intent传送数据 2 public void startActivityForResult(Intent intent, int requestCode) 普通 启动并接收另一个Activity程序回传数据,当requestCode大于0才可以触发onActivi