2016-04-03 2 views
0

Я ищу способ сделать простую текстовую игру, хотя у меня возникают проблемы с этим в Event Driven, а не в игровом цикле.Создание текстовой игры, ожидающей события JButton

Основной способ игры в игру: Говорит, какой монстр вы сражаетесь. Атака. Когда он побежден, вы переходите к следующему монстру.

В игровом цикле, который использует следующую строку сканера, я могу дождаться, когда пользователь введет допустимый параметр, а затем продолжит код. Однако, используя события, я не уверен, как настроить игру. Мне нужно как-то подождать, пока пользователь нажмет кнопку, чтобы сделать действие, но я не знаю, где я должен зарегистрировать прослушиватель событий, как я могу создать цикл с событиями событий и т. Д.

Извините, если это является своего рода неопределенным, это скорее проблема семантики, чем синтаксис, и я просто изучаю Java. Мне по существу нужна базовая структура управляемой событиями игры, которая реагирует по-разному в зависимости от того, на какой стадии игры вы находитесь.

ответ

0

Ключ программы-события состоит в том, что вы вообще не используете «петлю». Вместо этого вы меняете «состояние».

Простейшая версия этого «конечного автомата» будет линейной ArrayList строки, где ваша программа содержит переменную int, которая представляет текущий элемент в ArrayList, и вы увеличиваете индекс нажатием кнопки, а затем представляете следующая строка в списке для пользователя. Красота системы заключается в том, что вы можете использовать ее для более сложных логических путешествий, почти бесконечного разнообразия, каждый из которых зависит от текущего состояния игры и выбора (ов), сделанных пользователем.

Для более сложных игр вы не будете использовать линейный скрипт, а скорее создадите несколько классов с поведением (методами) и состоянием (переменными) и попросите их всех взаимодействовать друг с другом. Они будут включать в себя ваши классы монстров, классы предметов и классы местоположения, а также класс игры, чтобы контролировать все.

+0

Спасибо! Извините за поздний ответ, но это помогает. Я предполагаю, что это другое мышление, поэтому я исправил его сейчас и разработал общую программу. –

1

В управляемых событиями программах, которые я делал в прошлом, вы хотите, чтобы каждый класс, который собирается что-то делать, и генерирует события, имеет внутренний список слушателей, которые могут регистрироваться/регистрироваться в этом классе. Подумайте об этом как о том, кто подписывается на ваши твиты в Интернете. Вы отвечаете на некоторые типы стимулов и отправляете уведомления всем, кто подписался/зарегистрирован в вашем канале. Те слушатели, в свою очередь, могут принять меры и отправить уведомления своим слушателям и т. Д.

Простая реализация должна заключаться в том, чтобы интерфейс TweetListener и классы подписки реализовали этот интерфейс. Вы, как the TweetProducer, должны иметь набор методов регистрации/отмены регистрации, поддерживаемых внутренним списком всех экземпляров TweetListener, которые хотят получать уведомления при отправке «события». Когда вы будете готовы отправить чириканье, вы можете пройти через защитную копию этого списка и для каждого объекта там, вы должны вызвать метод, определенный в вашем интерфейсе TweetListener, то есть aListener.doTweetReceivedAction("Here's my tweet"). (Оборонительная копия, потому что одно возможное действие для слушателя - это отменить регистрацию/остановку после ваших твитов, и вы не захотите изменять параллельный список). Очевидно, вам нужно будет проявлять большую осторожность в отношении того, как действия в действиях влияют на вашу программу как с точки зрения параллелизма/многопоточности, так и с точки зрения порядка операций.

Что касается самообучения всего, в вашем методе public void static main вы в основном создаете экземпляр различных объектов и соединяете их как слушатели и т. Д.

Tweeter me = new Tweeter() 
SomeDude dude = new SomeDude() // implements TweetListener interface 
SomeDude bob = new SomeDude() 

me.addListener(dude); 
me.addListener(bob); 

me.tweet("hi!"); 

Очевидно, вы также должны KeyTyped слушателя, который будет сидеть & ожидание событий нажатия кнопок, определить, какие они есть, и разослать соответствующие уведомления о событиях в различных слушателей в вашей программе. В какой-то момент, чтобы прослушиватель нажатия клавиш должен был сидеть & блок, ожидая ввода. В качестве альтернативы вы можете использовать этот прослушиватель клавиатуры &, другие части вашей программы запускаются в разных потоках. Это на самом деле способ работы потоковой модели Swing на Java. У вас есть основная нить программы и качающаяся нить, и вы отправляете уведомления о событиях взад и вперед между ними (например, SwingUtilities.invokeLater();)

Это более старая статья, но на самом деле очень хорошо подходит для того, программирование, управляемое событиями в java. Я думаю, что это будет применимо к тому, что вы пытаетесь сделать. https://community.oracle.com/docs/DOC-982960 В нем говорится о таких вещах, как оборонительное копирование, отправка объектов непреложного события и почему вам нужно делать & беспокоиться о таких вещах.