-1
votes

Comment puis-je vérifier les choses entre 3 listes?

J'ai besoin d'aide ici avec mon code de jeu. C'est un jeu sur la préparation de plats et la livraison. Vous devez attraper des ingrédients qui sont engendrés dans le sol, lorsque vous les attrapez, ils vont dans votre inventaire.

Il existe 3 types de recettes, avec 1, 2 et 3 ingrédients. En outre, les ingrédients n'ont PAS besoin d'être en ordre dans votre inventaire pour compléter la recette, il suffit de vérifier si vous avez les bons itens. Si vous avez 3 ingrédients, il convient de vérifier dans la liste des recettes avec 3 ingrédients s'il y a quelque chose avec ces itens.

Les ingrédients ont des noms et des identifiants.

player_inventory_ingredients_id = new List<int>();
player_inventory_ingredients_name = new List<string>();

   public override void CheckRecipe(PlayerInventory playerInventory) 
    {

        foreach (IIngredient item_ingredient in playerInventory.ingredient_inventory)
        {
            player_inventory_ingredients_name.Add(item_ingredient.ingredientName);
            Debug.Log("You have " + item_ingredient.ingredientName); 
        }

        List<IRecipe> recipes_item_amount = recipes.FindAll
                      (i => i.ingredients.Count == playerInventory.ingredient_inventory.Count);



        foreach (IRecipe recipe_name in recipes_item_amount)
        {
            Debug.Log("Possible recipes are " + recipe_name.recipe_name);

            List<string> recipe_temp = new List<string>();
            IEnumerable<string> test_the_names = player_inventory_ingredients_name.Except(recipe_temp);

            foreach (IIngredient ingredients in recipe_name.ingredients)
            {
                Debug.Log(recipe_name + " ingredient is: " + ingredients);

                recipe_temp.Add(ingredients.ingredientName);
            }
        }    

}

Les recettes sont une liste de IIngredient, et la recette a un nom:

public class PlayerInventory : IInventory
{

    public PlayerInventory()
    {
        this.ingredient_inventory = new List<IIngredient>();
    }

    public override void AddIngredient(IIngredient ingredient)
    {
        ingredient_inventory.Add(ingredient);
    }
}

Et l'inventaire

public abstract class IInventory
{
    public List<IIngredient> ingredient_inventory; 
    public abstract void AddIngredient(IIngredient ingredient);
}

L'inventaire des joueurs:

public abstract class IRecipe {
    public List<IIngredient> ingredients;
    public string recipe_name;
}

Lorsque je livre l'article, je veux vérifier le nombre d'itens que j'ai dans mon inventaire, pour savoir quelles recettes je dois comparer, et après, essayer de faire correspondre mes itens avec toutes les recettes qui contiennent la même quantité d'ingrédients. Si une recette correspond, je veux savoir de qui il s'agit.

J'utilise ce code, mais cela ne fonctionne pas:

public abstract class IIngredient : IItem {
    public string ingredientName;
    public int ingredientId;
}

Le dernier bloc de code, que j'essaie de vérifier et de vérifier si j'ai les itens, ne montre aucun résultat. Je ne sais même pas si le code que j'ai écrit a du sens hehe


12 commentaires

Le dernier bloc de code, que j'essaie de vérifier et de vérifier si j'ai les itens, ne montre aucun résultat. Je ne sais même pas si le code que j'ai écrit a du sens hehe


Ensuite, vous avez besoin de trois boucles for imbriquées 1) Utilisateur 2) nom de la recette 3) ingrédients


@GertArnold l'a fait! Merci!


@jdweng cela vous dérange-t-il de l'écrire?


Où est la liste des joueurs. Je ne vois pas d'où vous obtenez le nom du joueur?


En fait, quiconque possède une classe «PlayerInventory» a un inventaire. Pour l'instant, je teste avec un seul joueur.


J'ai des problèmes de logique pour tester si l'itens du joueur correspond à l'une des recettes possibles


laissez-moi modifier l'article et ajoutez ce code pour que vous puissiez voir


Où est le nom du joueur? quel est le lien entre le nom et PlayerInventory?


Le nom du joueur n'a pas d'importance dans ce cas, cette partie du code est résolue, ce qui n'est pas résolu, c'est comment vérifier si un inventaire, c'est-à-dire une liste d'ingrédients => playerInventory.ingredients a le même itens de n'importe quelle recette dans recette_élément_amount


Vous avez besoin de trois boucles for imbriquées 1) Recette 2) Ingrédients de recette 3) Ingrédients du joueur. puis vérifiez si les boucles 2 et 3 correspondent.


Je vais ajouter une réponse possible, pourriez-vous vérifier s'il vous plaît si c'est ce que vous voulez dire?


