Пытаюсь сделать приложение для помощи в игре. В этой игре есть набор предметов, каждый из которых имеет набор ресурсов, необходимых для его изготовления (рецепт). Каждый ресурс уникален, но большинство из них можно использовать как базовый тип, т. е. «Мех» можно использовать как «Мех» ИЛИ как базовый ресурс «Шкура». По сути, я пытаюсь вернуть, достаточно ли у меня ресурсов в инвентаре для создания рецепта.
В идеале при наличии следующих ресурсов
Id,Name,Bone,Hide,Organ
1, Monster Bone, true, false, false
2, Monster Hide, false, true, false
3, Monster Organ, false, false, true
4, Resource XXXX, true, false, false
и «рецепт» со следующей информацией
Bone = 2 //number of bone needed
Hide = 0
Organ = 0
UniqueResourceId = 4 //Which unique resource I'd need
UniqueResourceCount = 1 //How many of the unique resource I need
Я мог бы вернуть true/false на основе своего инвентаря, поэтому инвентарь
Id, ResourceId
1,1 //basic bone
2,2 //basic hide
3,2 //another basic hide
4,4 //Resource X
вернет false, потому что после использования «Ресурса X» у меня осталась только одна кость, где
Id, ResourceId
1,1 //basic bone
2,2 //basic hide
3,2 //another basic hide
4,4 //Resource X
5,1 //second basic bone
или
Id, ResourceId
1,1 //basic bone
2,2 //basic hide
3,2 //another basic hide
4,4 //Resource X
5,4 //second Resource X
вернет true, потому что у меня достаточно ресурсов, которые можно использовать в качестве костей после использования первого «Ресурса X».
Изменить, чтобы добавить больше деталей
Что касается ресурсов
Ресурсы могут считаться несколькими типами базовых ресурсов, т. е. ресурс Y может считаться как костью, так и скрывать базовый ресурс.
Ни один ресурс не должен использоваться более одного раза, т.е. указанный выше ресурс Y можно использовать как ресурс Y (уникальный ресурс) ИЛИ кость ИЛИ шкуру.
Это также усложняет ситуацию в случае, если у вас есть следующий рецепт.
Bone = 2
Hide = 0
Organ = 1
и следующие ресурсы
2x Resource Y (assume this can be bone/hide)
1x Resource Z (assume this can be bone/hide/organ)
Вы должны убедиться, что ресурсы используются правильно, так как только одна трость может использоваться как орган, а все могут быть использованы как кости. С этим еще не разобрался.
Конец редактирования
Я пробовал кое-что с Hashsets и добавлением ресурсов по мере их использования, но мне кажется, что как только мне нужно начать проверять 8 различных «базовых» типов ресурсов и до 5 уникальных ресурсов для каждого рецепта, это становится узким местом. На данный момент существует около 150 предметов, которые можно изготовить, и еще больше, и я бы хотел, чтобы это было проверено на всех рецептах при проверке, поэтому, если есть лучший / более быстрый способ, я весь в ушах.
FWIW, вот одно из моих испытаний с hashset
public static bool AltSimpleCraftabilityTest()
{
Recipe r = new Recipe
{
Bone = 2,
FirstUniqueResourceId = 5,
FirstUniqueResourceCount = 1
};
List<InventoriedResource> ir = da.GetAvailableResources();
HashSet<InventoriedResource> UsedResources = new HashSet<InventoriedResource>();
UsedResources.Add(ir.FirstOrDefault(x => x.Resource.Id == r.FirstUniqueResourceId));
UsedResources.UnionWith(ir.Where(x => x.Resource.Bone == true).Take(r.Bone));
return UsedResources.Count == r.Bone + r.FirstUniqueResourceCount;
}
Я знаю, что это уродливо, но я просто экспериментировал с некоторыми, хотя я уверен, что вы можете видеть, насколько расширение это станет... громоздким.
Добавлена деталь. Я не уверен, что вы подразумеваете под битом "настойчивости"
Удалите все, что относится к вашим таблицам. Для этого вопроса не имеет значения, храните ли вы свои данные в памяти, в базе данных или в простом текстовом файле. это просто шум
Хорошо, я удалил информацию о структуре данных
Я написал некоторый код, который я бы использовал для такого рода вопросов, см. .net рабочий пример. Теперь было бы легко скопировать/вставить код и реализовать метод расширения CanCraft.
Я ценю ответ. Я думал о словарях раньше, но я не был уверен, как лучше всего перебирать их для тестирования. Мне любопытно, как бы вы подошли к такому тесту, есть ли лучший способ, чем просто перебирать и добавлять используемые ресурсы в Hashset или что-то в этом роде?
С учетом этих требований я бы сказал, что нам нужен Алгоритм возврата. Так что это немного сложнее, чем просто повторять и использовать хеш-набор.
надо будет почитать, спасибо за совет
Я реализовал алгоритм возврата для CanCraft. Взгляните на .net рабочий пример
Удивительно, это, кажется, соответствует всем требованиям. Как только я интегрирую это и введу все данные, я смогу провести некоторое тестирование производительности. Еще раз спасибо
Была небольшая ошибка, вызванная перечислением ResourceKind - фиксированный код здесь





И вы должны вообще удалить часть постоянства - это просто много шума. Просто покажите нам тип ресурса и тип рецепта. Для типа ресурса, имеющего Bone, Hide, Organ, используйте перечисление, помеченное как Flags