3a7ec5be12b9aedf3da18eaf38087a1bae2d430d
[poker.git] / pbot.py
1 #!/usr/bin/python
2
3 """Run a poker championship.
4 """
5
6 from table import Player, Blinds, Table
7 from deck import new_deck
8
9
10 def run(players, blinds, start_stack, hand_limit, tournaments, verbose=False):
11     for n in xrange(tournaments):
12         for player in players:
13             player.cash = start_stack
14         table = Table(deck=new_deck(), players=players, blinds=blinds,
15                       verbose=verbose)
16         while len(table.players) > 1 and table.hand_count < hand_limit:
17             table.play_round()
18             # keep bots up to date, so they can think in parallel
19             for player in players:
20                 if player.brain:
21                     player.log_flush(table.log)
22         if len(table.players) == 1:
23             print "INFO WINNER: Player %s" % table.players[0]
24         else:
25             assert table.hand_count >= hand_limit
26             print "INFO Time expired"
27             for player in table.players:
28                 print "INFO Tie: Player %s" % player
29
30
31 if __name__ == '__main__':
32     from optparse import OptionParser
33
34     usage = '%prog [options] PLAYER PLAYER ...'
35     epilog = ('`PLAYER`s should be name,brain tuples, e.g. (`a,p1.py`).  '
36               'Give just the name for a human playing from the command line.')
37     p = OptionParser(usage=usage, epilog=epilog)
38     p.add_option('-s', '--start-stack', dest='stack', default=1000,
39                  type='int', help='start stack (%default)')
40     p.add_option('-b', '--blinds', dest='blinds',
41                  default='1,2,4,8,16,25,37,50',
42                  help='blind schedule (%default)')
43     p.add_option('-c', '--hand-clock', dest='clock', default=20, type='int',
44                  help='hands between blind increments (%default)')
45     p.add_option('-l', '--hand-limit', dest='limit', default=5000, type='int',
46                  help='hand limit (-1 for unlimited play, %default')
47     p.add_option('-t', '--tournaments', dest='tournaments', default=1,
48                  type='int', help='number of tournaments (%default)')
49     p.add_option('-v', '--verbose', dest='verbose', action='store_true',
50                  help='print the log as it is written')
51
52     options,args = p.parse_args()
53
54     blinds = Blinds(blinds=[int(x) for x in options.blinds.split(',')],
55                     hand_clock=options.clock)
56
57     players = []
58     for arg in args:
59         fields = [x.strip() for x in arg.rsplit(',', 1)]
60         name = fields[0]
61         if len(fields) == 1:
62             brain = None
63         else:
64             brain = fields[1]
65         players.append(Player(name=name, brain=brain))
66
67     try:
68         run(players=list(players), blinds=blinds, start_stack=options.stack,
69             hand_limit=options.limit, tournaments=options.tournaments,
70             verbose=options.verbose)
71     finally:  # kill the bots
72         for p in players:
73             p.kill()