用Android编写猜数小游戏

游戏说明

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();
	}
}

致谢

感谢所有在网上开源和不吝赐教的无私奉献者。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值