猜数字(又称公牛和母牛)是一种古老的的密码破译类益智类小游戏,起源于 20 世纪中期,一般由两个人或多人玩,也可以由一个人和电脑玩。通常由两个人玩,一方出数字,一方猜。
游戏规则:出数字的人要想好一个没有重复数字的 4 个数,不能让猜的人知道。猜的人就可以开始猜。每猜一个数字,出数者就要根据这个数字给出 几 A 几 B,其中 A 前面的数字表示数字正确且位置也正确的数的个数,而 B 前的数字表示数字正确但位置不正确的数的个数。如正确答案为 5234 ,而猜的人猜 5346 ,则是 1A2B ,其中有一个 5 的位置对了,记为 1 ,而 3 和 4 这两个数字对了,而位置没对,因此记为 2 B,合起来就是 1A2B 。接着猜的人再根据出题者的几 A 几 B 继续猜,直到猜中(即4 A 0 B)为止。
要求:
1、出数字(由电脑产生 4 个 0-9 随机数,且不重复)
2、猜数字(用户输入):
2-1:只能输入一个数字字符串
2-2:字符串中的字符不能重复
2-3:只能输入 4 个字符(如果字符个数不等于 4 个,需要用户重新输入)
注意:如果用户没有输入正确的话,不会进入比较环节
3、用户猜的数字和电脑出的数字比较,给出结果几A几B,如果结果不是 4A0B,需要用户重新输入,直到 4A4B为止
public class Games{
public static void main(String[] args){
System.out.println("猜数字游戏开始咯!");
// 1.出数字(由电脑产生4个0-9随机数,且不重复)
/*
随机数 Math.random() 生成 0-1之间的浮点型随机数
整型随机数a-b--> a + 0~(b-a) (int)(Math.random() * (b - a + 1) + a)
*/
// 创建数组
int[] suiJiShu = new int[4];
// 遍历随机数数组的同时 放随机数
// 此时i可以表示 数组元素的下标 计数变量
for (int i = 0; i < suiJiShu.length; i++){
// 生成 0-9 随机数 放入数组下标为i处
suiJiShu1[i] = (int)(Math.random() *( 9 - 0 + 1) + 0);
// 去重 i下标的元素,和所有下标小于i的元素做比较,如果重复
// 重新赋值
for(int j = 0;j < i;j++){// j 表示 比i小的所有下标
if(suiJiShu[i] == suiJiShu[j]){
// 循环回滚
i--;
break;
}
}
}
System.out.println("电脑产生的数字:");
for(int i = 0;i < suiJiShu.length;i++){
System.out.print(suiJiShu[i] + " ");
}
// 2.猜数字(用户输入)
// 用户输入存在限制
/*
1.只能输入一个数字字符串
2.字符串中的字符不能重复
3.只能给4个字符(如果字符个数不等于4个,需要请用户重新输入)
PS:如果用户没有输入正确的话,不会进入比较环节
*/
// 输入器
Scanner input = new Scanner(System.in);
char[] inputChars;
// 步骤1:只要用户重新输入一次,输入的校验都需要再完成一次
// 重复去执行步骤1--循环语句块
while (true){
// 用户输入
System.out.println("请输入猜的数字:");
String inputNum = input.next();
// 字符串转字符数组
inputChars = inputNum.toCharArray();
// 输入信息的校验 保证数据安全
// 判断字符个数 如果不为4,请用户重新输入
// inputChars.length != 4 说明 输入有误,请用户重新输入
if(inputChars.length != 4){
System.out.println("用户输入字符不为4");
continue;
}
// 验证用户输入是否为数字字符
boolean isContinue = false;
for(int i = 0;i < inputChars.length;i++){
// 不满足数字字符要求48-57
if(inputChars[i] < 48 || inputChars[i] > 57){
// 输入有误 此时应该让用户重新输入
isContinue = true;
break;
}
}
if(isContinue){
System.out.println("输入数据,不为数字字符");
continue;
}
// 判断字符串是否重复
for(int i = 0;i < inputChars.length;i++){
for(int j = 0;j < i;j++){
if(inputChars[i] == inputChars[j]){
isContinue = true;
break;
}
}
}
if(isContinue == false){
System.out.println("用户输入的数据 是合法的");
break;
}
System.out.println("输入数据,数字字符重复");
// 3.用户猜的数字 和 电脑 出的数字对比,给出结果几A几B,如果结果不是4A0B,需要用户重新输入,知道4A0B为止
// 判断 用户输入的信息和电脑产生的随机数 给出结果
// 记录A 位置相同且数字相同的个数
int countA = 0;
// 记录B 位置不同但数字相同 的个数
int countB = 0;
for (int i = 0;i < suiJiShu.length;i++){
for (int j = 0;j < inputChars.length;j++){
if (suiJiShu[i] == inputChars.length - 48){
if (i == j){
countA++;
}else {
countB++;
}
}
}
}
String info = countA + "A" + countB + "B";
System.out.println(info);
if(info.equals("4A0B")){
System.out.println("成功");
break;
}else {
System.out.println("请重新猜数字");
}
}
}
}