当前位置: 首页 > 知识库问答 >
问题:

Java——如何在while循环中包含switch语句菜单

黄毅
2023-03-14

我有一个主菜单类,它从用户那里获得一个选项,然后使用该选项从与菜单选项相关的switch语句中选择其他类。我的代码是:

public static void main(String[] args) {
    int dieOne = 0;
    int dieTwo = 0;
    int choice = 0;

    DiceMaker dice = new DiceMaker(); // class that creates the dice
    RollDice roll = new RollDice(); // class that imitates roll
    DiceMenu menu = new DiceMenu();
    DiceRoller series = new DiceRoller();

    System.out.println("Welcome to the Dice Roll Stats Calculator!\n");
    while (choice != 4) {
        menu.DiceMenu();
        choice = menu.getUserChoice();

        switch (choice) {
        case 1:
            dice.diceMaker();
            dieOne = dice.DieOne();
            dieTwo = dice.DieTwo();
            System.out.println(dice.DieOne() + dice.DieTwo());
            return;
        case 2:
            roll.rollDice(dieOne, dieTwo);
            roll.displayRoll();
            return;
        case 3:
            series.diceRoller();
            series.displayResults();
            return;
        case 4:
            break;
        }// switch (choice)

    } // while (choice != 4)
}

例如“Exit”选项,所以我把switch语句放在一个while循环中,布尔条件不等于4,这样当选项设置为4时,循环就会停止。正确的情况下执行,但我的问题是,循环,因此程序停止后,我尝试每个情况,即使选择不是4。我尝试在案例1、2和3之后使用break语句,当我这样做时,它会在无限循环中重复这个案例。我试着在自己的伤口上弄清楚这一点,但我永远找不到任何与我所看到的相似的东西,足以让我弄清楚问题出在哪里。我猜这可能不是未来制作菜单的最佳方式。提前谢谢。

我剩下的代码如下。请注意,DiceRoller类仍在构建中,但DiceMaker和RollDice类似乎正在工作。

DiceMenu类:

public class DiceMenu 
{
    public static final int CHOICE_UNKNOWN = 0;
    public static final int CHOICE_MAKE_DICE = 1;
    public static final int CHOICE_ROLL_ONCE = 2;
    public static final int CHOICE_SERIES_ROLL = 3;
    public static final int CHOICE_QUIT = 4;

    private int choice = 0;
    Scanner scan = new Scanner(System.in);

    public int DiceMenu()
    {

        while ( this.choice < 1 || this.choice > 4 ) // while loop keeps choices in range
        {   
            System.out.println("         MAIN MENU\n");
            System.out.println("1. Create Your Dice");
            System.out.println("2. Roll Your Dice");
            System.out.println("3. Perform A Series Of Rolls And Show Stats");
            System.out.println("4. Exit\n");

            try // avoid invalid input 
            { 
                System.out.print("Please choose an option: ");
                this.choice = scan.nextInt(); // get number of sides from user
            } 
            catch (InputMismatchException e) 
            {
            //if input is invalid, returns to beginning of loop    
            System.out.println("Invalid Input. Please try again.\n");
            scan.next();
            continue;   
            }

            if ( this.choice < 1 || this.choice > 4 ) // if input is out of range
                                     // notify user before continuing
            {
                System.out.println("Choice must reflect menu options. (1-4)"
                             + " Please try again.\n");
                this.choice = 0;
            }

        }//while ( this.choice < 1 || this.choice > 4 )                 
        return 0;
    }        
    public int getUserChoice()
    {
        return this.choice;
    }       
}

RollDice类:

public class RollDice 
{
    private int roll;
    private int rollOne;
    private int rollTwo;
    private int rollTotal;

    public int rollDice (int dieOne, int dieTwo) 
    {
        this.rollOne = 1 + (int)(Math.random() * dieOne);
        this.rollTwo = 1 + (int)(Math.random() * dieTwo);
        this.rollTotal = this.rollOne + this.rollTwo;
        return 0;
    }

    public void displayRoll()
    {
        System.out.println("You roll a " + rollOne + " and a "
                       + rollTwo + " for a total of " + 
                       rollTotal + "!"); //display separate and total 
                                         //roll amounts

        if ( rollTotal == 2 ) // if/else tests for special rolls
        {
            System.out.println("Snake Eyes!");
        } 
        else if ( rollTotal == 7 )
        {
            System.out.println("Craps!");
        }
        else if ( rollOne == 6 && rollTwo == 6 )
        {
            System.out.println("Boxcars!");
        }
    }
}// public class DiceRoller

