繁体   English   中英

JAVA号码猜谜游戏使用方法:再次玩的方法无法正常工作

[英]JAVA number guessing game using methods: method for play again does not work properly

我是JAVA的新手,并编写了一个程序来计算人类用户在1到100之间选择的数字。

该程序通过猜测上下限的中点以及用户的响应程度更高或更低来运行,直到猜出正确的数字为止。 但是,当程序询问您是否要再次播放时? (y / n):输入的字符不正确。 无论输入什么字符,程序都将再次运行,并且不会在输入“ n”时终止。

任何帮助将不胜感激。 谢谢!

import java.util.Scanner;

public class NumberGuesser 
{

    public static void main(String[] args)
    {
        do
        {
            playOneGame();
        }
        while(shouldPlayAgain());
    }

    //method for complete guessing number game between 1 and 100
    public static void playOneGame()
    {
        //initial lower range to 0 and upper range to 100
        int lowerBound = 0;
        int upperBound = 100;

        //Display message for user to guess a nummber
        System.out.println("Guess a number between 1 and 100.");

        //declare variables for program's number guess and user's response if number is higher or lower
        int guess;
        char userResponse;

        do //do while loop to make number guesses until correct number is found
        {
            //call method to guess midpoint number
            guess = Midpoint(lowerBound,upperBound);

            // call method to get response from user if number is high low or correct
            userResponse = getUserResponseToGuess(guess);

            //decision structure if-else statements to set new lower/upper bounds after every iteration 
            if (userResponse == 'h' || userResponse == 'H')
            {
                lowerBound = guess;
            }else if (userResponse == 'l' || userResponse == 'L')
            {
                upperBound = guess;
            }else if (userResponse == 'c' || userResponse == 'C')
            {
                shouldPlayAgain();
                playOneGame();
            }

        }while(userResponse != 'c' || userResponse != 'C');

    }

    //method to ask and allow user if they would like to play the game again
    public static boolean shouldPlayAgain()
    {
        //Prompt User if they would like to play again
        System.out.print("Great! Would you like to play again? (y/n): ");

        //Read in a character
        Scanner input = new Scanner(System.in);
        char value = input.next().charAt(0);

        //if true return y char
        return value == 'y' || value == 'Y';
    }

    //method to get response from user for computer to guess if number is high, low, or correct
    public static char getUserResponseToGuess(int guess)
    {
        //char response = guess;
        Scanner input = new Scanner(System.in);

        //declare local variable for user's response
        char response;

        do
        {
            //print out message with guess number and take input of h/l/c
            System.out.print("Is the number " + guess + "? (h/l/c): ");

            //Read in character
            response = input.next().charAt(0);

        }while(response != 'h' && response != 'l' && response != 'c'); //display guess and get user input while input does not equal h/l/c

        return response;
    }

    //method to find the midpoint from two integers. take smaller number if 2 to return with 2 integers
    public static int Midpoint(int low, int high)
    {
        int midpoint; //midpoint is a local variable

        midpoint = (high+low)/2; //compute midpoint between upper and lower bounds

        return midpoint;
    }
}

问题在这里:

        }else if (userResponse == 'c' || userResponse == 'C')
        {
            shouldPlayAgain();
            playOneGame();
        }

您问玩家是否要再进行一轮,然后...对此不执行任何操作,无论如何都要进行另一轮。 尝试这个:

        {
            if(shouldPlayAgain()){
                playOneGame();
            }
        }

您可以不使用返回值而调用shouldPlayAgain()

         if (shouldPlayAgain()){
            playOneGame();
          }

在编写此代码时,您正在迭代且没有退出条件:

else if (userResponse == 'c' || userResponse == 'C')
            {
                shouldPlayAgain();
                playOneGame();

            }

你可以写:

else if (userResponse == 'c' || userResponse == 'C') { break; }

然后将控件返回到主循环。

问候,

尝试运行以下代码。 我试图调制您的代码,其中包括条件改善和循环删除。

package test;

import java.util.Scanner;

public class NumberGuesser 
{

    public static void main(String[] args)
    {
/*Reduntant loop removal by codechef*/        
//        do
//        {
            playOneGame();
//        }
//        while(/*shouldPlayAgain()*/false);
    }

    //method for complete guessing number game between 1 and 100
    public static void playOneGame()
    {
        //initial lower range to 0 and upper range to 100
        int lowerBound = 0;
        int upperBound = 100;

        //Display message for user to guess a nummber
        System.out.println("Guess a number between 1 and 100.");

        //declare variables for program's number guess and user's response if number is higher or lower
        int guess;
        char userResponse;
         boolean temp = true;
         one :do //do while loop to make number guesses until correct number is found
        {
            //call method to guess midpoint number
            guess = Midpoint(lowerBound,upperBound);

            // call method to get response from user if number is high low or correct
            userResponse = getUserResponseToGuess(guess);

            //decision structure if-else statements to set new lower/upper bounds after every iteration 
            if (userResponse == 'h' || userResponse == 'H')
            {
                lowerBound = guess;
            }else if (userResponse == 'l' || userResponse == 'L')
            {
                upperBound = guess;
            }else if (userResponse == 'c' || userResponse == 'C')
            {
                /* Block restructured by codechef */
                temp = shouldPlayAgain();
                if(temp)
                {
                    System.out.println("TEMP : "+temp);
                    //playOneGame();
                    continue one;
                }else{
                    System.out.println("Breaking Loop");
                    break one;
                }
            }
            /*condition restructured by codechef*/
        }while((userResponse != 'c' || userResponse != 'C' )&& temp);

    }

    //method to ask and allow user if they would like to play the game again
    public static boolean shouldPlayAgain()
    {
        //Prompt User if they would like to play again
        System.out.print("Great! Would you like to play again? (y/n): ");

        //Read in a character
        Scanner input = new Scanner(System.in);
        char value = input.next().charAt(0);

        //if true return y char
        /* statement restructured by codechef */
        return (value=='y'||value=='Y')?true:false;
    }

    //method to get response from user for computer to guess if number is high, low, or correct
    public static char getUserResponseToGuess(int guess)
    {
        //char response = guess;
        Scanner input = new Scanner(System.in);

        //declare local variable for user's response
        char response;
/* Reduntant While loop removal by codechef*/
//        do
//        {
            //print out message with guess number and take input of h/l/c
            System.out.print("Is the number " + guess + "? (h/l/c): ");

            //Read in character
            response = input.next().charAt(0);
            System.out.println("RESONSE : "+response);
//        }while(response != 'h' && response != 'l' && response != 'c'); //display guess and get user input while input does not equal h/l/c

        return response;
    }

    //method to find the midpoint from two integers. take smaller number if 2 to return with 2 integers
    public static int Midpoint(int low, int high)
    {
        int midpoint; //midpoint is a local variable

        midpoint = (high+low)/2; //compute midpoint between upper and lower bounds

        return midpoint;
    }
}

输出: -

跑:

猜一个介于1到100之间的数字。

是50吗? (h / l / c):l

回应:l

是25吗? (h / l / c):c

响应:c

大! 您想再玩一次吗? (y / n):y

TEMP:真

是25吗? (h / l / c):c

响应:c

大! 您想再玩一次吗? (y / n):n

断环

对于更改,请阅读添加的注释。 希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM