[Tutor] Question : Creating cribbage game

spir denis.spir at free.fr
Mon Dec 7 20:14:56 CET 2009


Christopher schueler <chris_schueler at hotmail.com> dixit:

> 
> My name is Chris Schueler and i am having some troubles with my Python programming
> 
>  
> 
> Our current project is to create the game of cribbage from scratch.
> 
> The only problem is we are not allowed to use classes, only user-defind functions and arrays. I was wondering if anybody could give me tips or pointers on adding codes or modifying some of my program


From my limited experience in coding games. You have to model several distinct aspects:
* Constant data about the game, such as a card set.
* The game logic, mirroring the (real) game rules, ie what players can do, and what comes out of their actions.
* The game state, what's the situation at a given point in time, constantly modified by the above actions.
* Possibly some AI if the computer plays a role.
Note that first 2 points are predefined aspects (constants in the plain sense of the word).

Forbidding OO is a very bad thing because game modelling is precisely a programming domain in which this paradigm applies very naturally : every element in the game (state) is an "object" that can be modified through methods representing game rules.
Python dicts offer a powerful tool to represent kinds of objects, when used as records (lookup in wikipedia if you don't see what I mean). Moreover, python functions beeing "namable" objects, you can even attach relevant funcs to records so as to simulate methods. All you miss then is typical OO syntactic sugar where 'self' is automagically inserted as first argument of a method call. Instead of
   hand.popCard(card)
you need to write
   hand.popCard(hand, card)

Some more comments below in  your code.

> Here is my Program so far
> 
> I will also include a .py file of it incase this doesnt look legible
> 
>  
> 
> from random import*
> 
>  
> 
> 
> def DisplayTitle():
>     print
>     print "Welcome to Tech-Sauve Cribbage"
>     print "--------------------------------------------"
>     print "               Insctructions                "
>     print "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
>     print "1) Only played with two players (for now)   "
>     print "2) The program starts with a full deck of 52 cards"
>     print "3) Deals out 6 cards to each player with a Suit letter"
>     print "4) Then asks each player what 2 cards they want to discard to the crib"
>     print "5) Then the program saves the crib in a temporary deck"
>     print "6) Players start showing cards to get an ammount equal to 31"
>     print "7) Once all the cards have been played, program counts the score"
>     print "8) Then the program will count all possible scores in each hand"
>     print "   And it will add the players points to their total score"
>     print "9) First player to reach a score of 121 wins the game"

This is a single string to write. Use multiline strings inside triple quotes """...""" and write in a single instruction. No need for a func.

> #Gets players names
> def GetPlayer1():
>     print
>     Player1 = str(raw_input("Player 1's name "))
>     return Player1
> def GetPlayer2():
>     print
>     Player2 = str(raw_input("Player 2's name "))
>     return Player2

This is twice the same func. Write a single one with a parameter representing a player, then call it twice. You'd better use a dict for each player because doubt the only relevant info is their name. Why not attach their hand, score, or whatever to the structures representing players?
player1 = {name:None, more:foo}
player2 = {name:None, more:foo}
def getPlayerName(player):
   # (raw_input already returns a string)
   player["name"] = raw_input("Player 1's name ")
getPlayerName(player1)
getPlayerName(player2)

> #Building the deck
> def Build_Deck():
>     for R in range (0,52):
>         cardnumb = numbers[R]
>         cardsuit = suits[R]
>         card = str(numbers[R])+str(suits[R])
>         Deck.append(card)
>     return Deck,numbers,suits,card,cardnumb,cardsuit

This func should only return Deck. Card cardnum, cardsuit are local variables used obly in the func, suits and numbers are input instead:

def Build_Deck(suits, number, card_count):
    # 52 is also a predefined constant, namely here called card_count
    for R in range (0,card_count):
        cardnumb = numbers[R]
        cardsuit = suits[R]
        card = str(numbers[R])+str(suits[R])
        Deck.append(card)
    return Deck
... define constants about card: card_count, suits and numbers ...
Deck = Build_Deck(suits, number)

You'd better represent each card with a pair {"suit":suit, "number":number} so as to be able to compare their strength (unless this is irrelevant for this game).

> #Variables Needed
> numbers = ["A","2","3","4","5","6","7","8","9","10","J","Q","K"]*4
> suits = ["H","C","S","D"]*13
> suits.sort()
> Deck = []
> P1hand = []
> P2hand = []
> Crib = []
> Cribcard = []
> Cribsuit = []
> P1_score = 0
> P2_score = 0
> Winner = 121
> ele = 52

All non-null things above are constants that define the game. Empty and zero things are variables that will be part of the game state. You'd better separate this clearly.
You define ele (?) but don't use it.

I haven't gone farther in reading the code. Strongly missing is some structure in code, both for data and logic. Start woth grouping things inside dictionaries and organising code with a main() func.

Denis

> Deck,numbers,suits,card,cardnumb,cardsuit = Build_Deck()
> for X in range(0,6):
>     Y = randint(0,ele)
>     draw = Deck[Y]
>     P1hand.append(draw)
>     Deck.pop(Y)
>     ele -= 1
> for X2 in range (0,6):
>     Y1 = randint(0,ele)
>     draw2 = Deck[Y1]
>     P2hand.append(draw2)
>     Deck.pop(Y1)
>     ele -= 1
> print
> Top = randint(0,47)
> Topcard = Deck[Top]
> print
> for count in range(0,2):
>     print P1hand
>     print
>     option = str(raw_input("Player 1,what CARD would you like to add to the crib?  CARDS 1 thru 6 "))
>     if option == "1":
>         Crib.append(P1hand[0])
>         P1hand.pop(0)
>     elif option == "2":
>         Crib.append(P1hand[1])
>         P1hand.pop(1)
>     elif option == "3":
>         Crib.append(P1hand[2])
>         P1hand.pop(2)
>     elif option == "4":
>         Crib.append(P1hand[3])
>         P1hand.pop(3)
>     elif option == "5":
>         Crib.append(P1hand[4])
>         P1hand.pop(4)
>     elif option == "6":
>         Crib.append(P1hand[5])
>         P1hand.pop(5)
> print
> for c2 in range(0,2):
>     print P2hand
>     print
>     option1 = str(raw_input("Player 2, what CARD would you like to add to the crib?  CARDS 1 thru 6 "))
>     if option1 == "1":
>         Crib.append(P2hand[0])
>         P2hand.pop(0)
>     elif option1 == "2":
>         Crib.append(P2hand[1])
>         P2hand.pop(1)
>     elif option1 == "3":
>         Crib.append(P2hand[2])
>         P2hand.pop(2)
>     elif option1 == "4":
>         Crib.append(P2hand[3])
>         P2hand.pop(3)
>     elif option1 == "5":
>         Crib.append(P2hand[4])
>         P2hand.pop(4)
>     elif option1 == "6":
>         Crib.append(P2hand[5])
>         P2hand.pop(5)
> 
> print Deck
> print "The TOP CARD is ",Topcard
> print "Player 1's Hand is ",P1hand
> print "Player 2's Hand is ",P2hand
> print "The 4 cards in the Crib are ",Crib
>  		 	   		  
> _________________________________________________________________
> Ready. Set. Get a great deal on Windows 7. See fantastic deals on Windows 7 now
> http://go.microsoft.com/?linkid=9691818



________________________________

la vita e estrany

http://spir.wikidot.com/


More information about the Tutor mailing list