zoukankan      html  css  js  c++  java
  • 【原创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

  • 相关阅读:
    Oracle序列更新
    ssh服务器终端乱码
    iTerm2常用的快捷键
    原来 Set 集合也可以排序
    Java 单例
    java后台技术
    网易考拉规则引擎平台架构设计与实践
    HBase最佳实践(好文推荐)
    如何通俗的解释云
    写的不错的一篇云数据库的文章
  • 原文地址:https://www.cnblogs.com/whatbeg/p/4161978.html
Copyright © 2011-2022 走看看