编辑代码

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

    // 验证数字有效性(4位且无重复数字)
    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);
    }
}