---------------------------------------------------------------

V0.1版本

上次做完第一个版本后,发现还有一些漏洞,并且还有一些可以添加的功能,以及一些可改进的地方,于是准备继续完善此游戏,顺便学Android了。

本次更新信息如下:

1.改正了随机数生成算法,更正了不能产生数字'9'的bug
2.增加了数据存储与IO的内容,使用了SharedPreferences保存数据
3.保存数据为: 总盘数,猜中的盘数
4.使用了SimpleAdapter创建ListView来显示多用户的数据
5.ListView显示的数据放在另一个Activity中,每个Activity中有一个按钮来控制Activity的切换
6.猜中时增加了一个弹出信息
7.增加了用户头像和用户签名
(用户暂时都是系统指定的,还没有实现增加用户的注册功能等)

--------------------------------------------------------------------------------------------------------------------

1.改正了随机数生成算法,更正了不能产生数字 '9' 的bug

上次程序产生随机数是这样的:

Rn[0] = 1 + ((int)(Math.random()*8))%10;

因为Math.random函数产生的是[0.0,1.0)的随机浮点数,所以((int)(Math.random()*8))%10; 是不可能产生8的,所以 Rn[0]就不能得到9, 这是我疏忽了,直接复制的以前的代码,现在改正过来了。

2.增加了数据存储与IO的内容,使用了SharedPreferences保存数据

使用SharedPreferences与Editor进行文件的输入输出,以记录盘数数据以及正确盘数数据。

SharedPreferences保存的数据主要是类似于配置信息,主要是简单类型的key-value对,value可以是String,Int等多种数据类型。

SharedPreferences负责根据key读取数据值,而SharedPreferences.Editor用于写入数据。

getSharedPreferences方法用来获取SharedPreferences实例。

preferences.getXXX() , editor.putXxx() 分别从文件中读取数据和写入数据, Xxx可以是String,Int...

存储数据总会保存在/data/data/<package name>/shared_prefs, 以xml的形式存储。

写入数据方法代码如下:

void WriteData(boolean yes, int Count) {
int usercnt = preferences.getInt("TOTALUSER", 0); //这里不用管
editor.putInt("TOTALUSER",4); //预设的是4个玩家
int YES = preferences.getInt("YES", 0); //从文件中读出: 正确的盘数
int TOTAL = preferences.getInt("TOTAL", 0); //从文件中读出: 总盘数
if(yes) { //如果这盘正确
editor.putString("Username", "Whatbeg"); //写入
editor.putInt("YES", YES+1);
editor.putInt("TOTAL", TOTAL+1);
}
else if(Count > 0) { //否则如果现在已经开始了,猜了1个及以上
editor.putString("Username", "Whatbeg"); //写入
editor.putInt("TOTAL", TOTAL+1);
}
editor.commit(); //提交修改
}

在猜对或者失败后立即更新数据。

在按退出键、继续键和排行键的时候,更新数据,如果此时Count==5,那么这盘的数据已经被写入,将Count赋为0,代表忽略掉。

3.使用了SimpleAdapter创建ListView来显示多用户的数据

rankmain.xml 实现了ListView界面布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
> <ListView
android:id="@+id/mylist"
android:layout_width="fill_parent"
android:layout_height="392dp" /> <Button
android:id="@+id/ret"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:text="@string/rett" /> </RelativeLayout>

同时ranking实现了把数据展示到列表中的布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" > <ImageView android:id="@+id/header"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="10dp"/> <LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
> <TextView android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:textColor="#f0f"
android:paddingLeft="10dp"
/> <TextView android:id="@+id/descs"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="14sp"
android:paddingLeft="10dp"
/>
</LinearLayout>
</LinearLayout>

实现的列表布局如下:

4.ListView显示的数据放在另一个Activity中,每个Activity中有一个按钮来控制Activity的切换

1.增加Activity的时候要在AndroidManifest.xml中注册,每个应用文件夹都有两个AndroidManifest.xml,其中根目录下有一个,bin下也有一个,更改根目录下的xml,保存后会直接自动更改bin下的xml文件,而不需要在添加一次,然而改变bin下的是不能影响到根目录下的xml文件的。