DiceMaker类:公共类DiceMaker{private int sides=0;private int dieOne;private int dieTwo;

    public int diceMaker() 
    {
        while ( sides < 4 || sides > 20 ) // while loop keeps sides within        range
        {
            Scanner scan = new Scanner(System.in);

            try // avoid invalid input 
            { 
                System.out.print("Please enter the number of sides each die "
                +            "should have (must be between 4 and 20): ");
                this.sides = scan.nextInt(); // get number of sides from user
            } 
            catch (InputMismatchException e) 
            {
            //if input is invalid, returns to beginning of loop    
            System.out.println("Invalid Input. Please try again.\n");
            scan.next();
            continue;   
            }
            if (sides < 4 || sides > 20) // if input is out of range
                                     // notify user before continuing
            {
                System.out.println("Die must have between 4 and 20 sides."
                             + " Please try again.\n");
            }
        }//while ( sides < 4 || sides > 20 )                    

        this.dieOne = sides;
        this.dieTwo = sides;
        return 0;
    }

    public int DieOne()
    {
        return this.dieOne;
    }

    public int DieTwo()
    {
        return this.dieTwo;
    }


}// public class DiceMaker 

共有1个答案

禄源
2023-03-14

从案例1、2和3中删除返回的。如果从main返回,程序将终止。你想循环,所以不要这样做。然而,正如@ajb在下面的评论中所指出的,你不希望这个案子失败。所以你需要中断。

case 1: dice.diceMaker();
        dieOne = dice.DieOne();
        dieTwo = dice.DieTwo();
        System.out.println(dieOne + dieTwo);
        // return;
        break; // <-- applies to innermost block (switch).
case 2: roll.rollDice(dieOne, dieTwo);
        roll.displayRoll();
        // return;
        break; // <-- applies to innermost block (switch).
case 3: series.diceRoller();
        series.displayResults();
        // return;
        break; // <-- applies to innermost block (switch).

此外,您还可以使用continue(此处将应用于最里面的循环)。最后,记住案例4终止循环(因为choice4),因此您不需要案例4

 类似资料:
  • 问题内容: 我有一个作业来实现一个简单的测试应用程序,下面是我当前的代码: 我现在想做的是,当按下时,这意味着用户想要退出测试,然后我中断了并打印,但是那样行不通,我知道原因可能是中断了,我怎样才能让它打破呢? 问题答案: 你可以while循环,并在,这应该是这样的: 而且可以是你想要的任何字,例如。

  • Python 中,while 循环和 if 条件分支语句类似,即在条件(表达式)为真的情况下,会执行相应的代码块。不同之处在于,只要条件为真,while 就会一直重复执行那段代码块。 while 语句的语法格式如下: while 条件表达式:     代码块 这里的代码块,指的是缩进格式相同的多行代码,不过在循环结构中,它又称为 循环体。 while 语句执行的具体流程为:首先判断条件表达式的值,

  • 本文向大家介绍MySQL循环语句之while循环测试,包括了MySQL循环语句之while循环测试的使用技巧和注意事项,需要的朋友参考一下 mysql 操作同样有循环语句操作,网上说有3中标准的循环方式: while 循环 、 loop 循环和repeat循环。还有一种非标准的循环: goto。 鉴于goto 语句的跳跃性会造成使用的的思维混乱,所以不建议使用。 这几个循环语句的格式如下: WHI

  • 我正在为学校做一个简单的Java计算器,效果很好。但是,我需要添加一个while循环,询问用户是否要继续是/否。不过,我不知道应该将while语句放在哪里。我试着把if语句放在上面,我试着把它放在下面,然后把它添加到每个if和else if语句中,但仍然无法让它工作。在if和else-if语句中,应该在哪里放置while循环,以获得运行while循环的所有选项?

  • 我目前正在处理Eclipse中的一些Java代码,并试图在do-time语句中使用try捕获语句。我目前的代码如下: 当我输入任何数字时,代码工作正常,并将循环请求另一个输入,当输入10时,代码按预期停止(因为猜测值等于rand)。但是,如果我输入任何非整数的内容(例如“否”),则会出现一个无限循环,其中输出打印以下内容: "你的猜测必须是整数" “输入您的猜测:您的猜测必须是整数。” “输入您的

  • 问题内容: 在Java中退出/终止while循环的最佳方法是什么? 例如,我的代码当前如下: 问题答案: 用途: 但是,如果您的代码看起来 完全 像您指定的那样,则可以使用普通循环并将条件更改为: