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

  • Context: Python 
  • Thread starter Thread starter Sthiel
  • Start date Start date
  • Tags Tags
    Game Memory Python
Join the discussion
Ask a follow-up here, or get your own question answered by working scientists, mathematicians and engineers — people, not an autocomplete.
Real named experts · corrections over time · the nuance an AI answer skips
7 replies · 7K views
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
 
Physics news on Phys.org
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.
 
Yes precisely. So how would you suggest I initialize the list?