可以重复 if 语句吗?

Possible to repeat an if statement?

我正在尝试创建某种角色以更加熟悉 Java,因为我对它还很陌生。我希望用户能够选择一个名称,然后 select a class。对于 class selection,我使用扫描仪方法,这意味着用户必须正确拼写 class。

import static java.lang.System.out;
import java.util.Scanner;

public class FirstTestNew {

public static void main( String args[]) {

    Scanner nameInput = new Scanner(System.in);
    Scanner classInput = new Scanner(System.in);

    String Swordsman, Sorcerer, Elementalist, Assassin, Sharpshooter; // Classes
    int Level = 1;
    int Strength=1, Endurance=1, Vitality=1, Willpower=1, Luck=1, Intelligence=1; // Attributes
    int Health = Vitality*5*(Level*2); // HP = Vitality + Level
    int Mana = Willpower*10+(Level*2); // MP = Willpower + Level
    int Energy = Endurance*50+(Level*10); // NRG = Endurance + Level
    int PhysDmg = Strength*3+(Level*2); // Physical Damage
    int MagDmg = Willpower*3+(Level*2); // Magical Damage

    // Name selection
    out.println("Input your character name : ");
    String playerName = nameInput.nextLine();
    out.println("You are now to be known as "+playerName);

    // Class selection
    out.println("\nNow, what class would you like to play?\nSwordsman, Sorcerer, Elementalist, Assassin or Sharpshooter?");
    String playerClass = classInput.nextLine();

    if (playerClass.equals("Swordsman")){
        out.println("You chose to be a Swordsman!");}

    else if (playerClass.equals("Sorcerer")){
        out.println("You chose to be a Sorcerer!");}

    else if (playerClass.equals("Elementalist")){
        out.println("You chose to be an Elementalist!");}

    else if (playerClass.equals("Assassin")){
        out.println("You chose to be an Assassin!");}

    else if (playerClass.equals("Sharpshooter")){
        out.println("You chose to be a Sharpshooter!");}

    else {
        out.println("Make sure your spelling is correct.");}
    }
}        

所以,基本上,如果用户拼写 class 不同,我希望使用 'else',这样他们就会被告知他们的拼写错误,然后重复到if 语句,所以他们可以再试一次。这甚至可以做到吗?也许通过使用某种循环?

您可以通过两种方式完成: 第一种方法是在玩家每次拼错单词时调用的函数中选择 class。

另一种方法是创建一个 while 循环。只需创建一个值为 true 的变量,只要值为 true 就进行 while 循环,如果单词拼写正确则变量设置为 false。

使用这个模式:

boolean valid;
String playerClass = "";
do
{
    valid = true; // reset each time
    // Class selection
    out.println("\nNow, what class would you like to play?\nSwordsman, Sorcerer, Elementalist, Assassin or Sharpshooter?");
    playerClass = classInput.nextLine();

    if (playerClass.equals("Swordsman")){
        out.println("You chose to be a Swordsman!");}
    else if (playerClass.equals("Sorcerer")){
        out.println("You chose to be a Sorcerer!");}
    ...
    else {
        System.out.println("Make sure your spelling is correct.");
        valid = false;
    }
} while (!valid);

每次点击最后一个 else 时都会重复循环,因为它将设置 valid = false;。您也可以将其封装在一个函数中,这将是更好的编码实践。

替代方法

对于它的价值,您还可以使用 List<String> 选项和 contains 方法来测试有效输入来简化 if 语句。

为了更好的用户体验,我也会考虑向他们询问一个选项编号而不是一个词,如果你必须要一个词然后使用 classInput.nextLine().trim().toLowerCase() 并与所有小写的词进行比较以减少出现空格和大小写错误的几率。

final String allOptions = "Swordsman,Sorcerer,Elementalist,Assassin,Sharpshooter";
List<String> options = Arrays.asList(allOptions.split(","));
//  construct the display message
String msg = "\nNow, what class would you like to play?\n";
// in general use a StringBuilder for this. += used for brevity only
for (int i = 0; i < options.size(); i++) msg += options.get(i) + ", ";
msg += options.get(options.size() - 1) + "?";

现在你的循环就这么简单了:

boolean valid = false; 
String playerClass = "";
while (!valid)
{
    // Class selection
    out.println(msg);
    playerClass = classInput.nextLine();
    valid = options.contains(playerClass);
    if (!valid)
        System.out.println("Make sure your spelling is correct.");
}
out.println("You chose to be a " + playerClass + "!");

您可以使用 do-while 循环:

boolean isSpelledCorrecly = true;
do {
   // get input
   ...
   else {
      out.println("Make sure your spelling is correct.");
      isSpelledCorrecly = false;
   }     
}
while(!isSpelledCorrecly)

最好将该逻辑移动到一个单独的方法中,并使用重复结构在无效输入时回调它

例如

//your logic
while(isValidClass());
//your other logic


public boolean isValidClass(){
    String playerClass = classInput.nextLine();
    boolean isValid = true;
    if (playerClass.equals("Swordsman")){
       out.println("You chose to be a Swordsman!");}
    else if (playerClass.equals("Sorcerer")){
        out.println("You chose to be a Sorcerer!");}
    else if (playerClass.equals("Elementalist")){
        out.println("You chose to be an Elementalist!");}
    else if (playerClass.equals("Assassin")){
        out.println("You chose to be an Assassin!");}
    else if (playerClass.equals("Sharpshooter")){
        out.println("You chose to be a Sharpshooter!");}
    else {
        out.println("Make sure your spelling is correct.");
        isValid = false;
    }
    return isValid;
}

do-while 循环似乎是对您的代码段的一个很好的回答。控制循环的一种简单方法是定义一个布尔值:

boolean loop=true;
//everything else that goes into your code
//...
//println where you requesto to enter the class name
do{
String playerClass = classInput.nextLine();
if (playerClass.equals("Swordsman")){
    out.println("You chose to be a Swordsman!");
    loop=false;}

else if (playerClass.equals("Sorcerer")){
    out.println("You chose to be a Sorcerer!");
    loop=false;}

else if (playerClass.equals("Elementalist")){
    out.println("You chose to be an Elementalist!");
    loop=false;}

else if (playerClass.equals("Assassin")){
    out.println("You chose to be an Assassin!");
    loop=false;}

else if (playerClass.equals("Sharpshooter")){
    out.println("You chose to be a Sharpshooter!");
    loop=false;}

else {
    out.println("Make sure your spelling is correct.");
    }
    }while(loop);

这应该可以解决问题...

boolean incomplete = true;

while (incomplete) {
    // Class selection
    out.println("\nNow, what class would you like to play?\nSwordsman, Sorcerer, Elementalist, Assassin or Sharpshooter?");
    String playerClass = classInput.nextLine();
    switch (playerClass) {
        case "Swordsman":
            out.println("You chose to be a Swordsman!");
            incomplete = false;
            break;
        case "Sorcerer":
            out.println("You chose to be a Sorcerer!");
            incomplete = false;
            break;
        case "Elementalist":
            out.println("You chose to be an Elementalist!");
            incomplete = false;
            break;
        case "Assassin":
            out.println("You chose to be an Assassin!");
            incomplete = false;
            break;
        case "Sharpshooter":
            out.println("You chose to be a Sharpshooter!");
            incomplete = false;
            break;
        default:
            out.println("Make sure your spelling is correct.");
    }
}