Tim
Tim

Reputation: 1

How do I get rid of huge if elseif statements?

So, I am making a small text based game and this is part of a lootbox after beating a dungeon. It's for one of the 5 items you can possibly get out of the lootbox. It checks if inventoryslot 1 is free. If not, it checks if inventoryslot 2 is free... etc etc. This results in giant if elseif statements and makes the code really messy. Are there any alternatives I can use instead of this?

if (whatitem == 1)
{
    Console.WriteLine("You got " + item5 + "(10%)");
    if (invitem1 == "")
    {
        invitem1 = item5;
        Console.Write("The item has been added to your inventory");
        Console.WriteLine(" Added to slot 1");
    }
    else if (invitem2 == "")
    {
        invitem2 = item5;
        Console.Write("The item has been added to your inventory");
        Console.WriteLine(" Added to slot 2");
    }
    else if (invitem3 == "")
    {
        invitem3 = item5;
        Console.Write("The item has been added to your inventory");
        Console.WriteLine(" Added to slot 3");
    }
    else if (invitem4 == "")
    {
        invitem4 = item5;
        Console.Write("The item has been added to your inventory");
        Console.WriteLine(" Added to slot 4");
    }
    else if (invitem5 == "")
    {
        invitem5 = item5;
        Console.Write("The item has been added to your inventory");
        Console.WriteLine(" Added to slot 5");
    }
    else if (invitem6 == "")
    {
        invitem6 = item5;
        Console.Write("The item has been added to your inventory");
        Console.WriteLine(" Added to slot 6");
    }
    else if (invitem7 == "")
    {
        invitem7 = item5;
        Console.Write("The item has been added to your inventory");
        Console.WriteLine(" Added to slot 7");
    }
    else
    {
        Console.WriteLine("No space, Reward deleted");
    }
    Console.WriteLine("Press ENTER to proceed");
}

I tried searching for solutions on google and so on, but I feel that this problem is very specific and I couldn't find a solid answer.

Upvotes: 0

Views: 92

Answers (2)

CthenB
CthenB

Reputation: 788

You need to split it up and use the 'object oriented' part of C#. Something like below (with better outlining).

public class Program
{
    public static void Main(string[] args)
    {
        var inventory = new Inventory();
        var items = new List<Item>();

        foreach (var item in items)
        {
            inventory.AddItemToInventory(item).
        }
    }
}

public class Item
{
    public string Name { get; set: }
}

public class Inventory
{
    public int Slots => 4

    public List<Item> SlotsInUse { get; set; } = new List<Item>();

    public bool AddItemToInventory(Item item)
    {
        if (SlotsInUse.Count() < Slots)
        {
            Console.WriteLine($"{item.Name} added to inventory.";
            SlotsInUse.Add(item);
        }
        else
        {
            Console.WriteLine("Your inventory is full!"
        }
    }
}

Upvotes: 1

swatsonpicken
swatsonpicken

Reputation: 883

Similar to the other answer but with examples of adding, removing and displaying the inventory:

Inventory.cs

internal class Inventory
{
    private readonly List<string> _inventory;
    private readonly uint _maximumInventorySize;

    public Inventory(uint maximumSize)
    {
        if (maximumSize < 1)
            throw new ArgumentOutOfRangeException(nameof(maximumSize), "Inventory must hold at least one item");

        _maximumInventorySize = maximumSize;
        _inventory = new List<string>();
    }

    public bool AddItem(string itemName)
    {
        if (_inventory.Count == _maximumInventorySize)
            return false;

        _inventory.Add(itemName);
        return true;
    }

    public bool RemoveItem(string itemName)
    {
        if (!_inventory.Contains(itemName))
            return false;

        _inventory.Remove(itemName);
        return true;
    }

    public override string ToString()
    {
        return _inventory.Count == 0
            ? "Nothing"
            : string.Join(", ", _inventory);
    }
}

Program.cs

internal static class Program
{
    public static void Main()
    {
        const int inventorySize = 7;
        var inventory = new Inventory(inventorySize);

        // Display the inventory.
        Console.WriteLine($"Your inventory contains: {inventory}.");

        // Attempt to overfill the inventory to get the 'No space' message.
        for (var item = 0; item < inventorySize + 1; item++)
        {
            var itemName = $"Item{item + 1}";
            if (inventory.AddItem(itemName))
                Console.Write($"{itemName} has been added to your inventory\n");
            else
                Console.WriteLine($"No space for {itemName}, reward deleted");
        }

        // Display the inventory.
        Console.WriteLine($"Your inventory contains: {inventory}.");

        // Remove odd numbered inventory items.
        for (var item = 0; item < inventorySize; item += 2)
        {
            var itemName = $"Item{item + 1}";
            inventory.RemoveItem(itemName);
        }

        // Display the inventory.
        Console.WriteLine($"After removing odd numbered items, your inventory contains: {inventory}.");

        Console.WriteLine("Press ENTER to proceed");
        Console.ReadLine();
    }
}

Upvotes: 0

Related Questions