计数器在程序中关闭

counter is off in program

我必须为我的class编写一个程序。

说明是

您的程序将随机选择一个 4 位数字作为密码。
您的程序必须提示用户输入一个 4 位数作为他们的猜测。
程序将回复一条消息,指出用户猜测的数字中有多少与密码中相同位置的数字相同。

例如,如果密码是3749,而用户的猜测是9753,那么程序会响应消息You matched 1,因为只有一个数字( 7) 在用户的猜测中与密码中相同位置的数字相同。

该程序将允许用户继续输入猜测,直到他们猜出正确的密码。
用户输入密码后,程序将输出用户为找到密码而进行的猜测总数。
然后程序会询问用户是否想再玩一次。如果用户回答“是”,程序将选择另一个随机的 4 位数字并继续播放上述内容。

    public static void main (String[] args)
    {
        Scanner input = new Scanner(System.in);
        Random random = new Random();
        
        System.out.println("----- MASTERMIND -----");
        System.out.println("Guess the 4 digit number!");
        

        boolean keepGoing = true;
        
        while (keepGoing = true)
        {
            String secretNumber = String.format("%04d", random.nextInt(10000));
            int guessCount = 0;
            int matchCount = 0;
            while (matchCount != 4)
            {
                System.out.println("Enter your guess: ");
                String userGuess = input.nextLine();
                guessCount++;
                if (userGuess.substring(0,1).equals(secretNumber.substring(0,1)));
                {
                    matchCount++;
                }
                if (userGuess.substring(1,2).equals(secretNumber.substring(1,2)));
                {
                    matchCount++;
                }
                if (userGuess.substring(2,3).equals(secretNumber.substring(2,3)));
                {
                    matchCount++;
                }
                if (userGuess.substring(3,4).equals(secretNumber.substring(3,4)));
                {
                    matchCount++;
                }
                System.out.println("You matched " + matchCount + " digit/digits.");
                if (userGuess.equals(secretNumber))
                {
                    System.out.println("Congratulations! You guessed the right number in " + guessCount + " guess/guesses.");
                    System.out.println("Would you like to play again? Enter Y for yes or N for no.");
                    String keepGoingYesOrNo = input.nextLine();
                    if (keepGoingYesOrNo.equals("N"));
                    {
                        keepGoing = false;
                    }
                }
            }
        
        }
    }

由于某些原因,即使数字不匹配,程序运行后 matchCount 始终为 4。
我认为 if 语句下的代码只会在条件为真时执行,但由于某种原因它仍然会运行它。

您的 if 语句后有分号,使它们无用。格式应该是这样的:

if (userGuess.substring(0,1).equals(secretNumber.substring(0,1))) {
    matchCount++;
} 

但也随着目前程序的编写,matchCount即使出现重复数字也会一直增加。因此,如果数字是 1234 并且用户猜测 2222 那么 2223 matchCount 将为二。我建议为 digit1digit2digit3digit4 设置 boolean 值。当猜到数字时,将值设置为 true。如果 digit[x] = false.

每个 if 块只有 运行

编辑:经过反复试验,我使程序尽可能可靠。以前,即使你重复相同的数字,matchCount 也会继续增加,所以为了防止这种情况,我实现了一些 boolean 值。

此外,如果一个数字被正确猜中,但在接下来的尝试中没有猜到,matchCount 将保持不变,所以我写了另一组 if 语句来减少这个事件中的 matchCount。我还修复了代码中的其他一些小问题,包括重播时重置 matchCount 以及在用户不想玩时成功结束程序。如果您有任何问题,请告诉我!这是最终代码。

