Попытка вернуть Bool на основе количества элементов в списке без использования более одного раза

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

В идеале при наличии следующих ресурсов

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;
}

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

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

Sir Rufo 19.02.2019 07:52

Добавлена ​​деталь. Я не уверен, что вы подразумеваете под битом "настойчивости"

Tyler Hundley 19.02.2019 08:00

Удалите все, что относится к вашим таблицам. Для этого вопроса не имеет значения, храните ли вы свои данные в памяти, в базе данных или в простом текстовом файле. это просто шум

Sir Rufo 19.02.2019 08:02

Хорошо, я удалил информацию о структуре данных

Tyler Hundley 19.02.2019 08:10

Я написал некоторый код, который я бы использовал для такого рода вопросов, см. .net рабочий пример. Теперь было бы легко скопировать/вставить код и реализовать метод расширения CanCraft.

Sir Rufo 19.02.2019 08:36

Я ценю ответ. Я думал о словарях раньше, но я не был уверен, как лучше всего перебирать их для тестирования. Мне любопытно, как бы вы подошли к такому тесту, есть ли лучший способ, чем просто перебирать и добавлять используемые ресурсы в Hashset или что-то в этом роде?

Tyler Hundley 19.02.2019 08:53

С учетом этих требований я бы сказал, что нам нужен Алгоритм возврата. Так что это немного сложнее, чем просто повторять и использовать хеш-набор.

Sir Rufo 19.02.2019 09:00

надо будет почитать, спасибо за совет

Tyler Hundley 19.02.2019 09:08

Я реализовал алгоритм возврата для CanCraft. Взгляните на .net рабочий пример

Sir Rufo 19.02.2019 10:07

Удивительно, это, кажется, соответствует всем требованиям. Как только я интегрирую это и введу все данные, я смогу провести некоторое тестирование производительности. Еще раз спасибо

Tyler Hundley 20.02.2019 02:35

Была небольшая ошибка, вызванная перечислением ResourceKind - фиксированный код здесь

Sir Rufo 20.02.2019 09:51
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
11
114
0

Другие вопросы по теме