Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import random
- import numpy
- class Game(object):
- def __init__(self, deck):
- self.deck = deck
- self.table = Table(deck)
- print "%d cards in deck." % len(deck)
- def playGame(self):
- self.table.dealCards()
- numMoves = 0
- print self.table
- while not self.table.isGameComplete():
- print "Move from where to where?"
- source = raw_input("Source:")
- dest = raw_input("Destination:")
- cardMoved = self.table.moveCard(source,dest)
- while not cardMoved:
- print "Illegal move. Move from where to where?"
- source = raw_input("Source:")
- dest = raw_input("Destination:")
- numMoves += 1
- print "Congrats! It took you %d moves to solve this game." % numMoves
- class Table(object):
- """The table where FreeCell is played. Consists of 8 CardStacks,
- 4 FreeCells and 4 BuildLists. Initialized with a deck of 52 cards."""
- def __init__(self, deck):
- self.deck = deck
- self.stack1 = CardStack()
- self.stack2 = CardStack()
- self.stack3 = CardStack()
- self.stack4 = CardStack()
- self.stack5 = CardStack()
- self.stack6 = CardStack()
- self.stack7 = CardStack()
- self.stack8 = CardStack()
- self.cell1 = FreeCell()
- self.cell2 = FreeCell()
- self.cell3 = FreeCell()
- self.cell4 = FreeCell()
- self.build1 = BuildList("Hearts")
- self.build2 = BuildList("Diamonds")
- self.build3 = BuildList("Spades")
- self.build4 = BuildList("Clubs")
- def dealCards(self, fullDeck = True):
- if len(self.deck) == 52:
- self.stack1.populate(self.deck[:7])
- self.stack2.populate(self.deck[7:14])
- self.stack3.populate(self.deck[14:21])
- self.stack4.populate(self.deck[21:28])
- self.stack5.populate(self.deck[28:34])
- self.stack6.populate(self.deck[34:40])
- self.stack7.populate(self.deck[40:46])
- self.stack8.populate(self.deck[46:])
- else:
- N = len(self.deck)/8
- self.stack1.populate(self.deck[:N])
- self.stack2.populate(self.deck[N:2*N])
- self.stack3.populate(self.deck[2*N:3*N])
- self.stack4.populate(self.deck[3*N:4*N])
- self.stack5.populate(self.deck[4*N:5*N])
- self.stack6.populate(self.deck[5*N:6*N])
- self.stack7.populate(self.deck[6*N:7*N])
- self.stack8.populate(self.deck[7*N:])
- print self
- def isGameComplete(self):
- return self.build1.isFull() and self.build2.isFull() and self.build3.isFull() and self.build4.isFull()
- def moveCard(self,source,dest):
- cardMoved = False
- card = source.getTopCard()
- if dest.allowAdd(card):
- self.source.takeCard()
- self.dest.addCard(card)
- cardMoved = True
- print self
- if self.isGameComplete():
- print "Game complete! Yay!"
- return cardMoved
- def __str__(self):
- stringToReturn = "FreeCell 1:\n" + self.cell1.__str__() + "FreeCell 2:\n" + self.cell2.__str__() + "FreeCell 3:\n" + self.cell3.__str__() + "FreeCell 4:\n" + self.cell4.__str__() + "BuildList 1:\n" + self.build1.__str__() + "BuildList 2:\n" + self.build2.__str__() + "BuildList 3:\n" + self.build3.__str__() + "BuildList 4:\n" + self.build4.__str__() + "CardStack 1:\n" + self.stack1.__str__() + "CardStack 2:\n" + self.stack2.__str__() + "CardStack 3:\n" + self.stack3.__str__() + "CardStack 4:\n" + self.stack4.__str__() + "CardStack 5:\n" + self.stack5.__str__() + "CardStack 6:\n" + self.stack6.__str__() + "CardStack 7:\n" + self.stack7.__str__() + "CardStack 8:\n" + self.stack8.__str__()
- return stringToReturn
- class CardStack(object):
- """An ordered list of cards. Card at the end of the list is available."""
- def __init__(self):
- self.cardList = []
- def populate(self, cardsToAdd):
- self.cardList = cardsToAdd
- print "Added %d cards to list." % len(cardsToAdd)
- def isEmpty(self):
- return len(self.cardList) == 0
- def showCardList(self):
- for card in self.cardList:
- print card
- def getTopCard(self):
- if self.cardList == []:
- return None
- else:
- return self.cardList[-1]
- def allowAdd(self, cardToAdd):
- topCard = self.getTopCard()
- return cardToAdd.getColor() != topCard.getColor() and topCard.getNumber() - 1 == cardToAdd.getNumber()
- def addCard(self,card):
- self.cardList.append(card)
- def addCards(self, listOfCards):
- for card in listOfCards:
- self.cardList.append(card)
- def takeCard(self):
- self.pop()
- def takeCards(self, numCards):
- cardsToTransfer = []
- for n in range(numCards):
- cardsToTransfer.append(self.cardList.pop())
- return cardsToTransfer
- def __str__(self):
- if self.cardList == []:
- stringToReturn = "Empty\n\n"
- else:
- stringToReturn = ""
- for card in self.cardList:
- stringToReturn += card.__str__() + "\n"
- stringToReturn += "\n"
- return stringToReturn
- class FreeCell(CardStack):
- """Can contain 1 or 0 cards."""
- def __init__(self):
- CardStack.__init__(self)
- def allowAdd(self):
- return self.isEmpty()
- class BuildList(CardStack):
- def __init__(self, suit):
- CardStack.__init__(self)
- self.suit = suit
- self.firstCard = Card(0,self.suit)
- self.cardList = [self.firstCard]
- def allowAdd(self, cardToAdd):
- """Returns true if self can be placed on other in a build list."""
- if self.cardList == [] and cardToAdd.getNumber == 1:
- return True
- else:
- topCard = self.getTopCard()
- return topCard.getSuit() == cardToAdd.getSuit() and topCard.getNumber() + 1 == cardToAdd.getNumber()
- def isFull(self):
- return self.getTopCard().getNumber() == 13
- class Card(object):
- """A card in a standard deck."""
- def __init__(self, number, suit):
- self.number = number
- self.suit = suit
- if self.suit == "Hearts" or self.suit == "Diamonds":
- self.color = "red"
- if self.suit == "Spades" or self.suit == "Clubs":
- self.color = "black"
- def getNumber(self):
- return self.number
- def getColor(self):
- return self.color
- def getSuit(self):
- return self.suit
- def __str__(self):
- if self.number == 0:
- return "Empty Card (" + self.suit + ")"
- elif self.number < 11 and self.number > 1:
- stringToReturn = str(self.number) + " of " + self.suit
- else:
- if self.number == 1:
- stringToReturn = "Ace"
- if self.number == 11:
- stringToReturn = "Jack"
- if self.number == 12:
- stringToReturn = "Queen"
- if self.number == 13:
- stringToReturn = "King"
- stringToReturn += " of " + self.suit
- return stringToReturn
- S1 = Card(1,"Spades")
- S2 = Card(2,"Spades")
- S3 = Card(3,"Spades")
- S4 = Card(4,"Spades")
- S5 = Card(5,"Spades")
- S6 = Card(6,"Spades")
- S7 = Card(7,"Spades")
- S8 = Card(8,"Spades")
- S9 = Card(9,"Spades")
- S10 = Card(10,"Spades")
- S11 = Card(11,"Spades")
- S12 = Card(12,"Spades")
- S13 = Card(13,"Spades")
- H1 = Card(1,"Hearts")
- H2 = Card(2,"Hearts")
- H3 = Card(3,"Hearts")
- H4 = Card(4,"Hearts")
- H5 = Card(5,"Hearts")
- H6 = Card(6,"Hearts")
- H7 = Card(7,"Hearts")
- H8 = Card(8,"Hearts")
- H9 = Card(9,"Hearts")
- H10 = Card(10,"Hearts")
- H11 = Card(11,"Hearts")
- H12 = Card(12,"Hearts")
- H13 = Card(13,"Hearts")
- C1 = Card(1,"Clubs")
- C2 = Card(2,"Clubs")
- C3 = Card(3,"Clubs")
- C4 = Card(4,"Clubs")
- C5 = Card(5,"Clubs")
- C6 = Card(6,"Clubs")
- C7 = Card(7,"Clubs")
- C8 = Card(8,"Clubs")
- C9 = Card(9,"Clubs")
- C10 = Card(10,"Clubs")
- C11 = Card(11,"Clubs")
- C12 = Card(12,"Clubs")
- C13 = Card(13,"Clubs")
- D1 = Card(1,"Diamonds")
- D2 = Card(2,"Diamonds")
- D3 = Card(3,"Diamonds")
- D4 = Card(4,"Diamonds")
- D5 = Card(5,"Diamonds")
- D6 = Card(6,"Diamonds")
- D7 = Card(7,"Diamonds")
- D8 = Card(8,"Diamonds")
- D9 = Card(9,"Diamonds")
- D10 = Card(10,"Diamonds")
- D11 = Card(11,"Diamonds")
- D12 = Card(12,"Diamonds")
- D13 = Card(13,"Diamonds")
- DECK = [S1,S2,S3,S4,S5,S6,S7,S8,S9,S10,S11,S12,S13,H1,H2,H3,H4,H5,H6,H7,H8,H9,H10,H11,H12,H13,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,D1,D2,D3,D4,D5,D6,D7,D8,D9,D10,D11,D12,D13]
- DECK2 = DECK[:26]
- random.shuffle(DECK)
- random.shuffle(DECK2)
- g1 = Game(DECK2)
- g1.playGame()
Add Comment
Please, Sign In to add comment