这一篇的内容主要是在上一篇的基础上,增加分数计算(包含当前分数和最高分数)、游戏结束的推断以及游戏界面的重置这三个部分的功能。

一、分数的计算和保存

         首先,2048这个游戏的分数包含,两个部分当前游戏分数和最高分,当前的游戏分数我们能够保存在程序的变量中,由于它仅仅对当前这盘游戏实用,游戏结束就能够清空;而最高分则须要以一种方式保存在手机中,这样当我们下次再打开游戏时,还能读取到之前操作的最高分。

1、当前分数

        当前分数的计算还是非常easy。我们仅仅须要在每次发生合并的时候,将产生的分数加到我们声明的分数的变量中,然后更新一下用于显示当前分数的控件就可以。
        我參考了一下眼下大多数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()+"");
}


二、游戏的重置

游戏的重置非常easy,由于我在之前,把填充空白格,随机生产两个数字格等初始化的操作都放在了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



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

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

    自学Android一个月多了,一直在工作之余零零散散地看一些东西.感觉经常使用的东西都有些了解了,可是一開始写代码总会出各种奇葩的问题.感觉还是代码写得太少.这样继续杂乱地学习下去进度也太慢了,并且学 ...

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

    今天是尝试開始Android版2048小游戏的第二天.在今天,我主要学习了怎样获取用户在屏幕滑动的手势,以及对布局进行了一些小小的完好. 获取用户操作的手势(比方向左滑.向右滑等)主要用到了Gestu ...

  3. 从零開始开发Android版2048 (三)逻辑推断

    近期工作比較忙,所以更新的慢了一点,今天的主要内容是关于Android版2048的逻辑推断,经过本篇的解说,基本上完毕了这个游戏的主体部分. 首先还是看一下,我在实现2048时用到的一些存储的数据结构 ...

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

    本篇的内容是,在前一篇的基础上添�了撤销的功能.撤销事实上就是将当前的用户界面恢复到这次滑动值前的样子.我实现撤销的主要原理是,将每次滑动后界面上的格子和相应的数字记录下来,当然还有分数,把这些数据写 ...

  5. Bmob移动后端云服务平台--Android从零開始--(二)android高速入门

    Bmob移动后端云服务平台--Android从零開始--(二)android高速入门 上一篇博文我们简介何为Bmob移动后端服务平台,以及其相关功能和优势. 本文将利用Bmob高速实现简单样例,进一步 ...

  6. 从零開始学android&lt;TabHost标签组件.二十九.&gt;

    TabHost主要特点是能够在一个窗体中显示多组标签栏的内容,在Android系统之中每一个标签栏就称为一个Tab.而包括这多个标签栏的容器就将其称为TabHost.TabHost类的继承结构例如以下 ...

  7. 第13章、布局Layouts之RelativeLayout相对布局(从零開始学Android)

    RelativeLayout相对布局 RelativeLayout是一种相对布局,控件的位置是依照相对位置来计算的,后一个控件在什么位置依赖于前一个控件的基本位置,是布局最经常使用,也是最灵活的一种布 ...

  8. 从零開始学android&lt;SeekBar滑动组件.二十二.&gt;

    拖动条能够由用户自己进行手工的调节,比如:当用户须要调整播放器音量或者是电影的播放进度时都会使用到拖动条,SeekBar类的定义结构例如以下所看到的: java.lang.Object    ↳ an ...

  9. 从零開始学android&lt;数据存储(1)SharedPreferences属性文件.三十五.&gt;

    在android中有五种保存数据的方法.各自是: Shared Preferences Store private primitive data in key-value pairs. 相应属性的键值 ...

随机推荐

  1. 用elasticsearch索引mongodb数据

    参照网页:单机搭建elasticsearch和mongodb的river 三个步骤: 一,搭建单机replicSet二,安装mongodb-river插件三,创建meta,验证使用 第一步,搭建单机m ...

  2. 如何判断一个变量是数组Array类型

    在很多时候,我们都需要对一个变量进行数组类型的判断.JavaScript中如何判断一个变量是数组Array类型呢?我最近研究了一下,并分享给大家,希望能对大家有所帮助. JavaScript中检测对象 ...

  3. leetcode第一刷_Construct Binary Tree from Inorder and Postorder Traversal

    这道题是为数不多的感觉在读本科的时候见过的问题. 人工构造的过程是如何呢.兴许遍历最后一个节点一定是整棵树的根节点.从中序遍历中查找到这个元素,就能够把树分为两颗子树,这个元素左側的递归构造左子树,右 ...

  4. android项目 之 记事本(6)----- 加入手写

    想必大家都用过QQ的白板功能,里面主要有两项,一个是涂鸦功能,事实上类似于上节的画板功能,而还有一个就是手写,那记事本怎么能没有这个功能呢,今天就来为我们的记事本加入手写功能. 先上图,看看效果: 看 ...

  5. Android Studio导出Jar包

    这篇博客将介绍一下如何用Android Studio导出jar包,希望能给大家带来帮助. 首先需要修改build.gradle文件,在Android Studio中会显示多个build.gradle文 ...

  6. IOC容器初始化——BeanDefinition的Resource定位

    以编程的方式使用DefaultListableBeanFactory时,首先定义一个Resource来定位容器使用的BeanDefinition.这是使用的是ClassPathResource,意味着 ...

  7. JavaScript 导学推荐

    基本开始js学习的时候,可能会觉得很混乱,一开始都是从一些简单的表单验证还有拷贝别人效果代码,然后再慢慢去深入了解.我是觉得js是需要一定语言编程基础,我是觉得随着深入,JS的里面实在不算太好理解,个 ...

  8. plsql 的循环之 goto

    实例: /* 测试goto 的用法, */ procedure test_loop_go(pi_aab001 in number, po_fhz out varchar2, po_msg out va ...

  9. python优秀库 - 使用envelopes发送邮件

    这里有一个使用python自带lib发送邮件的例子(http://my.oschina.net/leejun2005/blog/74416),这里面讲解的很全面,可以供大家参考. 今天将的是使用env ...

  10. 3,C语言文件读写

    这两天看到一个关于文件读写的题目,索性就把相关内容总结下. C语言文件读写,无非是几个读写函数的应用,fopen(),fread(),fwrite()等,下面简单介绍下. 一.fopen() 函数原型 ...