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
Click For Summary

Discussion Overview

The discussion revolves around implementing a memory matching game in Python, focusing on the design of classes for the game, specifically the Deck class and how to efficiently initialize and shuffle a list of card values. The scope includes programming concepts and technical implementation details.

Discussion Character

  • Technical explanation
  • Debate/contested
  • Mathematical reasoning

Main Points Raised

  • One participant suggests creating a Deck class using a dictionary for card values but questions its necessity.
  • Another participant recommends using a list for the Deck class, populated with Card objects in order, and mentions the utility of the random module for shuffling.
  • A participant expresses concern about the inefficiency of manually writing all card values, suggesting there might be a simpler way to generate them.
  • Another participant clarifies that the game does not use a standard deck of cards, but rather a custom set of numbered cards ranging from 1 to N, where N is at most 36, with two of each number.
  • One participant suggests using a loop or the map() function to initialize the list of cards efficiently.

Areas of Agreement / Disagreement

Participants generally agree on the need for a list to represent the deck of cards, but there is some confusion regarding the total number of cards and their values, leading to differing interpretations of the game's requirements.

Contextual Notes

There are unresolved assumptions regarding the maximum number of cards and the method of initializing the card values. The discussion reflects varying levels of understanding about the game's structure and requirements.

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.
 

Similar threads

  • · Replies 3 ·
Replies
3
Views
4K
  • · Replies 4 ·
Replies
4
Views
3K
Replies
6
Views
3K
  • · Replies 17 ·
Replies
17
Views
3K
  • · Replies 3 ·
Replies
3
Views
2K
  • · Replies 33 ·
2
Replies
33
Views
7K
  • · Replies 7 ·
Replies
7
Views
8K
  • · Replies 6 ·
Replies
6
Views
5K
Replies
29
Views
5K
  • · Replies 1 ·
Replies
1
Views
3K