Help with a Card Trick Program

Hi,I need help with a Card Trick Program. I need it to print out like this:

Jack of Spades 2 of Spades 4 of Diamonds
8 of Hearts 9 of Clubs Queen of Hearts
King of Spades Ace of Hearts 2 of Spades
3 of Diamonds 10 of Clubs Jack of Hearts
Queen of Clubs 7 of Diamonds 7 of Clubs
3 of Spades 10 of Hearts 9 of Diamonds
Jack of Clubs King of Diamonds 6 of Clubs

Instead, it prints a long list.

Here is my code so far:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
#include <iostream>
#include <iomanip>
#include <string>
#include <ctime>
using namespace std;
// Function prototypes
void BuildDeck( int deck[], const int size );
void PrintDeck( int deck[], const int size );
void Deal( int deck[], int play[][3] );
void PickUp( int deck[], int play[][3], int column );
void SecretCard( int deck[] );
void PrintCard( int card );
string Cap_Name( string word );
int main(void)
{
    /* declare and initialize variables */
    int column = 0, i = 0;
    string name;
    char playAgain;
    char seeDeck;
    /* Declare a 52 element array of integers to be used as the deck of cards */
    int deck[52] = {0};
    /* Declare a 7 by 3 array to receive the cards dealt to play the trick */
    int play[7][3] = {0};
    /* Generate a random seed for the random number generator. */
    srand(time(0));
    /* Opening message.  Ask the player for his/her name */
    cout << "Hello, I am a computer program that is so smart" << endl
    << "I can even perform a card trick.  Here's how." << endl
    << "To begin the card trick type in your name: ";
    cin >> name;
    /* Capitalize the first letter of the person's name. */
    name = Cap_Name(name);
    cout << endl << "Thank you " << name << endl;
    do
    {
        /* Build the deck */
        BuildDeck(deck, 52);
        /* Ask if the player wants to see the entire deck. If so, print it out. */
        cout << "Ok " + name + ", first things first.  Do you want to see what " << endl
        << "the deck of cards looks like (y/n)? ";
        cin >> seeDeck;
        if (seeDeck=='y')
        {
            cout << endl;
            PrintDeck(deck, 52);
        }
        cout << endl << name << " pick a card and remember it..." << endl;
        /* Begin the card trick loop */
        for(i = 0; i < 3; i++)
        {
            /* Begin the trick by calling the function to deal out the first 21 cards */
            Deal(deck, play);
            /* Include error checking for entering which column */
            do
            {
                /* Ask the player to pick a card and identify the column where the card is */
                cout << endl <<"Which column is your card in (0, 1, or 2)?: ";
                cin >> column;
            } while(column < 0 || column > 2);
            /* Pick up the cards, by column, with the selected column second */
            PickUp(deck, play, column);
        }
        /* Display the top ten cards, then reveal the secret card */
        SecretCard(deck);
        /* if the player wants to play again */
        cout << name << ", would you like to play again (y/n)? ";
        cin >> playAgain;
    } while(playAgain == 'y');
    /* Exiting message */
    cout << endl << endl << "Thank you for playing the card trick!" << endl;
    return 0;
}
void BuildDeck( int deck[], const int size)
{
    int used[52] = {0};
    int card = 0, i = 0;
    for(i = 0; i < 52; i++)
    {
        do
        {
            /* generate a random number between 0 and 51 */ 
            card = rand() % 52;
            /* Check the used array at the position of the card.  
             If 0, add the card and set the used location to 1.  If 1, generate another number */
        } while(used[card] == 1);
        used[card]++;
        deck[i] = card;
    }
    return;
}
void PrintDeck( int deck[], const int size )
{
    int i;
    /* Print out each card in the deck */
    for (i = 0; i < 51; i++)
    {
        PrintCard(deck[i]);
        cout << endl;
    }
}
void Deal( int deck[], int play[][3] )
{
    int row = 0, col = 0, card = 0;
    for (row = 0; row < 7; row++)
    {
        play[row][col] = deck[card];
        for (col = 0; col < 3; col++)
        {
            play[row][col] = deck[card];
            card++;
        } 
    }
    /* deal cards by passing addresses of cardvalues from
     the deck array to the play array                   */
    cout << endl;
    cout << "   Column 0           Column 1           Column 2" << endl;
    cout << "=======================================================" << endl;
    for(int row = 0; row < 7; row++)
    {
        for(int col = 0; col < 3; col++)
        {
            cout.width(5);
            PrintCard(play[row][col]);
            cout << "        ";
        }
        cout << endl;
    }
    return;
}
void PrintCard( int card ) // WORKS
{
    int rank = 0;
    int suit = 0;
    rank = card % 13, suit = (card - rank) / 13;
    // Determine the rank of the card and print it out i.e. Queen
    if (rank == 0)
        cout << "   Ace ";
    else if (rank == 9)
        cout << "   10 ";
    else if (rank == 10)
        cout << "   Jack ";
    else if (rank == 11)
        cout << "   Queen ";
    else if (rank == 12)
        cout << "   King ";
    else
        cout << "    " << rank;
        cout << " of ";
    // Determine the suit of the card and print it out i.e. of Clubs
    if (suit == 0)
        cout << " Clubs ";
    else if (suit == 1)
        cout << " Diamonds ";
    else if (suit == 2)
        cout << " Hearts ";
    else
        cout << " Spades ";
    return;
}
void PickUp( int deck[], int play[][3], int column )
{
    int card = 0, row = 0;
    for (row =0 ; row < 3; row++)
        {
            int pickupColumn = (column + row + 2) % 3;
            for(int cardInColumn = 0; cardInColumn < 7; cardInColumn++)
                {
                    deck[card++] = play[cardInColumn][pickupColumn];
                }
            }
    return;
}
void SecretCard( int deck[] )
{
    int card = 0;
    cout << endl <<"Finding secret card..." <<endl;
    for(card = 0; card < 10; card++)
    {
        cout.width(5);
        PrintCard(deck[card]);
        cout << endl;
    }
    cout << endl <<"Your secret card is: ";
    PrintCard(deck[card]);
    cout << endl;
    return;
}
// Capitalize the first letter in a string
string Cap_Name(string word)
{
    if (!word.empty())
    {
        word[0] = toupper(word[0]);
    }
    return word;
}
@Ric

I just added a few new lines in the PrintDeck() function.

1
2
3
4
5
6
7
8
9
10
11
12
13
void PrintDeck( int deck[], const int size )
{
    int i;
    /* Print out each card in the deck */
    for (i = 0; i < 52; i++)// At <51, last card will not be shown 
    {
        PrintCard(deck[i]);
		if((1+i)%3==0) // Add 1 to i, else you get a N/L on the start, with 0
			cout << endl;
		else 
			cout << " ";
     }
}
BuildDeck() and PrintDeck() don't use the size parameter. Remove it or use it.
PrintDeck() only prints 51 cards.
Line 107 has no effect.

Although the code works, it's a little fragile because there's nothing in the data that indicates when cards have been transferred from the deck to the play array or back to the deck. Instead the code "just knows" that Deal() transfers 21 cards to play and Pickup() transfers them back. This is okay here but for most card programs, you have explicitly keep track of which cards are where.
Topic archived. No new replies allowed.