import java.util.*;
public class ComputerGuessNumberGame {
private static final int DIGITS = 4;
private static final int MIN_NUMBER = 1000;
private static final int MAX_NUMBER = 9999;
private static Scanner scanner = new Scanner(System.in);
public static void main(String[] args) {
System.out.println("===== 四位数字猜谜游戏 =====");
System.out.println("规则:");
System.out.println("1. 在心中想一个" + DIGITS + "位数字(数字不重复)");
System.out.println("2. 电脑会尝试猜测这个数字");
System.out.println("3. 每次猜测后,请根据以下规则提供反馈:");
System.out.println(" a) 正确数字的数量(不考虑位置)");
System.out.println(" b) 正确位置的数量");
System.out.println("=================================");
List<Integer> candidates = initializeCandidates();
int attempts = 0;
while (!candidates.isEmpty()) {
int guess = getComputerGuess(candidates, attempts);
attempts++;
System.out.println("\n电脑第 " + attempts + " 次猜测: " + formatGuess(guess));
int correctNumbers = getValidInput("请输入正确数字的数量(0-4): ", 0, 4);
int correctPositions = getValidInput("请输入正确位置的数量(0-" + correctNumbers + "): ", 0, correctNumbers);
if (correctPositions == DIGITS) {
System.out.println("\n电脑成功猜中!答案确实是 " + formatGuess(guess));
System.out.println("总共尝试次数: " + attempts);
return;
}
filterCandidates(candidates, guess, correctNumbers, correctPositions);
System.out.println("剩余可能数字数量: " + candidates.size());
if (candidates.size() == 1) {
System.out.println("\n电脑确定答案是: " + formatGuess(candidates.get(0)));
System.out.println("总共尝试次数: " + (attempts + 1));
return;
}
}
System.out.println("根据反馈无法找到有效数字,请检查反馈是否正确!");
}
private static List<Integer> initializeCandidates() {
List<Integer> numbers = new ArrayList<>();
for (int num = MIN_NUMBER; num <= MAX_NUMBER; num++) {
if (isValidNumber(num)) {
numbers.add(num);
}
}
return numbers;
}
private static boolean isValidNumber(int number) {
if (number < MIN_NUMBER || number > MAX_NUMBER) return false;
boolean[] digits = new boolean[10];
int temp = number;
for (int i = 0; i < DIGITS; i++) {
int digit = temp % 10;
if (digits[digit]) return false;
digits[digit] = true;
temp /= 10;
}
return true;
}
private static int getComputerGuess(List<Integer> candidates, int attempt) {
if (attempt == 0) return 1234;
return candidates.get(candidates.size() / 2);
}
private static void filterCandidates(List<Integer> candidates,
int guess,
int targetNumbers,
int targetPositions) {
candidates.removeIf(num -> !matchFeedback(num, guess, targetNumbers, targetPositions));
}
private static boolean matchFeedback(int number, int guess,
int targetNumbers, int targetPositions) {
int[] guessDigits = splitDigits(guess);
int[] numDigits = splitDigits(number);
int correctPositions = 0;
for (int i = 0; i < DIGITS; i++) {
if (guessDigits[i] == numDigits[i]) correctPositions++;
}
int correctNumbers = 0;
boolean[] used = new boolean[DIGITS];
for (int g : guessDigits) {
for (int j = 0; j < DIGITS; j++) {
if (!used[j] && g == numDigits[j]) {
used[j] = true;
correctNumbers++;
break;
}
}
}
return correctNumbers == targetNumbers && correctPositions == targetPositions;
}
private static int[] splitDigits(int number) {
int[] digits = new int[DIGITS];
int temp = number;
for (int i = DIGITS-1; i >= 0; i--) {
digits[i] = temp % 10;
temp /= 10;
}
return digits;
}
private static int getValidInput(String prompt, int min, int max) {
while (true) {
System.out.print(prompt);
try {
int input = Integer.parseInt(scanner.nextLine());
if (input >= min && input <= max) return input;
System.out.println("输入必须在" + min + "-" + max + "之间!");
} catch (NumberFormatException e) {
System.out.println("请输入有效数字!");
}
}
}
private static String formatGuess(int number) {
return String.format("[%04d]", number);
}
}