Changeset 9 for holdemtable.py

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

Added deferreds

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • 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