1

ユーザーに 4 つのオプションから選択させるメニュー システムを作成してみました。選択を区別するために、入力された int をチェックします。それは機能しますが、どういうわけかあまりエレガントではないと感じます。特に、selectedMenu の初期値を 1902475424 に設定して、ユーザーがいつ不一致の値を入力したかを確認する場合。ユーザーが誤って 1902475424 と入力することはないと思います。

メニューシステムを作成するためのより簡単な方法はありますか? これは主要な欠陥ですか?

はい、Javaの初心者です:-)

import java.util.Scanner;
import java.util.InputMismatchException;

public class Menu {

    public void printMenu() {
        System.out.println(
                "1. Start new game\n" + 
                "2. Load game\n" + 
                "3. Settings\n" + 
                "4. Exit\n"
        );
    }

    public void selectMenu() throws InputMismatchException {
        int selectedMenu = 1902475424;
        Scanner aScanner = new Scanner(System.in);
        do {
            selectedMenu = 1902475424;
            try {
                System.out.println("Try block begin.");
                selectedMenu = aScanner.nextInt();
            } catch (InputMismatchException e) {
                System.out.println("Catch blok begin.");
                System.out
                        .println("Invalid input, please input a number between 1-4.");
                aScanner.nextLine();
            }
            if ((selectedMenu < 1 || selectedMenu > 4)
                    && (selectedMenu != 1902475424)) {
                System.out.println("Input out of range \"" + selectedMenu
                        + "\". Input a number between 1-4.");
            }
        } while (selectedMenu == 1902475424
                || (selectedMenu < 1 || selectedMenu > 4));

        if (selectedMenu >= 1 && selectedMenu <= 4) {
            System.out.println("A new game will now start.");
        }
    }
}
4

4 に答える 4

1

あなたの方法はやり過ぎのカテゴリに傾いています:]次のような
ランダムな値を取り除くことができます:1902475424

public void selectMenu() throws InputMismatchException {
    int selectedMenu;
    Scanner aScanner = new Scanner(System.in);
    do {
        try {
            System.out.println("Try block begin.");
            selectedMenu = aScanner.nextInt();
            if(selectedMenu < 1 || selectedMenu > 4) {
                System.out.println("Input out of range \"" + selectedMenu + "\". Input..");
            }
        } catch(InputMismatchException e) {
            System.out.println("Catch blok begin.");
            System.out.println("Invalid input, please input a number between 1-4.");
            aScanner.nextLine();
            selectedMenu = 0;
        } 

    } while(selectedMenu < 1 || selectedMenu > 4);

    System.out.println("A new game will now start.");
}
于 2013-01-04T22:25:41.123 に答える
1

次の代替案 (疑似コード) を検討してください。

int getMenuOption() {
    print(message)
    read(input)

    if input is valid then return input
    else then return getMenuOption()
}

これは再帰的であるため、ユーザーがそこに座って不適切な数字を長時間入力すると、スタックがオーバーフローする可能性があります。これを簡単に拡張して、ユーザーに固定回数の試行を与えることができます。

int getMenuOption(int triesRemaining) {
    if (triesRemaining == 0) throw new RetriesExceededException();

    print(message)
    read(input)

    if input is valid then return input
    else then return getMenuOption(triesRemaining - 1)
}
于 2013-01-04T22:27:56.947 に答える
0

これは、あなたが提供したメソッドの改訂版でありselectMenu()、仕事を成し遂げるはずです! テストしましたが、期待どおりに動作するようです。:)

public void selectMenu() {

    int selectedMenuItem = 0;
    Scanner aScanner = new Scanner(System.in);

    while(selectedMenuItem == 0){

        String userInputMenuItemString = aScanner.nextLine();

        try {
            int userInputMenuItem = Integer.parseInt(userInputMenuItemString);
            if(userInputMenuItem > 0 && userInputMenuItem <= 4){

                selectedMenuItem = userInputMenuItem;

            }else{

                System.out.println("No option #" + Integer.toString(userInputMenuItem) + " exists!\nTry again:");

            }
        } catch(NumberFormatException ex) {

            System.out.println("Please input a number!");

        }

    }

    switch(selectedMenuItem){
        case 1:
            System.out.println("You chose to start a new game!");
            break;
        case 2:
            System.out.println("You chose to load a game!");
            break;
        case 3:
            System.out.println("You chose to access settings!");
            break;
        case 4:
            System.out.println("You chose to exit. Bye!");
            System.exit(0);
            break;
    }
}
于 2013-01-04T22:28:24.587 に答える
0

そのようなことを試してください(私はそれをテストしていません)

    import java.util.Scanner;
    import java.util.InputMismatchException;

    public class Menu {

            public void printMenu() {
                    System.out.println("1. Start new game\n" + "2. Load game\n"
                                    + "3. Settings\n" + "4. Exit\n");
            }

            public void selectMenu() throws InputMismatchException {
                    int selectedMenu;
                    boolean validSelection = false;
                    Scanner aScanner = new Scanner(System.in);
                    while(!validSelection) {
                            selectedMenu = aScanner.nextInt();
                            validSelection = true;
                            switch (selectedMenu) {
                                    case 1:
                                            // doWhen1();
                                            break;
                                    case 2:
                                            // doWhen2();
                                            break;
                                    case 3:
                                            // doWhen3();
                                            break;
                                    case 4:
                                            // doWhen4();
                                            break;
                                    default:
                                            System.out.println("Input out of range \"" + selectedMenu
                                                    + "\". Input a number between 1-4.");
                                            validSelection = false;
                            }
                    }
            }
    }
于 2013-01-04T22:30:44.083 に答える