1. 问题描述:
编写一个人机猜数游戏,游戏玩法如下:
由计算机“想”一个四位数,请人猜这个四位数是多少。人输入四位数字后,计算机首先判断这四位数字中有几位是猜对了,并且在对的数字中又有几位位置也是对的,将结果显示出来,给人以提示,请人再猜,直到人猜出计算机所想的四位数是多少为止。
例如:计算机“想”了一个“1234”请人猜,可能的提示如下:
人猜的整数 计算机判断有几个数字正确 有几个位置正确
1122 2 1
3344 2 1
3312 3 0
4123 4 0
1243 4 2
1234 4 4
游戏结束
0<=rand<=32766 0<=rand/32767<1 0<=8999*rand/32767<=8999
1334
1122 1 1
3344 3 1
3312 3 1
4123 3 0
1243 3 2
1334 4 4
2. 思路分析:
① 首先要产生一个四位的随机数字,那么范围应该是1000~9999,生成x到y之间的随机数字可以使用:
nextInt(y - x + 1) + x
② 判断有几位数字是猜对的,我们可以先对随机产生的四位数转化为字符串然后取出来每一位字符使用字符数组存起来,然后对于我们自己输入的数字也转化为字符串然后使用双层循环来遍历进行字符的比对,这里需要使用一个额外的数组来记录之前的那个位置上是否已经被访问过,因为我们知道假如我们输入的数字中具有相同的位那么没有进行标记的话会导致重复进行计算这样结果就不正确了
③ 判断有几个位置是猜对的,可以使用一层循环进行逐个字符的比较,所以来说将数字转化为字符串取出某一位的时候非常方便对其进行操作
3. 代码如下:
import java.util.Random;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Random rm = new Random();
//生成随机的四位数字
int n = rm.nextInt(9000) + 1000;
System.out.println(n);
String s = Integer.toString(n);
char arr[] = new char[4];
for(int i = 0; i < 4; i++){
arr[i] = s.charAt(i);
}
while(true){
//使用一个辅助数组来进行标记是否之前已经比较过
int helper[] = new int[4];
int count = 0;
String t = Integer.toString(sc.nextInt());
int position = 0;
for(int i = 0; i < 4; i++){
for(int j = 0; j < 4; j++){
if(arr[j] == t.charAt(i) && helper[j] == 0){
helper[j] = 1;
count++;
break;
}
}
}
for(int i = 0; i < 4; i++){
if(arr[i] == t.charAt(i)){
position++;
}
}
if(count == 4 && position == 4){
System.out.println("游戏结束");
break;
}
System.out.println(count + " " + position);
}
sc.close();
}
}