Python How can I efficiently shuffle and deal cards for a simple memory game in Python?

AI Thread Summary
The discussion focuses on developing a memory matching game in Python, involving three classes: Card, Deck, and Game. The Card class manages individual card values and states, while the Deck class handles card storage, shuffling, and dealing. The Game class orchestrates gameplay, including board setup and user interactions. There's a debate about efficiently initializing the Deck class, with suggestions to use a list for card values instead of a dictionary, and to generate card numbers programmatically to avoid redundancy. The game mechanics involve players flipping two cards at a time, with matching pairs remaining face up until all cards are matched.
Sthiel
Messages
5
Reaction score
0
So I'm working on a simple memory game nonGUI: Write a program that plays the memory matching game. When it start, the program prompts the user for the number of rows and columns for the game board that contains the cards. The total number of cards must be even. Assume that the board dimensions are at most 8 by 9 or 9 by 8. You cards must be numbered from 1 through (number of rows * number of columns) / 2. Your program allows the player to specify the cards that she would like to select through a coordinate system as shown in the sample run below. All the cards that are face down are indicated by *


So far I am making 3 classes. Card, Deck and Game. Card will be used to store both the card's value and face (up or down). Deck to contain the cards needed. Its methods include a mthod to deal a card, another for shuffling the deck, and a method that returns number of cards left in the deck. The class Game simulates playing a single game and represents the interaction between the user and the other classes. Its instance members store a 2D list (of card objects) representing the game board where the cards are placed, number of rows and number of columns of the game board. Among the instance methods of the Game class: play(), which simulates playing the game; isGameOver(), which checks whether or not the game is over; displayBoard(), which displays the board; populateBoard(), which creates the initial 2D list of identical pairs of cards with all the cards facing down.


So the first question I have is regarding the deck class. I was going to create a dictionary for the cards but I am not sure if I would need to include all the possible card values or I am assuming there is an easier way of writing that.

Any input on this first question or any input really would be appreciated. And I will probably have more questions as I go along. Thank you
 
Technology news on Phys.org
If I were you I'd stick with a list for the Deck class. Populate it with Cards in order, then shuffle them. The random module might help with that.
 
So in the list there would be a max of 72 cards. It would be inefficient i feel to write all 72 values in the last, so I am assuming there is an easier way to write that.
 
Sthiel said:
So in the list there would be a max of 72 cards. It would be inefficient i feel to write all 72 values in the last, so I am assuming there is an easier way to write that.
How are you getting 72 cards? A standard deck contains 52 cards, A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K in four suits, clubs, spades, diamonds, and hearts. That's 13 x 4 = 52.

It's really not that hard to create a list of 52 items, especially since there is a lot of repetition. Using copy and paste you can create the list in very little time.

As an alternative, you could have two lists: a list of the ranks (A, 2, ..., 10, J, Q, K) and a list of the four suits. By generating one random number in the range 0 through 12 you can get the rank, and by generating another random number in the range 0 through 3, you can get the suit.
 
Mark44 said:
How are you getting 72 cards? A standard deck contains 52 cards ...
This isn't a standard deck. Cards have numbers only, with card numbers ranging from 1 to N, where N is at most 36. The deck contains two cards of each number.

My understanding: All cards are dealt face down initially in a rectangular grid. On each turn, the player identifies two of the face-down cards. These two cards are (briefly) flipped face-up. If they match, they stay face up. If they don't match, they're flipped back over face-down. The play continues until all cards have been matched; no face down cards remain to be tested.
 
Oops! Didn't read the statement very carefully.
 
Yes precisely. So how would you suggest I initialize the list?
 
Use a loop, or a call to map(). Then shuffle.
 
Back
Top