2013-03-10 2 views
0

Итак, я пытаюсь создать текстовую игру с пользовательским интерфейсом (в отличие от истинного текста, основанного на синтаксическом разборе и всех забавных вещах) это в основном RPG. С этой целью в игре есть куча разных событий, которые могут произойти (но не гарантированы и не встречаются в любом общем порядке), и мне интересно, как наиболее эффективный способ кодировать это.Как закодировать игровые события в текстовой игре на C#

В настоящее время я думаю, что у меня есть статический класс GameState, который, имея другую информацию, будет иметь массив и перечисление внутри них. Массив будет , вероятно, быть байтами для разговора или выборами с несколькими необязательными событиями, где 0 будет означать, что событие не произошло, а затем число 1 - X будет представлять, какая опция из X была выбрана. Что-то вроде этого:

public enum GameEvents{ 
         Event 1, 
         Event 2, 
         Event 3 }; 

public static byte[] GameEventStates = new byte[Enum.GetNames(typeof(GameEvents)).Length]; 

Так что в событиях, и прочее, я был бы в состоянии сделать линии, как:

if(GameState.GameEventStates[GameState.GameEvents.Event2] == 1) 
{ 
    Stuff Here; 
} 

или

GameState.GameEventStates[GameState.GameEvents.Event4] = 1; 

(Примечание: для строго «Has Seen ', было бы 0 за то, что он не видел, и 1 за то, что видел его).

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

A) имеет глобальный доступ к нему для изменения значения, как события происходят и позволяют чеки против их появлений,

B) легко добавить больше событий, так как содержимое игры расширяется со временем, и

C) легко сохраняет и загружает значения в/из файла сохранения.

Это действительно лучший способ сделать это? Я первый, кто признал, что могу придумать ... «творческие» способы, которые на самом деле не так хороши для решения проблем. Второе мнение действительно будет оценено. Заранее спасибо.

+1

пожалуйста, простите мое невежество ... что именно это 'текст на основе, как игра с UI'? –

+0

Я не очень хорош в C# (я все еще участвую), но я думаю, вы могли бы сделать много методов в отдельном классе событий, которые называются номерами, и вызвать метод, основанный на случайном числе. –

+0

@HighCore Я думаю, он хочет показать, что происходит как текст (текстовое поле), но есть кнопки для таких действий, как «смотреть», «использовать», .... Поэтому вам не нужно вводить «использовать ключ с красной дверью». –

ответ

3

Это выглядит как классический пример для Observer pattern.

Вам необходимо создать класс, в котором будет храниться состояние игры, а в случае изменения состояния он будет уведомлять всех подписчиков.

public class GameStateManager 
{ 
public GameStateFileReader fileReader = new GameStateFileReader() //this class can read gamestate to file, and save it back 

public void SaveState() {//save using fileReader} 
public void LoadState() {//load} 

public event Action<GameEvents> StateChanged; 

} 

и Game класс может подписаться на StateChanged события:

gameStateManager.StateChanged += OnStateChanged; 
//.... 
public void OnStateChanged(GameEvents event) 
    { 
    //react on new game state 
    } 

Некоторые игровые агенты могут изменить состояние игры (пользователь открыл дверь с некоторым сердитым боссом, к примеру), так GameStateManager должен обеспечить способ изменить состояние игры.

public void SetNewState (GameEvents newEvent) 
    { 
    //Save new state to some Property 
    //... 

    //and notify everybody about new state 
    if(StateChanged != null) 
    { 
     StateChanged(newEvent); 
    } 
    } 

Если какой-либо класс хочет быть проинформирован о том, что состояние игры было изменено кем-то, оно также должно подписаться на это мероприятие.

Я не хотел вас смущать Action.Вы можете прочитать о них здесь: Explaining action

Кроме того, еще некоторая информация о событиях: Events in C#

+0

Игнорировать последний комментарий. Я забыл, что GameEvents был моим перечислением. Хорошо, это внезапно имеет больше смысла. GameStateManager - это новый класс, в котором есть Action <> моего перечисления GameEvents, называемого StateChanged. Я также понимаю, что SetNewState передает значение GameEvents (например, Event4, как указано выше), устанавливает новое состояние и затем отправляет предупреждение о состоянии изменено. ... что средний блок текста меня сбивает с толку. Можете ли вы немного разобраться? –

+0

Исправлен текст. Что вы думаете об этом сейчас? –

+0

... Я думаю, мне нужно больше узнать о C#. Я могу понять, что у вас здесь происходит, я думаю, но часть меня не понимает, зачем мне нужно действие Action <> (или что он даже делает) для хранения сюжетных проверок игры. Извините ^^ Я, по-видимому, немного тускнеет ... также, что делает «The Rock Here»? ~.^ –

Смежные вопросы