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

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

一、分数的计算和保存

首先,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\

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文件,以下是我在手机上截的图:

76b0817b55adddfc0ade638b130aba7f.png

2d9ca8a9edab2bc376b5c34e77340b92.png

然后,我在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的程序,不能这么马马虎虎就结束掉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值