Fork me on GitHub

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

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

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

 

posted @ 2014-12-13 22:53 whatbeg 阅读(...) 评论(...) 编辑 收藏