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