Chcę, aby powtarzało się to menu:

Wybierz opcję

1 - ZNAJDŹ

2 - W TRYBIE LOSOWYM

3 - WYŁĄCZANIE

Tak więc, gdy użytkownik wybierze opcję (i zostanie ona wykonana), może następnie wybrać również inne opcje.

Problem: mój kod powtarza menu bez zatrzymywania się.

import java.util.Scanner;

public class MainMenu {
    public static void main(String[] args) {
        int userChoice;
        userChoice = menu();
    }

    private static int menu() {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Choose an Option");
        System.out.println("1 - FIND");
        System.out.println("2 - IN-SHUFFLE");
        System.out.println("3 - OUT-SHUFFLE");

        int choice = scanner.nextInt();
        boolean quit = false;
        do {
            System.out.println("Choose an Option");
            switch (choice) {
                case 1:
                    System.out.println("\n1 - FIND\n");
                    //Deck.findTop();
                    break;
                case 2:
                    System.out.println("\n2 - IN-SHUFFLE\n");
                    // call method
                    break;
                case 3:
                    System.out.println("\n3 - OUT-SHUFFLE\n");
                    // call method
                    break;
                default:
                    System.out.println("\nInvalid Option");
                    break;
            }
        }
        while (!quit);

        return choice;
    }

}

Nie jestem pewien, jak mogę temu zapobiec.

0
helen986 19 grudzień 2019, 16:59
1
Dodaj opcję wyjścia
 – 
Maurice Perry
19 grudzień 2019, 17:03
2
I umieść int choice = scanner.nextInt(); w pętli
 – 
FredvN
19 grudzień 2019, 17:04

5 odpowiedzi

Czytaj zmienną wyboru tylko w pętli

private static int menu()
{
    Scanner scanner = new Scanner(System.in);

    System.out.println("Choose an Option");
    System.out.println("1 - FIND");
    System.out.println("2 - IN-SHUFFLE");
    System.out.println("3 - OUT-SHUFFLE");

    int choice;

    boolean quit = false;
    do {
        System.out.println("Choose an Option");
        choice = scanner.nextInt();
        switch (choice) {
            case 1:
                System.out.println("\n1 - FIND\n");
                //Deck.findTop();
                break;
            case 2:
                System.out.println("\n2 - IN-SHUFFLE\n");
                // call method
                break;
            case 3:
                System.out.println("\n3 - OUT-SHUFFLE\n");
                // call method
                break;
            case 4:
                System.out.println("\n3 - EXIT\n");
                //Call System.exit method
                break;
            default:
                System.out.println("\nInvalid Option");
                break;
        }
    }
    while (!quit);

    return choice;
}

}
0
F.K.M.N 19 grudzień 2019, 17:08

Jednym z problemów w twoim kodzie jest to, że metoda menu zwraca opcję, więc może być używana do odczytu tylko opcji z konsoli lub do wykonywania całego okna dialogowego, dopóki użytkownik nie zdecyduje się zakończyć. Ta ostatnia jest lepsza IMHO, ponieważ utrzymuje wyświetlanie menu blisko stanu switch:

private static void menu()
{
    Scanner scanner = new Scanner(System.in);

    System.out.println("Choose an Option");
    System.out.println("1 - FIND");
    System.out.println("2 - IN-SHUFFLE");
    System.out.println("3 - OUT-SHUFFLE");
    System.out.println("4 - QUIT");

    boolean quit = false;
    do {
        System.out.println("Choose an Option");
        int choice = scanner.nextInt();

        switch (choice) {
            case 1:
                System.out.println("\n1 - FIND\n");
                Deck.findTop();
                break;
            case 2:
                System.out.println("\n2 - IN-SHUFFLE\n");
                // call method
                break;
            case 3:
                System.out.println("\n3 - OUT-SHUFFLE\n");
                // call method
                break;
            case 4:
                System.out.println("\n4 - QUIT");
                quit = true;
                break;
            default:
                System.out.println("\nInvalid Option");
                break;
        }
    }
    while (!quit);
}
0
Maurice Perry 19 grudzień 2019, 17:12