4 Réponses :


0
votes

Peut-être quelque chose comme ça?

for (int i = 0; i < recipes_item_amount.Count; i++)
{
    int item_ok=0;

    for (int f = 0; f < recipes_item_amount[i].ingredients.Count; f++)
    {
        if (item_ok == recipes_item_amount[i].ingredients.Count)
        {
            Debug.Log(recipes_item_amount[i].recipe_name);
        }

        for (int v = 0; v < playerInventory.ingredient_inventory.Count; v++)
        {
            if (playerInventory.ingredient_inventory[v].ingredientName == recipes_item_amount[i].ingredients[f].ingredientName)
            {
                Debug.Log("This item matchs");
                item_ok++;
                break;
            }
            else 
            {
                Debug.Log("This item doesn't match");
            }
        }
    }

Mais je n'ai pas le nom de la recette, le débogage montre juste que:

Journal de débogage


2 commentaires

Oui. Mais vous n'avez besoin de trouver qu'une seule correspondance. Donc, avant de passer à la dernière boucle for, vous avez une variable: Boolean found = false. Ensuite, lorsque vous obtenez une correspondance, vous définissez true et quittez en dernier la boucle for. Le "ne correspond pas" se produit uniquement si trouvé == false.


poster une autre réponse >>>>



0
votes

Est-ce que ça fait du sens? Il ne montre pas les bonnes réponses :(

for (int i = 0; i < recipes_item_amount.Count; i++)
{

    for (int f = 0; f < recipes_item_amount[i].ingredients.Count; f++)
    {
        bool found = false;
        for (int v = 0; v < playerInventory.ingredient_inventory.Count; v++)
        {
            if (playerInventory.ingredient_inventory[v].ingredientName == recipes_item_amount[i].ingredients[f].ingredientName)
            {
                Debug.Log("This item matchs : " + recipes_item_amount[i].ingredients[f].ingredientName);
                found = true;
                break;
            }
            else
            {
                Debug.Log("This item doesn't match: " + recipes_item_amount[i].ingredients[f].ingredientName);
            }
        }
        if (!found)
        {
            Debug.Log(recipes_item_amount[i].recipe_name);
        }
    }
}

J'ai déplacé le code.

bool found = false;

for (int i = 0; i < recipes_item_amount.Count; i++)
{           

    if (!found)
    {
        Debug.Log(recipes_item_amount[i].recipe_name);
    }

    for (int f = 0; f < recipes_item_amount[i].ingredients.Count; f++)
    {          
        for (int v = 0; v < playerInventory.ingredient_inventory.Count; v++)
        {
            if (playerInventory.ingredient_inventory[v].ingredientName == recipes_item_amount[i].ingredients[f].ingredientName)
            {
                Debug.Log("This item matchs : " + recipes_item_amount[i].ingredients[f].ingredientName);
                found = true;
                break;
            }
            else 
            {
                Debug.Log("This item doesn't match: " + recipes_item_amount[i].ingredients[f].ingredientName);
            }
        }
    }
}


2 commentaires

Merci beaucoup!!! Cela fonctionne quand j'ai un article dans la recette, mais les recettes avec 2 ou 3 itens ça n'a pas fonctionné


Il vous manque peut-être des ingrédients!



0
votes

Je l'ai finalement fait, merci beaucoup @jdweng pour votre aide!

for (int i = 0; i < recipes_item_amount.Count; i++)
{
    int have_item = 0;

    for (int f = 0; f < recipes_item_amount[i].ingredients.Count; f++)
    {
        for (int v = 0; v < playerInventory.ingredient_inventory.Count; v++)
        {
            if (playerInventory.ingredient_inventory[v].ingredientName == recipes_item_amount[i].ingredients[f].ingredientName)
            {
                Debug.Log("This item matchs : " + recipes_item_amount[i].ingredients[f].ingredientName);
                have_item++;
                Debug.Log(have_item);
                break;
            }
            else
            {
                Debug.Log("This item doesn't match: " + recipes_item_amount[i].ingredients[f].ingredientName);
            }
        }
        if (have_item == playerInventory.ingredient_inventory.Count)
        {
            Debug.Log(recipes_item_amount[i].recipe_name);
        }
    }


0 commentaires

0
votes

Que dis-tu de ça:

        var ingredientIds = playerInventory.ingredient_inventory.Select(i => i.ingredientId).ToList();

        var recipiesMatchingAllTheIngredients = recipes.Where(r => r.ingredients.Count == ingredientIds.Count &&
            r.ingredients.All(i => ingredientIds.Contains(i.ingredientId)))
            .ToList();

Linq est génial :)


0 commentaires