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.
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;
}
}
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);
}
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);
Co się dzieje?
- Wybór użytkownika (
int choice = scanner.nextInt();
) jest pytany tylko raz przed pętlą. Więcchoice
jest naprawione przed wejściem do pętli. - 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. - Zmienna kontrolna
boolean quit
pętli nigdy nie jest zmieniana wewnątrz pętli, więc warunek wyjścia pętliquit == true
nigdy nie zostanie osiągnięty. - 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
- Zmodyfikuj zmienną kontrolną pętli wewnątrz pętli: ustaw
quit = true
wewnątrz dodatkowegocase 4: quit = true; break;
- 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ątrzdo {}
i bezpośrednio przedswitch
. - Dodaj opcję do swojego menu, aby użytkownik wiedział, jak wyjść (np.
4 - QUIT
) i użyj tej opcji (patrz 1) - Pokaż menu wewnątrz pętli, bezpośrednio przed odczytaniem wyboru użytkownika.
Zalecenia
Najpierw zaprojektuj pętlę: skup się na wyjściu!
- Użyj pętli
while(exitCondition == false) {}
zamiastdo {} while(exitConfition == false)
, ponieważ bardzo ważnyexitCondition
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! - Utrzymuj krótkie linie kodu w pętli i modyfikuj zmienne sterujące na górze, a nie w zagnieżdżonych blokach.
- 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.
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;
}
}
Podobne pytania
Nowe pytania
java
Java to język programowania wysokiego poziomu. Użyj tego tagu, jeśli masz problemy z używaniem lub zrozumieniem samego języka. Ten tag jest rzadko używany samodzielnie i jest najczęściej używany w połączeniu z [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] i [maven].
int choice = scanner.nextInt();
w pętli