Changeset 9
- Timestamp:
- 02/03/08 10:09:51 (11 months ago)
- Files:
-
- 4 modified
Legend:
- Unmodified
- Added
- Removed
-
deck.py
r3 r9 1 1 import random 2 suits= ['spades', 'clubs', 'hearts', 'diamonds']3 cards= [2,3,4,5,6,7,8,9,10,'J','Q','K','A']4 default_deck = [ (card,suit) for card in cards for suit in suits]2 SUITS = ['spades', 'clubs', 'hearts', 'diamonds'] 3 CARDS = [2,3,4,5,6,7,8,9,10,'J','Q','K','A'] 4 DEFAULT_DECK = [ (card,suit) for card in CARDS for suit in SUITS ] 5 5 6 6 def card_vals(cards): … … 19 19 self.cards = [] 20 20 for i in range(0, self.n_decks): 21 self.cards += default_deck[:]21 self.cards += DEFAULT_DECK[:] 22 22 random.shuffle(self.cards) 23 23 -
hand.py
r6 r9 1 1 import deck 2 2 3 hand_orders= [ "high_card",3 HAND_ORDERS = [ "high_card", 4 4 "pair", 5 5 "two_pair", … … 16 16 if not ret: ret = is_n_kinds([a for (a,b) in cards]) 17 17 #replace the text with a value 18 return ( hand_orders.index(ret[0]), ret[1])18 return (HAND_ORDERS.index(ret[0]), ret[1]) 19 19 20 20 … … 95 95 for cc in combNoReplace(cards[i+1:],n-1): 96 96 #Aces can have 2 values 97 if cards[i]==deck. cards.index("A"): yield [-1]+cc97 if cards[i]==deck.CARDS.index("A"): yield [-1]+cc 98 98 yield [cards[i]]+cc 99 99 -
holdemtable.py
r8 r9 1 1 import deck 2 2 import random 3 from twisted.internet import defer 3 4 4 5 class player: … … 12 13 self.action_history = [] 13 14 15 def nextHand(self): 16 self.cards = [] 17 self.actionHistory = [] 18 14 19 def publicData(self): 15 20 return {"owner" : self.user_id, … … 22 27 "required_action": self.required_action, 23 28 "cards" : self.cards} 24 if self.required_action:25 dat["possible_actions"] = possibleActions()26 29 return dat 27 30 def actionHistory(self): 28 31 return self.action_history 29 def possibleActions(self): 32 33 def dealCard(self, card): 34 self.cards.append(card) 35 #returns money added to pot if any 36 def doAction(self, action): 37 self.action_history.append( action ) 38 39 def inHand(self): 40 #TODO need to change this 41 return True 42 43 PHASES = ["blinds", "flop", "turn", "river"] 44 class holdemround: 45 def __init__(self, players): 46 self.deck = deck.deck() 47 #keep both of these on hand so we can quickly find a player 48 self.players = players 49 self.player_array = players.values() 50 self.player_array.sort( cmp=lambda x,y: x.seat - y.seat) ) 51 self.action_on = None 52 self.phase = 0 53 self.community_cards = None 54 self.pot = None 55 pass 56 57 #return false if game is over 58 def nextHand(self): 59 self.deck.shuffle() 60 self.action_on = 0 61 #rotate the players 62 self.player_array = self.player_array.append(self.player_array.pop(0)) 63 self.phase = 0 64 self.pot = 0.0 65 self.community_cards = [] 66 for p in self.player_array: p.nextHand() 67 #deal cards 68 for _ in xrange(2): for p in self.player_array: 69 p.dealCard(self.deck.deal()) 70 return True 71 72 #returns false if hand is over 73 def nextPhase(self): 74 self.phase += 1 75 if self.phase == len(PHASES): return False 76 return True 77 78 #returns false if phase is over 79 def nextAction(self): 80 self.action_on = ( self.button_on + 1 ) % len(self.player_array) 81 return True 82 83 #returns possible actions for a player 84 def possibleActions(self, player_id): 30 85 return {} 86 87 def getState(self): 88 state = {"phase": PHASES[self.phase], 89 "action_on": self.player_array[self.action_on].seat, 90 "pot_before_phase": self.pot, 91 "community_cards": self.community_cards } 92 p_actions = {} 93 94 for (n,d) in self.players.items(): 95 if p.inHand(): p_actions[n] = d.publicData() 96 state["player_actions"] = p_actions 97 98 return state 99 100 31 101 32 102 33 103 class holdemtable: 34 104 max_players = 4 35 def __init__(self ):105 def __init__(self, name): 36 106 self.players={} 37 self.deck = deck.deck() 107 self.game_started = False 108 self.name = name 109 self.holdemround = None 110 self.deferred = [] 111 self.blinds = (1.0,2.0) 112 38 113 39 114 def addPlayer(self, data ): 40 115 p_id = data['client_id'] 116 if self.isFull(): return None 41 117 self.players[p_id]=player(p_id, data['user_id'], len(self.players)) 118 stateChanged() 42 119 return p_id 120 121 #check to see if the game is full and possibly start it 122 def checkStart(self): 123 if self.isFull(): 124 self.game_state = holdemround() 125 self.game_started = True 126 stateChanged() 127 return True 128 return False 129 43 130 44 131 def isFull(self): 45 132 return len(self.players) >= self.max_players 133 134 def genStatus(self, p_id): 135 root = {} 136 root["stat"] = "ok" 137 root["type"] = "game_state" 138 root["you"] = self.players[p_id].privateData() 139 140 table_info = {} 141 table_info["game_in_progress"] = self.game_started 142 table_info["name"] = self.name 143 table_info["blinds"] = self.blinds 144 145 players = {} 146 for (n,d) in self.players.items(): 147 players[n] = d.publicData() 148 table_info["players"] = players 149 root["table_info"] = table_info 150 151 if self.game_started: 152 root["game_state"] = self.game_state.getState() 153 154 def addDeferred(self, p_id, deferred): 155 self.deferred.append((p_id, deferred)) 156 157 #call this when the state changes to update all the deferred 158 def stateChanged(self): 159 for (p,d) in self.deferred: 160 d.callback(self.genStatus(p)) 161 self.deferred = [] 162 163 164 -
tabled.py
r8 r9 11 11 from twisted.internet import reactor 12 12 from twisted.protocols.basic import NetstringReceiver 13 from twisted.internet import defer 13 14 14 15 tables = {"test_table":holdemtable()} … … 18 19 self.table = None 19 20 self.id = None 21 22 def sendMessage(self, data): 23 self.transport.write( cjson.encode( 24 data) ) 25 d = defer.Deferred() 26 d.addCallback(self.sendMessage) 27 self.table.addDeferred(self.id, d) 28 20 29 21 30 def dataReceived(self, data): … … 41 50 else: 42 51 self.id = self.table.addPlayer(decoded) 52 d = defer.Deferred() 53 d.addCallback(self.sendMessage) 54 self.table.addDeferred(self.id, d) 43 55 else: 44 56 self.transport.write( cjson.encode(protocol.MakeError(102,"Unknown Method")) )
