Changeset 9

Show
Ignore:
Timestamp:
02/03/08 10:09:51 (11 months ago)
Author:
mike
Message:

Added deferreds

Files:
4 modified

Legend:

Unmodified
Added
Removed
  • deck.py

    r3 r9  
    11import 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  ] 
     2SUITS = ['spades', 'clubs', 'hearts', 'diamonds'] 
     3CARDS = [2,3,4,5,6,7,8,9,10,'J','Q','K','A'] 
     4DEFAULT_DECK = [ (card,suit) for card in CARDS for suit in SUITS  ] 
    55 
    66def card_vals(cards): 
     
    1919        self.cards = [] 
    2020        for i in range(0, self.n_decks): 
    21             self.cards += default_deck[:] 
     21            self.cards += DEFAULT_DECK[:] 
    2222        random.shuffle(self.cards) 
    2323 
  • hand.py

    r6 r9  
    11import deck 
    22 
    3 hand_orders = [ "high_card", 
     3HAND_ORDERS = [ "high_card", 
    44                "pair", 
    55                "two_pair", 
     
    1616    if not ret: ret = is_n_kinds([a for (a,b) in cards]) 
    1717    #replace the text with a value 
    18     return (hand_orders.index(ret[0]), ret[1]) 
     18    return (HAND_ORDERS.index(ret[0]), ret[1]) 
    1919 
    2020 
     
    9595            for cc in combNoReplace(cards[i+1:],n-1): 
    9696                #Aces can have 2 values 
    97                 if cards[i]==deck.cards.index("A"): yield [-1]+cc 
     97                if cards[i]==deck.CARDS.index("A"): yield [-1]+cc 
    9898                yield [cards[i]]+cc 
    9999 
  • holdemtable.py

    r8 r9  
    11import deck 
    22import random 
     3from twisted.internet import defer 
    34 
    45class player: 
     
    1213        self.action_history = [] 
    1314 
     15    def nextHand(self): 
     16        self.cards = [] 
     17        self.actionHistory = [] 
     18 
    1419    def publicData(self): 
    1520        return {"owner" : self.user_id, 
     
    2227               "required_action": self.required_action, 
    2328               "cards"          : self.cards} 
    24         if self.required_action: 
    25             dat["possible_actions"] = possibleActions() 
    2629        return dat 
    2730    def actionHistory(self): 
    2831        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 
     43PHASES = ["blinds", "flop", "turn", "river"] 
     44class 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): 
    3085        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 
    31101 
    32102 
    33103class holdemtable: 
    34104    max_players = 4 
    35     def __init__(self): 
     105    def __init__(self, name): 
    36106        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 
    38113 
    39114    def addPlayer(self, data ): 
    40115        p_id = data['client_id'] 
     116        if self.isFull(): return None 
    41117        self.players[p_id]=player(p_id, data['user_id'], len(self.players)) 
     118        stateChanged() 
    42119        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 
    43130 
    44131    def isFull(self): 
    45132        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  
    1111from twisted.internet import reactor 
    1212from twisted.protocols.basic import NetstringReceiver 
     13from twisted.internet import defer 
    1314 
    1415tables = {"test_table":holdemtable()} 
     
    1819        self.table = None 
    1920        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 
    2029 
    2130    def dataReceived(self, data): 
     
    4150                else: 
    4251                    self.id = self.table.addPlayer(decoded) 
     52                    d = defer.Deferred() 
     53                    d.addCallback(self.sendMessage) 
     54                    self.table.addDeferred(self.id, d) 
    4355            else: 
    4456                self.transport.write( cjson.encode(protocol.MakeError(102,"Unknown Method")) )