2.启动Activity的方式:

Intent intent = new Intent(Source.this, Destination.class);      //创建需要启动的Activity对应的intent

startActivity(intent);                                                            //启动intent对应的Activity

通过两个Button进行两个Activity转换代码:

rank.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View source)
{
WriteData(false,Count=(Count==5?0:Count)); //Count=5就不算失败了
Intent intent = new Intent(MainActivity.this, RankActivity.class);
startActivity(intent);
finish();
}
});

in MainActivity.java

Button ret = (Button) findViewById(R.id.ret);
ret.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View source)
{
Intent intent = new Intent(RankActivity.this, MainActivity.class);
startActivity(intent);
finish();
}
});

in RankActivity.java

5.猜中时增加了一个弹出信息

7.增加了用户头像和用户签名

-----------------------------------------------------------------------------------------------------

源代码:

package com.example.guessit;

import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.inputmethod.EditorInfo;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences; public class MainActivity extends Activity
{
int Count = 0,AA,BB,k,base,NUM;
int [] Tag = new int[11];
char [] ss = new char[5];
String Answer;
boolean flag = false, Double = false, Not4Digit = false, NotDigit = false, haveZero = false, haveNonDigit = false;
SharedPreferences preferences; //IO.
SharedPreferences.Editor editor;
void WriteData(boolean yes, int Count) {
int usercnt = preferences.getInt("TOTALUSER", 0);
editor.putInt("TOTALUSER",4);
int YES = preferences.getInt("YES", 0);
int TOTAL = preferences.getInt("TOTAL", 0);
if(yes) {
editor.putString("Username", "Whatbeg");
editor.putInt("YES", YES+1);
editor.putInt("TOTAL", TOTAL+1);
}
else if(Count > 0) {
editor.putString("Username", "Whatbeg");
editor.putInt("TOTAL", TOTAL+1);
}
editor.commit();
}
String GenerateRandomNumber()
{
for(int t=1;t<=9;t++) Tag[t]=0;
Tag[0]=20;
int [] Rn = new int[5];
Rn[0] = 1 + ((int)(Math.random()*9)%9+9)%9;
while(Tag[Rn[0]]>0) Rn[0]= 1 + ((int)(Math.random()*9)%9+9)%9;
Tag[Rn[0]]++;
Rn[1] = 1 + ((int)(Math.random()*9)%9+9)%9; while(Tag[Rn[1]]>0) Rn[1]= 1 + ((int)(Math.random()*9)%9+9)%9;
Tag[Rn[1]]++;
Rn[2] = 1 + ((int)(Math.random()*9)%9+9)%9; while(Tag[Rn[2]]>0) Rn[2]= 1 + ((int)(Math.random()*9)%9+9)%9;
Tag[Rn[2]]++;
Rn[3] = 1 + ((int)(Math.random()*9)%9+9)%9; while(Tag[Rn[3]]>0) Rn[3]= 1 + ((int)(Math.random()*9)%9+9)%9;
Tag[Rn[3]]++; //can be ignored base = 1;
NUM = 0;
for(int i=3;i>=0;i--)
{
NUM += base*Rn[i];
base *= 10;
}
return String.valueOf(NUM);
} @SuppressWarnings("deprecation")
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Answer = GenerateRandomNumber();
final Button enter = (Button) findViewById(R.id.enter);
final Button quit = (Button) findViewById(R.id.quitbut);
final Button cont = (Button) findViewById(R.id.continuebut);
final Button rank = (Button) findViewById(R.id.rank); preferences = getSharedPreferences ("rank", Context.MODE_WORLD_READABLE);
editor = preferences.edit(); flag = false;
Count = 0;
final TextView []show = new TextView [7];
final TextView ANS = (TextView) findViewById(R.id.ANSTEXT);
final EditText pass = (EditText) findViewById(R.id.guessed);
pass.setInputType(EditorInfo.TYPE_CLASS_PHONE);
show[1] = (TextView) findViewById(R.id.TextView01);
show[2] = (TextView) findViewById(R.id.TextView02);
show[3] = (TextView) findViewById(R.id.TextView03);
show[4] = (TextView) findViewById(R.id.TextView04);
show[5] = (TextView) findViewById(R.id.TextView05); quit.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
WriteData(false,Count=(Count==5?0:Count));
finish();
}
}); cont.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
WriteData(false,Count=(Count==5?0:Count));
Answer = GenerateRandomNumber();
for(int i=1;i<=5;i++) show[i].setText("");
ANS.setText("");
pass.setText("");
flag = false;
Count = 0;
enter.setClickable(true);
Toast.makeText(MainActivity.this, "再接再厉", Toast.LENGTH_SHORT).show();
}
});
enter.setOnClickListener(new OnClickListener() { // Guess the number and handle it by the Program! public void onClick(View v) {
String guessed = pass.getText().toString();
//Check Validation.......
Not4Digit = Double = haveZero = haveNonDigit = false;
if(guessed.length() != 4) {
Not4Digit = true;
}
else {
for(int i=0;i<4;i++)
for(int j=i+1;j<4;j++)
if(guessed.charAt(i) == guessed.charAt(j))
Double = true;
for(int i=0;i<4;i++)
if(guessed.charAt(i) == '0')
haveZero = true;
for(int i=0;i<4;i++)
if(guessed.charAt(i) < '0' || guessed.charAt(i) > '9')
haveNonDigit = true;
}
//Check Validation......
if(Not4Digit) {
Toast.makeText(MainActivity.this, "请填入四位数字..", Toast.LENGTH_LONG).show();
pass.setText("");
}
else if(Double) {
Toast.makeText(MainActivity.this, "四位数字每位数字都不能相等!", Toast.LENGTH_LONG).show();
pass.setText("");
}
else if(haveNonDigit) {
Toast.makeText(MainActivity.this, "请不要输入其它非数字字符", Toast.LENGTH_LONG).show();
pass.setText("");
}
else if(haveZero) {
Toast.makeText(MainActivity.this, "数字为0~9之间哦", Toast.LENGTH_LONG).show();
pass.setText("");
}
else {
Count++; //只有5次机会
pass.setText(""); //clear the input text
if(guessed.equals(Answer)) //猜对了
{
flag = true;
if(Count <= 2) //2 次以内猜中
Toast.makeText(MainActivity.this, "你简直是个天才!", Toast.LENGTH_LONG).show();
else if(Count == 3)
Toast.makeText(MainActivity.this, "你狠聪明呀,三次就猜对了!", Toast.LENGTH_LONG).show();
else
Toast.makeText(MainActivity.this, "恭喜你,猜对了!", Toast.LENGTH_LONG).show();
show[Count].setText(guessed+" "+4+"A"+0+"B");
ANS.setText("正确答案: " + Answer);
enter.setClickable(false);
WriteData(true,Count);
}
else
{
k = 0;
AA = BB = 0;
for(int i=0;i<4;i++)
{
if(guessed.charAt(i) == Answer.charAt(i))
AA++;
else
ss[k++]=guessed.charAt(i);
}
for(int j=0;j<k;j++)
{
for(int ka=0;ka<4;ka++)
{
if(ss[j] == Answer.charAt(ka))
BB++;
}
}
show[Count].setText(guessed+" "+AA+"A"+BB+"B");
}
if(!flag && Count == 5) //5次还没猜对
{
ANS.setText("正确答案: " + Answer);
Toast.makeText(MainActivity.this, "很遗憾,只有五次机会,你还是没有猜对.5555..", Toast.LENGTH_LONG).show();
enter.setClickable(false);
WriteData(false,Count);
}
}
}
});
rank.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View source)
{
WriteData(false,Count=(Count==5?0:Count)); //Count=5就不算失败了
Intent intent = new Intent(MainActivity.this, RankActivity.class);
startActivity(intent);
finish();
}
});
}
}

