Как совместить прослушиватели событий с запросом на событие?

Я написал простую игру с маленькими лабиринтами для терминала, который неоднократно просит пользователя что-то сделать (например, «В каком направлении вы хотели бы пойти? [N / E / S / W]»). У меня есть метод navigate() запущенный в цикле, который устраняет эти вопросы, сохраняет ответы и делает что-то в зависимости от ответа.

 public enum Dir (N, E, S, W); public void navigate() { Dir nextDir = utils.askDirection("Which way do you want to go?"); // Do stuff with answer, like changing position of user in maze } 

Теперь я написал простой графический интерфейс для своей игры. Я намеренно помещаю все ссылки на терминал в classе ConsoleUtils который реализует интерфейс Utils (у этого есть методы, такие как askQuestion() ) – идея состоит в том, что я мог бы создать class GuiUtils и иметь свою игру либо как терминальную игру, либо как GUI-игра.

Проблема заключается в том, что метод navigate задает пользователю вопрос и затем «ждет» ответа, который class Utils дает ему, используя Scanner для чтения последней строки ввода. Однако, если я использую Listen Listers для новых кнопок N / E / S / W в моем графическом интерфейсе, они запускают события независимо от того, запросил ли метод navigate один или нет. -> Изображение GUI

Есть ли способ объединить это или мне нужно написать новый метод navigate для графического интерфейса?

(Честно говоря, я также не совсем уверен, должен ли мой class GUI создавать экземпляр classа game , и в этом случае логика navigate может в конечном итоге оказаться в GUI-методе или должна ли игра иметь графический интерфейс. t написал какой-либо код для прослушивателя событий еще, так как я не уверен, какой class должен называть это. Это, вероятно, отдельный вопрос.)

В вашей текстовой игре есть цикл, который неоднократно задает вопросы для сбора пользовательского ввода. Swing предоставляет этот цикл для вас, постоянно выполняя Runnable блоки кода, которые были отправлены в EventQueue . Например, когда пользователь нажимает кнопку с надписью E , код отправляется в очередь, которая вызывает вашу реализацию ActionEvent чтобы обрабатывать интерпретацию вашей игрой команды move east .

Для справки здесь рассматривается полный пример очень простой игры угадывания. В псевдокоде соответствующая текстовая игра может выглядеть так:

 initialize loop prompt "Guess what color!" get chosenColor if chosenColor = actualColor say "You win!" reset game else say "Keep trying." end loop 

Более сложная игра, в которой он цитируется, включает исходный источник на основе текста.

  • Как подключить одну панель к другой
  • Как обновить графический интерфейс из другого streamа?
  • Редактор графического редактора Netbeans, создающий собственный непонятный код
  • Объявление пользовательского элемента пользовательского интерфейса Android с использованием XML
  • Как настроить панель выполнения на Android
  • Android 4.2.1 неправильный кернинг символов (интервал)
  • Чтение из текстового поля в другом приложении
  • Что такое MVP и MVC и в чем разница?
  • Масштабировать пользовательский интерфейс для нескольких разрешений / различных устройств
  • Есть ли представление для ввода целых чисел в Android?
  • Как получить центр большого пальца изображения UISlider
  • Давайте будем гением компьютера.