每当用户键入“ no”时,我将如何循环运行此代码

时间:2019-05-15 21:39:58

标签: java

我正在编写基于文本的冒险,并且在运行类系统时遇到问题。我已经设置了一个案例来运行将运行方法的代码块,但是在没有用户输入的情况下,案例和方法都运行了不止一次,并且在用户输入后也不会停止运行。

我尝试了一个for循环,一个while循环,一个do / while循环,但是没有任何效果。我有一个理论,我需要在方法运行后实施大小写更改,但是我不知道如何在不自行更改大小写的情况下执行此操作。

是这种情况-

case "1.5":

    System.out.println("\nNow, before we start you need to choose a class. Each one will offer diffrent benefits.");
    classes();
    break;

这是方法-

public static void classes() { //Class Method
    counter = 0;

    for (int a = 1; a <= Class.length; a++) { //Run the class array
        System.out.println("[" + counter + "]- " + Class[counter]); //displays the class array
        counter++;
    }


    do {
        System.out.println("What would you like to be."); //ask for input
        user = in .nextLine();

        if (user.equals("0")) { //if input is this then ...
            System.out.println("\nYour health will be increased by 1 permanently." +
                "Are you sure you want to be a Farmer?");
            user = in .nextLine();
        }

        if (user.equals("1")) { //if input is this then...
            System.out.println("\nYou will have a dagger." +
                "Are you sure you want to be a Wanderer?");
            user = in .nextLine();
        }

        if (user.equals("2")) { 
            System.out.println("\nYou will have 1 health potion. Drink it to regain 3 HP." +
                "Are you sure you want to be a Trader?");
            user = in .nextLine();
        }

        if (user.equals("3")) {
            System.out.println("You are just a normal human. You get nothing." +
                "Are you sure you want to be nothing?");
            user = in .nextLine();
        }

    } while(user.equalsIgnoreCase("no")); //runs while user types no

}

我希望该方法可以运行一次,输出就是用户想要的结果。

1 个答案:

答案 0 :(得分:0)

  

“我希望该方法运行一次,并且输出将是用户所希望的   希望它。”

如果您真正想要的是,基本上这就是代码的作用:

  

“我希望该方法运行一次,并且输出将是用户所希望的   希望他或她输入”。

如果用户在 classes()方法中输入作为选择,则要求用户选择另一个类,直到他或她对该选择感到满意为止。我相信这不是目的吗?

我认为您的问题是,当用户确实选择了“类别”时,它停留在 classes() 方法内。我相信您真正想做的是返回该选择并在 classes() 方法最初被调用的那一刻之后使用 以更深入地进行游戏。

为此,您将需要您的 classes()方法来返回内容,最好是选择的Class。由于字符串数组中包含不同的类(等级):

static String[] Class = {"Farmer", "Wanderer", "Trader", "Nothing"};

classes() 方法返回的所有内容就是所选Class的实际索引值。当然,您可以让另一个Class Member变量保留Users选项。...也许是一个名为 userClass 的变量。在开始讨论之前,我想至少提出两个建议:

不命名变量 Class 。您可以这样做,但对我(我敢肯定还有很多其他人)来说,这很令人困惑,并不是一个好主意,因为 class 本身就是Java Keyword。作为建议,也许将其更改为:排名

给出变量和方法名称的含义,以便可以轻松理解变量可能包含的内容或方法的作用,例如: getRank()

// Class Member Variables
static Scanner keyBoardInput = new Scanner(System.in);
static String userInput;
static String userClass = ""; 
static String[] RANKS = {"Farmer", "Wanderer", "Trader", "Nothing"};
static String LS = System.lineSeparator();

public static void main(String args[]) {
    System.out.println("\nNow, before we start you need to choose a class." + LS
                     + "Each Class will offer diffrent benefits.");
    int rank = getRank();
    userClass = RANKS[rank];
    System.out.println("Your chosen Class is:  " + userClass);
}

public static int getRank() {
    int maxRank = (RANKS.length - 1);
    // Displays the RANKS array
    for (int a = 0; a < RANKS.length; a++) { 
        System.out.println("[" + a + "]- " + RANKS[a]); 
    }

    // Allow User to select a Rank
    int rank = -1;
    do {
        System.out.println("What would you like to be? (0 to " + maxRank + 
                           " or q to quit)"); //ask for input
        userInput = keyBoardInput.nextLine();

        // Quit game if desired.
        if (userInput.equalsIgnoreCase("q")) {
            System.out.println(LS + "Thanks for playing...Bye Bye.");
            System.exit(0);
        }

        // Make sure a valid numerical value was supplied!
        if (!userInput.matches("\\d") || Integer.parseInt(userInput) < 0 || 
                               Integer.parseInt(userInput) > maxRank) {
            System.out.println("Invalid input! You can only supply a value "
                             + "from 0 to " + maxRank); 
            userInput = "no";
            continue;
        }
        rank = Integer.parseInt(userInput); // Store for for array index use and returning
        String message = "";

        // Farmer (0)
        switch (rank) {
            case 0:
                message = LS + "Your health will be increased by 1 permanently.";
                break;
            case 1:
                //if input is this then...
                message = LS + "You will have a dagger.";
                break;
            case 2:
                message = LS + "You will have 1 health potion. Drink it to regain 3 HP.";
                break;
            case 3:
                message = LS + "You are just a normal human. You get nothing.";
                break;
            default:
                break;
        }

        System.out.println(message);
        System.out.println("Are you sure you want to be " + RANKS[rank] + "?");
        userInput = keyBoardInput.nextLine();

    } while (userInput.equalsIgnoreCase("no")); //loops while user types no

    return rank;  // Return the index value for the chosen Rank. 
}

是否注意到变量名称和 getRank()方法名称?遵循代码并了解正在发生的事情要容易得多。不,我个人并不真正关心静态变量和方法。静态的确实占有一席之地,但是我宁愿运行比这更紧密的代码。

您还将注意到上述代码中的其他更改。特别是, for 循环用于显示“类别”菜单选项:

[0]- Farmer
[1]- Wanderer
[2]- Trader
[3]- Nothing  

您使用名为 counter 的变量并将其用于索引。这正是您的 for 循环的用途。您可以摆脱 counter 变量,而只需利用在 for 循环本身中声明的 a 变量即可。

请注意如何使用 switch / case 块。它如何减少代码。您还将注意到, getRank()方法返回用户选择的类的索引值。当从 main()方法调用时, getRank()方法返回Class索引值,然后将所选的Class放入成员变量 userClass 中。现在,您可以在代码中的任何地方使用它了。是的,您也可以直接在 getRank()方法中设置 userClass 变量。