MainActivity.java

package com.example.guessit;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleAdapter; public class RankActivity extends Activity {
private String [] names = new String[]
{
"Whatbeg", "Hello_World", "WWWW", "GOFORIT"
};
private String [] descs = new String[]
{ "可爱的小孩","一个擅长音乐的女孩","文艺女青年","浪漫主义诗人" };
private int [] imageids = new int[]
{
R.drawable.tiger,
R.drawable.woman,
R.drawable.boy,
R.drawable.girl
};
SharedPreferences preferences; //IO.
SharedPreferences.Editor editor;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.rankmain); preferences = getSharedPreferences ("rank", MODE_WORLD_READABLE);
editor = preferences.edit();
int TotalUser = preferences.getInt("TOTALUSER", 4);
List<Map<String,Object> > listItems = new ArrayList<Map<String,Object> >();
for(int i=0;i<TotalUser;i++)
{
Map<String,Object> li = new HashMap<String,Object>();
int YES = preferences.getInt("YES", 0);
int TOTAL = preferences.getInt("TOTAL", 1);
li.put("header", imageids[i]);
li.put("personname",names[i] + " " + String.valueOf(YES) + "/" + String.valueOf(TOTAL));
li.put("descs", descs[i]);
listItems.add(li);
} SimpleAdapter simpleadapter = new SimpleAdapter(this,listItems,R.layout.ranking,
new String[]{"personname","header","descs"},
new int[]{R.id.name,R.id.header,R.id.descs}); ListView list = (ListView) findViewById(R.id.mylist);
list.setAdapter(simpleadapter); Button ret = (Button) findViewById(R.id.ret);
ret.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View source)
{
Intent intent = new Intent(RankActivity.this, MainActivity.class);
startActivity(intent);
finish();
}
});
}
}

