游戏说明
0-9共10个数字随机产生4个数字排列,玩家可最多猜测10次,每次猜测后会对猜测结果进行提示,如随机产生的是2018,而你猜测的是1598,则提示1A1B,1A表示你猜测的数字中有这个数字同时位置正确(这次是8),1B表示你猜测的数字中有这个数字但位置不正确(这次是1),全对时为4A0B
编写环境
adt-bundle-windows-x86-20130917
运行效果图
代码分解
strings.xml文件
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">遵职猜数</string>
<string name="action_settings">Settings</string>
<string name="tv1">遵职猜数</string>
<string name="tv3">版权所有 © 2018 计D171</string>
<string name="et_hint1">2</string>
<string name="et_hint2">0</string>
<string name="et_hint3">1</string>
<string name="et_hint4">8</string>
<string name="bt1">开始</string>
<string name="bt2">答案</string>
</resources>
bg_normal文件
此文件放在res/drawable中
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<solid android:color="#ffffff" />
<corners android:radius="3dip" />
<stroke
android:width="1dip"
android:color="#afafaf" />
</shape>
bg_focused文件
此文件放在res/drawable中
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<solid android:color="#ffffff" />
<corners android:radius="3dip" />
<stroke
android:width="2dip"
android:color="#aaffaa" />
</shape>
bg_selector.xml文件
此文件放在res/drawable中
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/bg_normal" android:state_focused="false"></item>
<item android:drawable="@drawable/bg_focused" android:state_focused="true"></item>
</selector>
activity_main.xml布局文件
<LinearLayout
android:id="@+id/ll1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:id="@+id/tv1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:drawable/edit_text"
android:gravity="center"
android:text="@string/tv1" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<EditText
android:id="@+id/et1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/bg_selector"
android:gravity="center"
android:hint="@string/et_hint1"
android:inputType="number"
android:maxLength="1" >
<requestFocus />
</EditText>
<EditText
android:id="@+id/et2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/bg_selector"
android:gravity="center"
android:hint="@string/et_hint2"
android:inputType="number"
android:maxLength="1" >
</EditText>
<EditText
android:id="@+id/et3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/bg_selector"
android:gravity="center"
android:hint="@string/et_hint3"
android:inputType="number"
android:maxLength="1" >
</EditText>
<EditText
android:id="@+id/et4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/bg_selector"
android:gravity="center"
android:hint="@string/et_hint4"
android:inputType="number"
android:maxLength="1" >
</EditText>
<Button
android:id="@+id/bt1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/bt1" />
<Button
android:id="@+id/bt2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/bt2" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:id="@+id/tv2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:drawable/edit_text"
android:maxLines="12"
android:scrollbars="vertical" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:drawable/edit_text"
android:gravity="center"
android:maxLines="12"
android:scrollbars="vertical"
android:text="@string/tv3"/>
</LinearLayout>
MainActivity.java文件
package com.ex.guessnum;
import java.util.Random;
import android.os.Bundle;
import android.app.Activity;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
/**
* 定义文本框控件,用于显示猜测结果
*/
TextView tv2;
/**
* 定义4个编辑框控件,用于接收4个猜测数字
*/
EditText et1, et2, et3, et4;
/**
* 定义按钮控件,用于开始和猜测
*/
Button btn1;
/**
* 定义按钮控件,用于查看答案
*/
Button btn2;
/**
* 定义4个变量用来存放4个随机数字
*/
int num1, num2, num3, num4;
/**
* 是否开始的标识
*/
int isBegin;
/**
* 猜的次数
*/
int times;
/**
* 存放猜测结果的字符串
*/
String strt = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 对应变量绑定对应控件
tv2 = (TextView) findViewById(R.id.tv2);
et1 = (EditText) findViewById(R.id.et1);
et2 = (EditText) findViewById(R.id.et2);
et3 = (EditText) findViewById(R.id.et3);
et4 = (EditText) findViewById(R.id.et4);
btn1 = (Button) findViewById(R.id.bt1);
btn2 = (Button) findViewById(R.id.bt2);
// 2个按钮添加监听
btn1.setOnClickListener(new btnClick());
btn2.setOnClickListener(new btnClick());
// 编辑框添加监听,每个编辑框输入一位数字后光标自动跳到下一编辑框
et1.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence arg0, int arg1,
int arg2, int arg3) {
// TODO Auto-generated method stub
}
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
// TODO Auto-generated method stub
}
// 编辑框1输入一位数字后光标自动跳到编辑框2
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
if (!et1.getText().toString().equals("")) {
et1.clearFocus(); // 失去焦点
et2.requestFocus();// 获取焦点
et2.selectAll();
}
}
});
et2.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
// TODO Auto-generated method stub
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
// 编辑框2输入一位数字后光标自动跳到编辑框3
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
if (!et2.getText().toString().equals("")) {
et2.clearFocus(); // 失去焦点
et3.requestFocus();// 获取焦点
et3.selectAll();
}
}
});
et3.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
// TODO Auto-generated method stub
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
// 编辑框3输入一位数字后光标自动跳到编辑框4
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
if (!et3.getText().toString().equals("")) {
et3.clearFocus(); // 失去焦点
et4.requestFocus();// 获取焦点
et4.selectAll();
}
}
});
et4.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
// TODO Auto-generated method stub
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
if (!et4.getText().toString().equals("")) {
et4.clearFocus(); // 失去焦点
btn1.requestFocus();// 获取焦点
}
}
});
// 开始标识设置为0
isBegin = 0;
// 4个编辑框没有开始时不能输入
et1.setEnabled(false);
et2.setEnabled(false);
et3.setEnabled(false);
et4.setEnabled(false);
// 答案按钮不能使用
btn2.setEnabled(false);
}
private class btnClick implements OnClickListener {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (v == btn1) {
if (isBegin == 0) {
// 产生4个不相同的一位数字,如2018
getRan();
btn1.setText("猜测");
// 是否开始
isBegin = 1;
times = 0;
strt = "";
//
et1.setEnabled(true);
et2.setEnabled(true);
et3.setEnabled(true);
et4.setEnabled(true);
//
et1.setHint("");
et2.setHint("");
et3.setHint("");
et4.setHint("");
//
et1.setText("");
et2.setText("");
et3.setText("");
et4.setText("");
// 提示框清空
tv2.setText("");
// et1获取焦点
et1.requestFocus();
et1.selectAll();
// “答案”按钮不可用
btn2.setEnabled(false);
} else {
guess();
}
}
if (v == btn2) {
getAns();
}
}
}
/**
* 产生4个不相同的一位数字,如2018
*/
private void getRan() {
// 实例化一个随机对象rd
Random rd = new Random();
// rd随机取0-9中的任意一个数字赋给num1
// 产生一个从0到9的范围的随机数
num1 = rd.nextInt(10);
// rd随机取0-9中的任意一个数字赋给num2
num2 = rd.nextInt(10);
// rd让num1和num2不相等
while (num1 == num2) {
num2 = rd.nextInt(10);
}
// rd随机取0-9中的任意一个数字赋给num3
num3 = rd.nextInt(10);
// rd让num3与num1和num2都不相等
while (num1 == num3 || num2 == num3) {
num3 = rd.nextInt(10);
}
// rd随机取0-9中的任意一个数字赋给num4
num4 = rd.nextInt(10);
// rd让num4、num3、num1、num2互不相等
while (num1 == num4 || num2 == num4 || num3 == num4) {
num4 = rd.nextInt(10);
}
}
/**
* 猜测情况显示
*/
private void guess() {
// 定义四个变量来接收输入的四个数字
int n1, n2, n3, n4;
// ac用来统计数字正确同时位置正确的个数
// bc用来统计数字正确但位置不正确的个数
int ac, bc;
ac = bc = 0;
// 判断输入是否为一位数字
try {
String str1, str2, str3, str4;
str1 = et1.getText().toString();
str2 = et2.getText().toString();
str3 = et3.getText().toString();
str4 = et4.getText().toString();
n1 = Integer.parseInt(str1);
n2 = Integer.parseInt(str2);
n3 = Integer.parseInt(str3);
n4 = Integer.parseInt(str4);
if (n1 < 0 || n1 > 9) {
toastDisplay("每个文本框只能输入1个数字");
return;
}
if (n2 < 0 || n1 > 9) {
toastDisplay("每个文本框只能输入1个数字");
return;
}
if (n3 < 0 || n1 > 9) {
toastDisplay("每个文本框只能输入1个数字");
return;
}
if (n4 < 0 || n1 > 9) {
toastDisplay("每个文本框只能输入1个数字");
return;
}
} catch (Exception ex) {
// show info
toastDisplay("输入有误,请输入1个数字");
return;
}
// 依次判断是否有数字重复,若有则不继续执行
if (n2 == n1) {
toastDisplay("数字不能重复");
return;
}
if (n3 == n2 | n3 == n1) {
toastDisplay("数字不能重复");
return;
}
if (n4 == n3 | n4 == n2 | n4 == n1) {
toastDisplay("数字不能重复");
return;
}
// 猜测次数加1
times++;
// 如果输入的第1个数字和num1相等,
// 则说明数字正确同时位置正确的个数加1
if (n1 == num1) {
ac++;
}
// 如果输入的第2个数字和num2相等,
// 则说明数字正确同时位置正确的个数加1
if (n2 == num2) {
ac++;
}
// 如果输入的第3个数字和num3相等,
// 则说明数字正确同时位置正确的个数加1
if (n3 == num3) {
ac++;
}
// 如果输入的第4个数字和num4相等,
// 则说明数字正确同时位置正确的个数加1
if (n4 == num4) {
ac++;
}
// 如果输入的第1个数字和num2、num3、num4其中某个数相等,
// 则说明数字正确的个数加1
if (n1 == num2 || n1 == num3 || n1 == num4) {
bc++;
}
// 如果输入的第2个数字和num1、num3、num4其中某个数相等,
// 则说明数字正确的个数加1
if (n2 == num1 || n2 == num3 || n2 == num4) {
bc++;
}
// 如果输入的第3个数字和num1、num2、num4其中某个数相等,
// 则说明数字正确的个数加1
if (n3 == num2 || n3 == num1 || n3 == num4) {
bc++;
}
// 如果输入的第4个数字和num1、num3、num2其中某个数相等,
// 则说明数字正确的个数加1
if (n4 == num2 || n4 == num3 || n4 == num1) {
bc++;
}
// 如猜测的是1234,而答案是1540,
// 则显示“第N次 1234 1A1B”
strt += "第" + times + "次 ";
strt += n1 + "" + n2;
strt += n3 + "" + n4 + " ";
strt += ac + "A";
strt += bc + "B" + "\n";
// 把上面显示字符串放到tv多行文本框中
tv2.setText(strt);
// 如果猜测了10次,则“猜测”按钮不能再用
// “答案”按钮能用
// 4个输入数字的文本框不能输入数字
// 同时提示猜测次数
if (times == 10) {
// 是否开始
isBegin = 0;
btn1.setText("开始");// 重新
btn2.setEnabled(true);
et4.setEnabled(false);
et1.setEnabled(false);
et2.setEnabled(false);
et3.setEnabled(false);
strt += "\n" + "已猜测10次,请努力!";
// 把上面显示字符串放到tv2多行文本框中
tv2.setText(strt);
times = 0;
}
// 如果猜测不到10次,则光标放在et1上
else {
et1.requestFocus();
et1.selectAll();
}
// 数字正确同时位置正确的有4个
// 则“猜测”按钮不能再用
// 4个输入数字的文本框不能输入数字
// 同时提示猜测成功
if (ac == 4) {
// 是否开始
isBegin = 0;
btn1.setText("开始");// 重新
btn2.setEnabled(true);
et1.setEnabled(false);
et2.setEnabled(false);
et3.setEnabled(false);
et4.setEnabled(false);
// 加入一个空行
strt += "\n";
if (times <= 3) {
// 提示猜测成功
strt += "天,你太牛了!";
// 把上面显示字符串放到tv2多行文本框中
tv2.setText(strt);
} else if (times <= 6) {
// 提示猜测成功
strt += "你很了不起!";
// 把上面显示字符串放到tv2多行文本框中
tv2.setText(strt);
} else {
// 提示猜测成功
strt += "恭喜,你猜对了!";
// 把上面显示字符串放到tv2多行文本框中
tv2.setText(strt);
}
times = 0;
}
}
/**
* 显示答案
*/
private void getAns() {
// 把答案的4个数字显示在4个输入文本框中
et1.setText("" + num1);
et2.setText("" + num2);
et3.setText("" + num3);
et4.setText("" + num4);
btn1.setEnabled(true);
}
/**
* 显示消息str
* @param str
*/
private void toastDisplay(String str) {
// TODO Auto-generated method stub
Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
}
}
致谢
感谢所有在网上开源和不吝赐教的无私奉献者。