Хорошо, я уверен, что этот вопрос забит до смерти, но я все еще не могу найти ответ, который мне нужен для моего проекта.

Я работаю над созданием набора игр для казино на 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, но если мне нужна возможность выполнить переход, какие у меня есть альтернативы?

0
Austen Clay 24 Фев 2015 в 05:48

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;
}
2
Elliott Frisch 24 Фев 2015 в 02:51
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.

0
24 Фев 2015 в 03:41

Вот один из способов сделать это:

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!");
      }
    }
  }
}
1
jacobm 24 Фев 2015 в 02:55

Если хотите, вы можете взять все, что находится под goto, и сделать его собственным методом. Допустим, вы хотите goto startInteraction, тогда вы можете сделать это:

void startInteraction(){
    //everything below your "randomlabelhere:" would go in this method
}

А затем вызывайте startInteraction() в любое время, когда захотите это вызвать.

Разница в том, что goto не вернется туда, откуда он был вызван, в отличие от этого метода. Эту функцию можно смоделировать, если вы использовали return; в строке, следующей за вызовом startInteraction(), чтобы код не продолжал следовать за вызовом метода.

2
Cal Stephens 24 Фев 2015 в 03:22

Кроме того, token == "l" - это не то, как работает сравнение String в Java, вам нужно что-то более похожее на "l".equals(token)

Кроме того, token является разновидностью char, поэтому он должен быть больше похож на token == '1', но вы можете обойтись без использования String и использования token.trim().startsWith("1"), но вам нужно будет проверить результат null

7
MadProgrammer 24 Фев 2015 в 02:55