#.net #vb.net #data-structures #adventure
#.net #vb.net #структуры данных #Приключения
Вопрос:
Я разрабатываю приключенческую игру на основе выбора в VB.NET 2010, где вам представлена метка истории, и вы выбираете между 2 кнопками, какой выбор вы хотите сделать. Я хочу знать наиболее эффективный способ сделать это.
Мои цели — сохранить метки для кнопок и историю в некоторой форме структуры данных, которая сейчас временно является хэш-таблицей, и в некоторой форме структуры для выбора. Прямо сейчас я использую пользовательский класс, который ссылается на индексы следующих 2 вариантов и соответствующие им индексы меток, которые хранят экземпляры класса в хэш-таблице. Я изучал такие вещи, как массивы, словари, списки и коллекции, но я не уверен, какой из них лучше всего подходит для того, что мне нужно. Подойдет любая структура данных .NET. Какая структура данных наиболее эффективна для этих 2 частей данных? Будет ли работать просто массив строк?
Комментарии:
1. «Основанный на выборе»? вы имеете в виду что-то вроде «Выбери свое собственное приключение» или «Визуальный роман» ?
Ответ №1:
Вот как я бы определил структуры (предполагая, что 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
равно нулю, вы можете скрыть кнопку. Это позволит вам сделать необязательным только один вариант и расположить его с наклоном в одну сторону рамки для драматического эффекта. Например.:
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
style для отображения его пользователю или, при необходимости, переключаться между полем списка и кнопками в зависимости от того, сколько элементов у вас есть в списке.
Кстати, структура данных намеренно рекурсивна. Это становится древовидной структурой, и в каждом узле дерева у вас есть решение и, возможно, дочерние решения.
Обычно вы бы не зацикливали такую структуру, но нет никаких причин, по которым вы не могли бы в этом случае. Если вы попали в ситуацию в стиле «игра окончена», вашим вариантом может быть просто возврат к началу, которое будет связано с корневым экземпляром (и, таким образом, будет «циклическим графиком»).
Редактировать
Вот пример кода, чтобы показать вам, как вы можете соединить их вместе:
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
Комментарии:
1. Мой класс прямо сейчас содержит индексы к хэш-таблице, в которой есть «история» и два решения. Я не думаю, что ваш пример сработает в моем контексте, мне нужно сохранить: choiceID, ChoiceOneLabelID, ChoiceTwoLabelID, ChoiceOneID и ChoiceTwoID. Я просто связываю один и два идентификатора с «идентификатором выбора» чего-то другого, что так напоминает какую-то иерархию или «двоичное дерево», но это лучший способ сделать это? Должен ли я редактировать свой код?
2. @Marc: Хэш-таблица тоже будет работать, так что конвертируйте, только если хотите. Но вы просили совета в этой области. Подобное дерево является более декларативным и не зависит от идентификаторов (которые на самом деле не имеют ничего общего с вашими данными). Он может легко использовать синтаксис инициализации для построения всего дерева сразу, без временных переменных. Менее вероятно, что она хорошо впишется в базу данных SQL, но, насколько я знаю, это не важно. Вы могли бы использовать дочерние метки вместо заголовков, как вы предлагаете, но в любом случае это будет так же просто. Если вы выберете
List
вариант вместо двух дочерних элементов, то вам следует выбратьTitle
.3. Мне не нужно хранить ее в каком-либо типе постоянного хранилища, но я просто ищу лучшую структуру данных ключ-значение. Я только что понял, может быть, то, что мне нужно, — это массив строк?
4. @Marc: Это моя точка зрения. Если вы не используете базу данных и не транслируете по проводам, зачем вам использовать IDS? Они полезны только в том случае, если вы хотите хранить или передавать данные. Для объектов в памяти переменные (локальные, членские, статические, часть другой структуры данных и т.д.) Работают намного лучше. Если вы действительно хотите использовать идентификаторы или у вас слишком много инвестиций / импульса для них в вашем проекте, тогда используйте
Dictionary<string, string>
илиDictionary<int, string>
. Они созданы для поиска значений из других значений («ассоциативные массивы»).5. Если только вы уже не прошли через это и не присвоили всему идентификатор, да. Создайте класс, который представляет «комнату» или «точку принятия решения» или что-то еще, создайте их экземпляры и сделайте так, чтобы они указывали друг на друга. Когда вы вызываете
new
класс, вы можете связать свои вызовы сnew
, поэтому вам не нужно создавать локальные переменные для каждой отдельной комнаты. Или вы можете предоставить им все локальные переменные, если это кажется правильным, и подключить их после того, как вы создали обе «комнаты» отдельно. Может быть, я должен просто добавить некоторый код к ответу 😉
Ответ №2:
Ваша игра довольно четко представляет собой дерево решений. Если есть только 2 варианта, какая-либо модифицированная форма двоичного дерева была бы идеальной. В противном случае это сделало бы несколько более сложное n-арное дерево.
Комментарии:
1. Да, это два варианта, тогда игрок делает 3 в целом. Таким образом, она разветвляется на 3 уровня выбора и 8 концовок. Какая из них будет работать тогда?
2. @MarcDiMillo Я бы посмотрел на бинарные деревья. У меня нет опыта с vb.net в частности, поэтому я не уверен точно, что это повлечет за собой.