RankActivity.java

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" > <ImageView android:id="@+id/header"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="10dp"/> <LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
> <TextView android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:textColor="#f0f"
android:paddingLeft="10dp"
/> <TextView android:id="@+id/descs"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="14sp"
android:paddingLeft="10dp"
/>
</LinearLayout>
</LinearLayout>

ranking.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
> <ListView
android:id="@+id/mylist"
android:layout_width="fill_parent"
android:layout_height="392dp" /> <Button
android:id="@+id/ret"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:text="@string/rett" /> </RelativeLayout>

rankmain.xml

<?xml version="1.0" encoding="utf-8"?>
<resources> <string name="app_name">猜数字游戏V1.1</string>
<string name="Rank">排行榜</string>
<string name="action_settings">Settings</string>
<string name="hello_world">Hello world!</string>
<string name="input">请猜数字:</string>
<string name="begin">确定</string>
<string name="hint">请输入四位数字</string>
<string name="cont">继续</string>
<string name="quit">退出</string>
<string name="rank">排行</string>
<string name="rett">返回</string> </resources>

strings.xml

-------------------------------------------------------------------------------------

效果:

-----------------------------------------------------------------------------------------------------

这次就先更新到这,接下来主要需要实现的功能:

用户注册与存储(最好用Sqlite数据库来存储) 及 即时排序rank更新 以及优化和BUG修正。

----------------------------------------------------------------------------------------------------------------------

APK:  http://pan.baidu.com/s/1dD9yvSH

