Хорошо, я уверен, что этот вопрос забит до смерти, но я все еще не могу найти ответ, который мне нужен для моего проекта.
Я работаю над созданием набора игр для казино на java (я на 110% уверен, что для этого есть лучшие и более простые языки, но я изучаю Java прямо сейчас, и я хотел бы писать код на Java для практики). Моя проблема в том, что я не могу понять, как структурировать свой код. Я привык использовать операторы goto (я начал изучать кодирование с небольшого базового уровня). Например:
import java.util.*;
public class CasinoGames
{
public static void main(String[] args)
{
Scanner keys = new Scanner(System.in);
sopln("Hello, and welcome to Casino Games!");
sopln("Would you like to login, register, or play as a guest?");
char token = keys.nextLine().toLowerCase().charAt(0);
randomlabelhere:
if (token == "l")
User.login();
else if (token == "r")
User.register();
else if (token == "g")
User.guestLogin();
else
sopln("Invalid Choice, please try again!");
goto somerandomlabel
Я знаю, что это не скомпилируется, поэтому, пожалуйста, не упоминайте об этом. Я знаю, что могу использовать для этого цикл do-while, но если мне нужна возможность выполнить переход, какие у меня есть альтернативы?
5 ответов
Самое близкое, что Java имеет к goto
, - это ярлыки для break
и continue
. Goto считался вредным дольше, чем Java был языком, и, следовательно, Java не реализация goto ( и goto
- это зарезервированное слово, поэтому вы не можете его добавить). Наконец, поскольку token
- это char
, вам следует сравнить с литералами char
, такими как
while(true) {
if (token == 'l')
User.login();
else if (token == 'r')
User.register();
else if (token == 'g')
User.guestLogin();
else {
sopln("Invalid Choice, please try again!");
continue;
}
break;
}
import java.util.Scanner;
public class Casino {
public static void main(String[] args) {
try (Scanner input = new Scanner(System.in)) {
sopln("Hello, and welcome to Casino Games!");
sopln("Would you like to login, register, or play as a guest?");
while (true) {
char token = input.next().toLowerCase().charAt(0);
if (token == 'l') {
User.login();
break;
} else if (token == 'r') {
User.register();
break;
} else if (token == 'g') {
User.guestLogin();
break;
} else {
sopln("Invalid Choice, please try again!");
}
}
}
}
public static void sopln(String str) {
System.out.println(str);
}
private static class User {
static void login() {}
static void register() {}
static void guestLogin() {}
}
}
Сканер реализует AutoCloseable в Java 7+, поэтому я справился с этим с помощью функции try-with-resources.
Примечание. Пользователю должно быть представлено меню, чтобы он знал, что обозначают l, r и g. Я знаю, это кажется очевидным, но вы удивитесь :-P
Я бы также добавил что-то вроде побега для выхода из программы.
Я пытаюсь вспомнить, когда в последний раз использовал оператор goto, и единственное, что приходит на ум, - это операции перехода сборки MIPS.
Вот один из способов сделать это:
import java.util.*;
public class CasinoGames
{
public static void main(String[] args)
{
Scanner keys = new Scanner(System.in);
sopln("Hello, and welcome to Casino Games!");
sopln("Would you like to login, register, or play as a guest?");
while (true) {
char token = keys.nextLine().toLowerCase().charAt(0);
if (token == 'l') {
User.login();
break;
}
else if (token == 'r') {
User.register();
break;
}
else if (token == 'g') {
User.guestLogin();
break;
}
else {
sopln("Invalid Choice, please try again!");
}
}
}
}
Если хотите, вы можете взять все, что находится под goto
, и сделать его собственным методом. Допустим, вы хотите goto startInteraction
, тогда вы можете сделать это:
void startInteraction(){
//everything below your "randomlabelhere:" would go in this method
}
А затем вызывайте startInteraction()
в любое время, когда захотите это вызвать.
Разница в том, что goto
не вернется туда, откуда он был вызван, в отличие от этого метода. Эту функцию можно смоделировать, если вы использовали return;
в строке, следующей за вызовом startInteraction()
, чтобы код не продолжал следовать за вызовом метода.
for-loop
while-loop
do-while-loop
- Фактически, почти все, кроме
goto
(ИМХО)
Кроме того, token == "l"
- это не то, как работает сравнение String
в Java, вам нужно что-то более похожее на "l".equals(token)
Кроме того, token
является разновидностью char
, поэтому он должен быть больше похож на token == '1'
, но вы можете обойтись без использования String
и использования token.trim().startsWith("1")
, но вам нужно будет проверить результат null
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.