public static void main (String[] args)
{
    Scanner input = new Scanner(System.in);
    Random random = new Random();
    
    System.out.println("----- MASTERMIND -----");
    System.out.println("Guess the 4 digit number!");
    

    boolean keepGoing = true;
    boolean digit1 = false;
    boolean digit2 = false;
    boolean digit3 = false;
    boolean digit4 = false;

    while (keepGoing = true)
    {
        String secretNumber = String.format("%04d", random.nextInt(10000));
        int guessCount = 0;
        int matchCount = 0;
        while (matchCount != 4 && keepGoing == true)
        {
            System.out.println("Enter your guess: ");
            System.out.println(secretNumber);
            String userGuess = input.nextLine();
            guessCount++;
            if (userGuess.substring(0,1).equals(secretNumber.substring(0,1)) && digit1 == false)
            { //if the first digit is correct and hasn't been guessed already, matchcount increases
                matchCount++;
                digit1 = true;
            } 
            if (!userGuess.substring(0,1).equals(secretNumber.substring(0,1)) && digit1 == true)
            { //if the first digit is incorrect but you previously guessed it, matchcount decreases and digit1 is set to false
                matchCount--;
                digit1 = false;
            }
            
            
            if (userGuess.substring(1,2).equals(secretNumber.substring(1,2)) && digit2 == false)
            {
                matchCount++;
                digit2 = true;
            }
            if (!userGuess.substring(1,2).equals(secretNumber.substring(1,2)) && digit2 == true)
            {
                matchCount--;
                digit2 = false;
            }
            
            
            if (userGuess.substring(2,3).equals(secretNumber.substring(2,3)) && digit3 == false)
            {
                matchCount++;
                digit3 = true;
            }
            if (!userGuess.substring(2,3).equals(secretNumber.substring(2,3)) && digit3 == true)
            {
                matchCount--;
                digit3 = false;
            }
            
            
            if (userGuess.substring(3,4).equals(secretNumber.substring(3,4)) && digit4 == false)
            {
                matchCount++;
                digit4 = true;
            } 
            if (!userGuess.substring(3,4).equals(secretNumber.substring(3,4)) && digit4 == true)
            {
                matchCount--;
                digit4 = false;
            }
            
            
            System.out.println("You matched " + matchCount + " digit/digits.");
            if (userGuess.equals(secretNumber))
            {
                System.out.println("Congratulations! You guessed the right number in " + guessCount + " guess/guesses.");
                System.out.println("Would you like to play again? Enter Y for yes or N for no.");
                String keepGoingYesOrNo = input.nextLine();
                if (keepGoingYesOrNo.equals("Y"))
                {
                    keepGoing = true;
                    matchCount=0;
                    guessCount=0;
                } else {
                    System.out.println("Thanks for playing!");
                    System.exit(0);
                }
            }
        }
    }
}

首先,我觉得你可以把代码改成这样,更容易维护,可读性更好

 public static void main (String[] args)
 {
    Scanner input = new Scanner(System.in);
    Random random = new Random();
    
    System.out.println("----- MASTERMIND -----");
    System.out.println("Guess the 4 digit number!");
    

    boolean keepGoing = true;
    
    while (keepGoing = true)
    {
        String secretNumber = String.format("%04d", 
        random.nextInt(10000));
        int guessCount = 0;
        int matchCount = 0;
        while (matchCount != 4)
        {
            matchCount = 0
            System.out.println("Enter your guess: ");
            String userGuess = input.nextLine();
            guessCount++;
            for(int i = 0 ; i < secretNumber.length() ; i++){
                if(secreetNumber.charAt[i] == userGuess.charAt[i])
                   matchCount++;
            }
            System.out.println("You matched " + matchCount + " 
            digit/digits.");
            if (userGuess.equals(secretNumber))
            {
                System.out.println("Congratulations! You guessed the 
                right 
                number in " + guessCount + " guess/guesses.");
                System.out.println("Would you like to play again? Enter 
                Y for yes or N for no.");
                String keepGoingYesOrNo = input.nextLine();
                if (keepGoingYesOrNo.equals("N"));
                {
                    keepGoing = false;
                }
            }
        }
    
    }
}

并在每次猜测后重置 matchCount

如果块为空

if 末尾的分号关闭它们,无论如何都会执行它们旁边的块。修复:

            if (userGuess.substring(0,1).equals(secretNumber.substring(0,1)))
            {
                matchCount++;
            }
            if (userGuess.substring(1,2).equals(secretNumber.substring(1,2)))
            {
                matchCount++;
            }
            if (userGuess.substring(2,3).equals(secretNumber.substring(2,3)))
            {
                matchCount++;
            }
            if (userGuess.substring(3,4).equals(secretNumber.substring(3,4)))
            {
                matchCount++;
            }

每次迭代时 matchCount 应为 0

如果您碰巧没有猜出完整数字,但至少有一个数字是正确的,那么 matchCount 将是一个严格的正数。由于您没有将其设置为 0,因此 matchCount 将以错误的方式运行。你需要重置它,比如

            if (userGuess.equals(secretNumber))
            {
                System.out.println("Congratulations! You guessed the right number in " + guessCount + " guess/guesses.");
                System.out.println("Would you like to play again? Enter Y for yes or N for no.");
                String keepGoingYesOrNo = input.nextLine();
                if (keepGoingYesOrNo.equals("N"));
                {
                    keepGoing = false;
                }
            }
            else
            {
                matchCount = 0;
            }