编辑代码

import java.util.*;

public class number_guess_4digit_unique {
    
    public static void main(String[] args) {
        
        Scanner in = new Scanner(System.in);
        int number = generateUnique4DigitNumber();  // 生成不重复的1000-9999之间的随机数
        
        System.out.print("这是一个四位数的猜数字游戏(每位数字不重复),请输入一个1000-9999的四位数字: ");
        int guess = getGuess(in); // 用getGuess()获取值来实现无效输入的过滤
        int numGuesses = 1;
        
        while (guess != number) {
            // 检查用户输入的数字是否有重复数字
            while (hasDuplicateDigits(guess)) {
                System.out.println("您输入的数字有重复数字,请重新输入一个每位数字都不相同的四位数字: ");
                guess = getGuess(in);
            }
            
            int[] matchResults = matches(number, guess);
            System.out.println("猜错啦,您的答案中有"+matchResults[0]+"个数字与正确答案相符");
            System.out.println("其中有"+matchResults[1]+"个数字位置正确");
            System.out.print("请重新输入一个1000-9999的四位数字(每位数字不重复): ");
            guess = getGuess(in);
            numGuesses++;
        }
        System.out.println("回答正确,共回答"+numGuesses+"次");
    }
    
    // 生成不重复数字的4位数
    public static int generateUnique4DigitNumber() {
        Random rand = new Random();
        int number;
        do {
            number = 1000 + rand.nextInt(9000);  // 生成1000-9999之间的随机数
        } while (hasDuplicateDigits(number));  // 确保数字不重复
        return number;
    }
    
    // 检查数字是否有重复的数字
    public static boolean hasDuplicateDigits(int number) {
        int[] digits = {
            number / 1000,        // 千位
            (number / 100) % 10,  // 百位
            (number / 10) % 10,  // 十位
            number % 10           // 个位
        };
        
        for (int i = 0; i < 3; i++) {
            for (int j = i + 1; j < 4; j++) {
                if (digits[i] == digits[j]) {
                    return true;
                }
            }
        }
        return false;
    }
    
    // 处理数字匹配逻辑
    public static int[] matches(int number, int guess) {
        int numMatches = 0;
        int correctPositions = 0;
        
        // 将数字转换为数组以便比较
        int[] numberDigits = {
            number / 1000,        // 千位
            (number / 100) % 10,  // 百位
            (number / 10) % 10,  // 十位
            number % 10           // 个位
        };
        
        int[] guessDigits = {
            guess / 1000,
            (guess / 100) % 10,
            (guess / 10) % 10,
            guess % 10
        };
        
        boolean[] numberMatched = new boolean[4];
        boolean[] guessMatched = new boolean[4];
        
        // 先检查位置正确的数字
        for (int i = 0; i < 4; i++) {
            if (guessDigits[i] == numberDigits[i]) {
                correctPositions++;
                numberMatched[i] = true;
                guessMatched[i] = true;
                numMatches++;
            }
        }
        
        // 再检查数字正确但位置不对的情况
        for (int i = 0; i < 4; i++) {
            if (!guessMatched[i]) {
                for (int j = 0; j < 4; j++) {
                    if (!numberMatched[j] && guessDigits[i] == numberDigits[j]) {
                        numMatches++;
                        numberMatched[j] = true;
                        break;
                    }
                }
            }
        }
        
        return new int[]{numMatches, correctPositions};
    }
    
    public static int getGuess(Scanner in) {
        int guess = getInt(in, "请输入一个1000-9999的四位数字: ");
        while(guess < 1000 || guess > 9999) {
            System.out.println("您输入的数字不在范围内,请重新输入。");
            guess = getInt(in, "请输入一个1000-9999的四位数字: ");
        }
        return guess;        
    }
    
    public static int getInt(Scanner in, String prompt) {
        System.out.print(prompt);
        while(!in.hasNextInt()) {
            in.next();
            System.out.println("您输入的不是数字,请重新输入。");
            System.out.print(prompt);
        }
        return in.nextInt();
    }
}