crin
crin

Reputation: 73

Creating a simple deck of cards C#

I'm trying to create a deck of 52 cards with the 4 suits: spades, hearts, clubs, and diamonds. I tried to create this for loop in my Deck class but seem to be running into some problems regarding actually getting the program to do what I want. I'm thinking maybe I could do 4 for loops as the assignment hinted at, but is it possible to use if/else-ifs to create 4 suits within the deck?

class Deck
{
    private Card[] cards;

    public Deck()
    {
        cards = new Card[52];
        int check = 0;

        for (int suitVal = 1; suitVal < 4; suitVal++)
        {
            for (int rankVal = 1; rankVal < 14; rankVal++)
            {
                if(suitVal == 1)
                {
                    cards[check] = new Card(rankVal, "Spades");
                }
                else if (suitVal == 2)
                {
                    cards[check] = new Card(rankVal, "Hearts");
                }
                else if (suitVal == 3)
                {
                    cards[check] = new Card(rankVal, "Clubs");
                }
                else if (suitVal == 4)
                {
                    cards[check] = new Card(rankVal, "Diamonds");
                }
            }
        }

    }

Upvotes: 1

Views: 21018

Answers (2)

Enigmativity
Enigmativity

Reputation: 117057

You could do it these ways:

class Deck
{
    private Card[] cards;

    public Deck()
    {
        cards =
            new [] { "Spades", "Hearts", "Clubs", "Diamonds", }
                .SelectMany(
                    suit => Enumerable.Range(1, 13),
                    (suit, rank) => new Card(rank, suit))
                .ToArray();
    }
}

Or:

class Deck
{
    private Card[] cards;

    public Deck()
    {
        var query =
            from suit in new [] { "Spades", "Hearts", "Clubs", "Diamonds", }
            from rank in Enumerable.Range(1, 13)
            select new Card(rank, suit);

        cards = query.ToArray();
    }
}

Or:

class Deck
{
    private Card[] cards;

    public Deck()
    {
        cards = new Card[52];
        var index = 0;

        foreach (var suit in new [] { "Spades", "Hearts", "Clubs", "Diamonds", })
        {
            for (var rank = 1; rank <= 13; rank++)
            {
                cards[index++] = new Card(rank, suit);
            }
        }
    }
}

Upvotes: 2

victor
victor

Reputation: 1552

Yes, it is possible. There are 13 cards and 4 suits. The idea is that for each suit, you create 13 cards with of said suit. The pseudo code is pretty much what you have already got:

for each of the four suits
   loop 13 times for said suit

Here are the problems with your code:

1- Your check variable is never incremented, so you always overwrite the card on the position 0; It should increment after every card inserted (inner loop)

2- Your outter loop only runs 3 times (i = 1, i = 2, i = 3), and there are 4 suits.

Let me know if you need more help.

Upvotes: 6

Related Questions