Wybrana opcja pozostaje taka sama w całej pętli. Musisz ustawić quit na true, aby pętla się zakończyła. Sugeruję dodanie opcji wyjścia do instrukcji switch, gdzie właśnie to robisz.

Aby móc zmienić wybraną opcję, musisz poprosić o wprowadzenie danych wewnątrz pętli.

Scanner sc = new Scanner(System.in);
int choice;
boolean quit = false;
do {
  choice = sc.nextInt();
  switch (choice) {
    case 1:
      // case 1
      break;
    case 2:
      // case 2
      break;
    case 3:
      // case 3
      break;
    case 4:
      quit = true;
      break;
    default:
      // your default here
  }
} while (!quit);
0
Dennis B. 19 grudzień 2019, 17:15

Co się dzieje?

  1. Wybór użytkownika (int choice = scanner.nextInt();) jest pytany tylko raz przed pętlą. Więc choice jest naprawione przed wejściem do pętli.
  2. Twój do {} while zapętla tylko instrukcję switch, która wykonuje kod w oparciu o wybór użytkownika (w rzeczywistości wyświetla pojedynczy stały wybór). Użytkownik nie ma możliwości zmiany tego wewnątrz pętli.
  3. Zmienna kontrolna boolean quit pętli nigdy nie jest zmieniana wewnątrz pętli, więc warunek wyjścia pętli quit == true nigdy nie zostanie osiągnięty.
  4. menu, które pokazujesz użytkownikowi nie zawiera żadnej opcji wyjścia 4 - QUIT

Podsumowanie: gdy użytkownik wprowadzi wybór (1), program utknie w tak zwanej pętli nieskończonej (3), zawsze drukując bieżący wybór (2). Nawet po restarcie niepoinformowany użytkownik nie ma szansy na wyjście, ponieważ ani menu nie wyświetla tej opcji (4), ani choice = 4 nie ma żadnego efektu, ponieważ nie jest to w przypadku switcha (3).

Rozwiązywanie problemów

  1. Zmodyfikuj zmienną kontrolną pętli wewnątrz pętli: ustaw quit = true wewnątrz dodatkowego case 4: quit = true; break;
  2. Upewnij się, że ta tylko wychodząca gałąź będzie dostępna poprzez odczytanie wyboru użytkownika wewnątrz pętli: umieść int choice = scanner.nextInt(); wewnątrz do {} i bezpośrednio przed switch.
  3. Dodaj opcję do swojego menu, aby użytkownik wiedział, jak wyjść (np. 4 - QUIT) i użyj tej opcji (patrz 1)
  4. Pokaż menu wewnątrz pętli, bezpośrednio przed odczytaniem wyboru użytkownika.

Zalecenia

Najpierw zaprojektuj pętlę: skup się na wyjściu!

  1. Użyj pętli while(exitCondition == false) {} zamiast do {} while(exitConfition == false), ponieważ bardzo ważny exitCondition jest wyświetlany jako pierwszy (każdemu czytelnikowi twojego kodu) i kontroluje i unika nieskończonej pętli . Pamiętaj więc, aby umieścić go w pętli!
  2. Utrzymuj krótkie linie kodu w pętli i modyfikuj zmienne sterujące na górze, a nie w zagnieżdżonych blokach.
  3. Projektując pętle (zwłaszcza do interakcji z użytkownikiem), zrób to najpierw i użyj pseudokodu (zobacz wiersze zakomentowane poniżej).
    final static int QUIT_OPTION = 4;

    public static void main(String[] args) {
        int chosenOption = -1;
        while (chosenOption != QUIT_OPTION) {
            // showMenu();
            // chosenOption = readUsersChoice();   
            // executeOption(chosenOption);
            System.out.println("choosenOption: " = choosenOption); // for testing: see if choosenOption does change
            choosenOption = QUIT_OPTION; // while design: simulates a single loop
        }
    }

