Вот как я бы определил структуры (если VB.Net-fu меня не подводит):
Public Class Decision
Public Property Title As String
Public Property Description As String
Public Property FirstChoice As Decision
Public Property SecondChoice As Decision
End Class
Title
- это то, что вы отображаете на кнопке или над кнопкой, чтобы выбрать этот выбор.
Description
- это то, что вы показываете, как только вы подтвердили свой выбор и пришли к следующему решению.
Если FirstChoice
или SecondChoice
пусто, вы можете скрыть кнопку. Это позволит вам сделать только один необязательный выбор, и он будет перекошен в одну сторону от рамки, для драматического эффекта. E.g.:
You've found yourself in a narrow corridor
[Go Right]
Если вы хотите разрешить больше вариантов, чем два, или, по крайней мере, оставить себе возможность делать это в будущем, вы можете определить свою структуру данных следующим образом:
Public Class Decision
Public Property Title As String
Public Property Description As String
Public Property Decisions As New List(Of Decision)
End Class
Вы можете использовать элемент управления в стиле ListBox
или GridView
, чтобы отобразить его пользователю, или при необходимости переключаться между списком и кнопками в зависимости от количества элементов в списке.
Кстати, структура данных намеренно рекурсивна. Это становится древовидной структурой, и на каждом узле дерева у вас есть решение и, возможно, дочерние решения.
Обычно вы бы не зацикливали такую структуру, но нет причины, по которой вы не могли бы в этом случае. Если вы столкнулись с ситуацией в стиле «игра закончена», вы можете просто вернуться к началу, которое будет связано с корневым экземпляром (и, таким образом, будет «циклическим графом»).
Редактировать
Вот пример кода, чтобы показать вам, как вы можете соединить их вместе:
Dim darkAlley = New Decision With
{
.Title = "Dark Alley",
.Description = "You are in a deep dark alley." _
+ " The night surrounds you and you feel a bit claustrophobic." _
+ " Obvious exits are east and Salisbury street."
}
Dim eastOfDarkAlley = New Decision With
{
.Title = "East of Dark Alley",
.Description = "You are mauled by a bear!" _
+ " He was a dire bear, so he had rabies. Start over?"
}
Dim salisburyStreet = New Decision With
{
.Title = "Salisbury street",
.Description = "Mmm... Ground beef... Blarrghlhlap (*tongue hangs out*)"
}
darkAlley.FirstChoice = eastOfDarkAlley
darkAlley.SecondChoice = salisburyStreet
eastOfDarkAlley.FirstChoice = darkAlley
salisburyStreet.FirstChoice = darkAlley