【原创Android游戏】--猜数字游戏V1.1 --数据存储,Intent,SimpleAdapter的学习与应用的更多相关文章

  1. CASIO 5800P计算器游戏--猜数字游戏

    CASIO 5800P 计算器游戏--猜数字游戏原代码 我编的计算器小游戏--猜数字游戏 LbI I↙ "xxGUESS NUMBERxx xPROGRAMMER:JCHx -------- ...

  2. C语言之猜数字游戏

    猜数字游戏 猜数字游戏是以前功能机上的一款益智游戏,计算机会根据输入的位数随机分配一个符合要求的数据,计算机输出guess后便可以输入数字,注意数字间需要用空格或回车符加以区分,计算机会根据输入信息给 ...

  3. 【原创Android游戏】--猜数字游戏Version 0.1

    想当年高中时经常和小伙伴在纸上或者黑板上或者学习机上玩猜数字的游戏,在当年那个手机等娱乐设备在我们那还不是很普遍的时候是很好的一个消遣的游戏,去年的时候便写了一个Android版的猜数字游戏,只是当时 ...

  4. Python实现猜数字游戏1.0版

    本文由荒原之梦原创,原文链接:http://zhaokaifeng.com/?p=702 """ 功能: 随机生成一个数字,最多有3次猜测机会,如果第一次没有猜对,则从第 ...

  5. [C++]猜数字游戏的提示(Master-Mind Hints,UVa340)

    [本博文非博主原创,思路与题目均摘自 刘汝佳<算法竞赛与入门经典(第2版)>] Question 例题3-4 猜数字游戏的提示(Master-Mind Hints,UVa340) 实现一个 ...

  6. Poj 2328 Guessing Game(猜数字游戏)

    一.题目大意 两个小盆友玩猜数字游戏,一个小盆友心里想着1~10中的一个数字,另一个小盆友猜.如果猜的数字比实际的大,则告诉他"too high",小则"too low& ...

  7. 通过游戏学python 3.6 第一季 第三章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码 可复制直接使用 娱乐 可封装 函数

       猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码   #猜数字--核心代码--猜测次数--随机函数和屏蔽错误代码 import random secrst = random.rand ...

  8. java实现 猜数字游戏

    猜数字游戏 猜数字 很多人都玩过这个游戏:甲在心中想好一个数字,乙来猜.每猜一个数字,甲必须告诉他是猜大了,猜小了,还是刚好猜中了.下列的代码模拟了这个过程.其中用户充当甲的角色,计算机充当乙的角色. ...

  9. C语言猜数字游戏

    猜数字游戏,各式各样的实现方式,我这边提供一个实现方式,希望可以帮到新手. 老程序猿就不要看了,黑呵呵 源代码1 include stdio.h include stdlib.h include ti ...

随机推荐

  1. 分享25个新鲜出炉的 Photoshop 高级教程

    网络上众多优秀的 Photoshop 实例教程是提高 Photoshop 技能的最佳学习途径.今天,我向大家分享25个新鲜出炉的 Photoshop 高级教程,提高你的设计技巧,制作时尚的图片效果.这 ...

  2. [deviceone开发]-do_Viewshower的动画效果示例

    一.简介 do_Viewshower组件也支持View之间的过场动画,支持大概12种,这个示例随机的切换12种动画中的一种,而且每次切换的动画时间不一样.直观的展示12种动画的效果.适合初学者. 二. ...

  3. Request.MapPath和ServerMapPath

    一.路径 / 念 反斜杠,/ 是超文本协议的路径分隔符号,所有的网站在浏览器中显示的路径分隔都是以"/"表示.它一般代表虚拟路径. \ 念 斜杠,在普通程序代码中则以"\ ...

  4. 创建SAP GUI快捷方式保存密码

    1.在注册表中创建GUI 快捷方式的子键 a.首先运行  微软标识键+R    b.窗口中输入sapshcut,如果有窗口跳出点击“确定” 2.维护子键下的键值 a.再次运行  微软标识键+R    ...

  5. RMS问题整理

    1. 客户端提示"102错误"或者"意外错误,请与管理员联系" 解决方法:在确定Office2003已经安装SP3补丁以后请安装KB978551补丁 下载地址: ...

  6. Atitit。Web server Jetty9 使用 attilax 总结

    Atitit.Web server Jetty9 使用 attilax 总结 1.1. 静态文件的资源1 1.2. Servlet使用1 1.3. code1 1.1. 静态文件的资源 WebAppC ...

  7. GDAL关于读写图像的简明总结

    读写影像可以说是图像处理最基础的一步.关于使用GDAL读写影像,平时也在网上查了很多资料,就想结合自己的使用心得,做做简单的总结. 在这里写一个例子:裁剪lena图像的某部分内容,将其放入到新创建的. ...

  8. Android Contextual Menus之二:contextual action mode

    Android Contextual Menus之二:contextual action mode 接上文:Android Contextual Menus之一:floating context me ...

  9. 希尔排序(Shell)

    希尔排序的实质就是分组插入排序,该方法又称缩小增量排序. 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序, ...

  10. 操作系统开发系列—13.a.进程 ●

    进程的切换及调度等内容是和保护模式的相关技术紧密相连的,这些代码量可能并不多,但却至关重要. 我们需要一个数据结构记录一个进程的状态,在进程要被挂起的时候,进程信息就被写入这个数据结构,等到进程重新启 ...