Ostatnie 2 linie wewnątrz pętli dotyczą tylko fazy projektowania, w której przetestujesz pojedynczą pętlę (stąd ostateczna aktywacja QUIT_OPTION). Skoncentruj się na zmiennej sterującej: czy Twój użytkownik lub program jest w stanie zmienić ją w pożądany sposób (stąd debugowanie println)?

Podziel i zwyciężaj: podziel zadanie/logikę na małe oddzielne funkcje Powyższa pętla (wewnątrz main) była pierwszą małą, ale główną częścią logiki.

Pierwsze zadanie wewnątrz pętli: „wyświetlanie menu”

    private static void showMenu() {
        System.out.println("Options - Main Menu");
        System.out.println("1 - FIND");
        System.out.println("2 - IN-SHUFFLE");
        System.out.println("3 - OUT-SHUFFLE");
        System.out.println("4 - QUIT");
        System.out.println("Choose from above Options (1-4) by typing the number followed by RETURN:");
    }

Staraj się, aby te metody były małe, skupione na jednym zadaniu. Jeśli to możliwe, trzymaj je również w izolacji (od innych). Możesz więc przetestować (wywołać) je osobno i sprawdzić, czy robią to, co chcesz.

Dalej: „odczytaj wybór użytkownika”

    private static int readUsersChoice() {
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();

        return choice;
    }

Ta metoda wymaga specjalnych testów. Sprawdź, co się dzieje, gdy użytkownik wprowadzi literę (np. Q, ponieważ chce wyjść). Czy złapałeś java.util.InputMismatchException wewnątrz metody?

Na koniec „wybrana opcja zostanie oceniona i wykonana”:

    private static void executeOption(int choice) {
        switch (choice) {
            case 1:
                System.out.println("\n1 - FIND\n");
                //Deck.findTop();
                break;
            case 2:
                System.out.println("\n2 - IN-SHUFFLE\n");
                // call method
                break;
            case 3:
                System.out.println("\n3 - OUT-SHUFFLE\n");
                // call method
                break;
            default:
                System.out.println("\nInvalid Option");
                break;
        }
    }

Przetestuj to dobrze, ponieważ tutaj - w oparciu o opcję - można wywołać inny kod/metody (nawet pętle). Możesz również dodać case: QUIT_OPTION i wydrukować pożegnanie.

0
hc_dev 21 grudzień 2019, 19:27

Spróbuj tego. Musisz tylko wyjść z pętli i wprowadzić opcje i wybór użytkownika do pętli.

import java.util.Scanner;
public class Switchh {

static boolean quit = false;

public static void main(String[] args) {
    int userChoice;
    userChoice = menu();
}

private static int menu() {
    Scanner scanner = new Scanner(System.in);
    int choice;
    do {

        System.out.println("Choose an Option");
        System.out.println("1 - FIND");
        System.out.println("2 - IN-SHUFFLE");
        System.out.println("3 - OUT-SHUFFLE");
        choice = scanner.nextInt();
        System.out.println("Choose an Option");
        switch (choice) {
            case 1:
                System.out.println("\n1 - FIND\n");
                //Deck.findTop();
                break;
            case 2:
                System.out.println("\n2 - IN-SHUFFLE\n");
                // call method
                break;
            case 3:
                System.out.println("\n3 - OUT-SHUFFLE\n");
                // call method
                break;
            default:
                System.out.println("\nInvalid Option");
                quit = true;
                break;
        }
    }
    while (!quit);

    return choice;
}

}
0
Dhamo R 23 grudzień 2019, 09:57
1
Wygląda na to, że pytanie jest zmodyfikowane, sprawdź edytowane ans
 – 
Dhamo R
23 grudzień 2019, 09:58