thinkpad20

freecell progress

Apr 4th, 2012
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.71 KB | None | 0 0
  1. import random
  2. import numpy
  3.  
  4. class Game(object):
  5.     def __init__(self, deck):
  6.         self.deck = deck
  7.         self.table = Table(deck)
  8.         print "%d cards in deck." % len(deck)
  9.     def playGame(self):
  10.         self.table.dealCards()
  11.         numMoves = 0
  12.         print self.table
  13.         while not self.table.isGameComplete():
  14.             print "Move from where to where?"
  15.             source = raw_input("Source:")
  16.             dest = raw_input("Destination:")
  17.             cardMoved = self.table.moveCard(source,dest)
  18.             while not cardMoved:
  19.                 print "Illegal move. Move from where to where?"
  20.                 source = raw_input("Source:")
  21.                 dest = raw_input("Destination:")
  22.             numMoves += 1
  23.         print "Congrats! It took you %d moves to solve this game." % numMoves
  24.  
  25. class Table(object):
  26.     """The table where FreeCell is played. Consists of 8 CardStacks,
  27.       4 FreeCells and 4 BuildLists. Initialized with a deck of 52 cards."""
  28.     def __init__(self, deck):
  29.         self.deck = deck
  30.         self.stack1 = CardStack()
  31.         self.stack2 = CardStack()
  32.         self.stack3 = CardStack()
  33.         self.stack4 = CardStack()
  34.         self.stack5 = CardStack()
  35.         self.stack6 = CardStack()
  36.         self.stack7 = CardStack()
  37.         self.stack8 = CardStack()
  38.         self.cell1 = FreeCell()
  39.         self.cell2 = FreeCell()
  40.         self.cell3 = FreeCell()
  41.         self.cell4 = FreeCell()
  42.         self.build1 = BuildList("Hearts")
  43.         self.build2 = BuildList("Diamonds")
  44.         self.build3 = BuildList("Spades")
  45.         self.build4 = BuildList("Clubs")
  46.     def dealCards(self, fullDeck = True):
  47.         if len(self.deck) == 52:
  48.             self.stack1.populate(self.deck[:7])
  49.             self.stack2.populate(self.deck[7:14])
  50.             self.stack3.populate(self.deck[14:21])
  51.             self.stack4.populate(self.deck[21:28])
  52.             self.stack5.populate(self.deck[28:34])
  53.             self.stack6.populate(self.deck[34:40])
  54.             self.stack7.populate(self.deck[40:46])
  55.             self.stack8.populate(self.deck[46:])
  56.         else:
  57.             N = len(self.deck)/8
  58.             self.stack1.populate(self.deck[:N])
  59.             self.stack2.populate(self.deck[N:2*N])
  60.             self.stack3.populate(self.deck[2*N:3*N])
  61.             self.stack4.populate(self.deck[3*N:4*N])
  62.             self.stack5.populate(self.deck[4*N:5*N])
  63.             self.stack6.populate(self.deck[5*N:6*N])
  64.             self.stack7.populate(self.deck[6*N:7*N])
  65.             self.stack8.populate(self.deck[7*N:])
  66.         print self
  67.     def isGameComplete(self):
  68.         return self.build1.isFull() and self.build2.isFull() and self.build3.isFull() and self.build4.isFull()
  69.     def moveCard(self,source,dest):
  70.         cardMoved = False
  71.         card = source.getTopCard()
  72.         if dest.allowAdd(card):
  73.             self.source.takeCard()
  74.             self.dest.addCard(card)
  75.             cardMoved = True
  76.         print self
  77.         if self.isGameComplete():
  78.             print "Game complete! Yay!"
  79.         return cardMoved
  80.     def __str__(self):
  81.         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__()
  82.         return stringToReturn
  83.        
  84.                
  85.            
  86.  
  87. class CardStack(object):
  88.     """An ordered list of cards. Card at the end of the list is available."""
  89.     def __init__(self):
  90.         self.cardList = []
  91.     def populate(self, cardsToAdd):
  92.         self.cardList = cardsToAdd
  93.         print "Added %d cards to list." % len(cardsToAdd)
  94.     def isEmpty(self):
  95.         return len(self.cardList) == 0
  96.     def showCardList(self):
  97.         for card in self.cardList:
  98.             print card
  99.     def getTopCard(self):
  100.         if self.cardList == []:
  101.             return None
  102.         else:
  103.             return self.cardList[-1]
  104.     def allowAdd(self, cardToAdd):
  105.         topCard = self.getTopCard()
  106.         return cardToAdd.getColor() != topCard.getColor() and topCard.getNumber() - 1 == cardToAdd.getNumber()
  107.     def addCard(self,card):
  108.         self.cardList.append(card)
  109.     def addCards(self, listOfCards):
  110.         for card in listOfCards:
  111.             self.cardList.append(card)
  112.     def takeCard(self):
  113.         self.pop()
  114.     def takeCards(self, numCards):
  115.         cardsToTransfer = []
  116.         for n in range(numCards):
  117.             cardsToTransfer.append(self.cardList.pop())
  118.         return cardsToTransfer
  119.     def __str__(self):
  120.         if self.cardList == []:
  121.             stringToReturn = "Empty\n\n"
  122.         else:
  123.             stringToReturn = ""
  124.             for card in self.cardList:
  125.                 stringToReturn += card.__str__() + "\n"
  126.             stringToReturn += "\n"
  127.         return stringToReturn
  128.  
  129. class FreeCell(CardStack):
  130.     """Can contain 1 or 0 cards."""
  131.     def __init__(self):
  132.         CardStack.__init__(self)
  133.     def allowAdd(self):
  134.         return self.isEmpty()
  135.  
  136. class BuildList(CardStack):
  137.     def __init__(self, suit):
  138.         CardStack.__init__(self)
  139.         self.suit = suit
  140.         self.firstCard = Card(0,self.suit)
  141.         self.cardList = [self.firstCard]
  142.     def allowAdd(self, cardToAdd):
  143.         """Returns true if self can be placed on other in a build list."""
  144.         if self.cardList == [] and cardToAdd.getNumber == 1:
  145.             return True
  146.         else:
  147.             topCard = self.getTopCard()
  148.             return topCard.getSuit() == cardToAdd.getSuit() and topCard.getNumber() + 1 == cardToAdd.getNumber()
  149.     def isFull(self):
  150.         return self.getTopCard().getNumber() == 13
  151.        
  152.  
  153. class Card(object):
  154.     """A card in a standard deck."""
  155.     def __init__(self, number, suit):
  156.         self.number = number
  157.         self.suit = suit
  158.         if self.suit == "Hearts" or self.suit == "Diamonds":
  159.             self.color = "red"
  160.         if self.suit == "Spades" or self.suit == "Clubs":
  161.             self.color = "black"
  162.     def getNumber(self):
  163.         return self.number
  164.     def getColor(self):
  165.         return self.color
  166.     def getSuit(self):
  167.         return self.suit
  168.     def __str__(self):
  169.         if self.number == 0:
  170.             return "Empty Card (" + self.suit + ")"
  171.         elif self.number < 11 and self.number > 1:
  172.             stringToReturn = str(self.number) + " of " + self.suit
  173.         else:
  174.             if self.number == 1:
  175.                 stringToReturn = "Ace"
  176.             if self.number == 11:
  177.                 stringToReturn = "Jack"
  178.             if self.number == 12:
  179.                 stringToReturn = "Queen"
  180.             if self.number == 13:
  181.                 stringToReturn = "King"
  182.             stringToReturn += " of " + self.suit
  183.         return stringToReturn
  184.  
  185. S1 = Card(1,"Spades")
  186. S2 = Card(2,"Spades")
  187. S3 = Card(3,"Spades")
  188. S4 = Card(4,"Spades")
  189. S5 = Card(5,"Spades")
  190. S6 = Card(6,"Spades")
  191. S7 = Card(7,"Spades")
  192. S8 = Card(8,"Spades")
  193. S9 = Card(9,"Spades")
  194. S10 = Card(10,"Spades")
  195. S11 = Card(11,"Spades")
  196. S12 = Card(12,"Spades")
  197. S13 = Card(13,"Spades")
  198. H1 = Card(1,"Hearts")
  199. H2 = Card(2,"Hearts")
  200. H3 = Card(3,"Hearts")
  201. H4 = Card(4,"Hearts")
  202. H5 = Card(5,"Hearts")
  203. H6 = Card(6,"Hearts")
  204. H7 = Card(7,"Hearts")
  205. H8 = Card(8,"Hearts")
  206. H9 = Card(9,"Hearts")
  207. H10 = Card(10,"Hearts")
  208. H11 = Card(11,"Hearts")
  209. H12 = Card(12,"Hearts")
  210. H13 = Card(13,"Hearts")
  211. C1 = Card(1,"Clubs")
  212. C2 = Card(2,"Clubs")
  213. C3 = Card(3,"Clubs")
  214. C4 = Card(4,"Clubs")
  215. C5 = Card(5,"Clubs")
  216. C6 = Card(6,"Clubs")
  217. C7 = Card(7,"Clubs")
  218. C8 = Card(8,"Clubs")
  219. C9 = Card(9,"Clubs")
  220. C10 = Card(10,"Clubs")
  221. C11 = Card(11,"Clubs")
  222. C12 = Card(12,"Clubs")
  223. C13 = Card(13,"Clubs")
  224. D1 = Card(1,"Diamonds")
  225. D2 = Card(2,"Diamonds")
  226. D3 = Card(3,"Diamonds")
  227. D4 = Card(4,"Diamonds")
  228. D5 = Card(5,"Diamonds")
  229. D6 = Card(6,"Diamonds")
  230. D7 = Card(7,"Diamonds")
  231. D8 = Card(8,"Diamonds")
  232. D9 = Card(9,"Diamonds")
  233. D10 = Card(10,"Diamonds")
  234. D11 = Card(11,"Diamonds")
  235. D12 = Card(12,"Diamonds")
  236. D13 = Card(13,"Diamonds")
  237.  
  238. 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]
  239. DECK2 = DECK[:26]
  240. random.shuffle(DECK)
  241. random.shuffle(DECK2)
  242.  
  243.  
  244. g1 = Game(DECK2)
  245. g1.playGame()
Add Comment
Please, Sign In to add comment