forked from datamllab/rlcard
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnolimitholdem.py
119 lines (95 loc) · 3.95 KB
/
nolimitholdem.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
import json
import os
import numpy as np
from collections import OrderedDict
import rlcard
from rlcard.envs import Env
from rlcard.games.nolimitholdem import Game
from rlcard.games.nolimitholdem.round import Action
DEFAULT_GAME_CONFIG = {
'game_num_players': 2,
'chips_for_each': 100,
'dealer_id': None,
}
class NolimitholdemEnv(Env):
''' Limitholdem Environment
'''
def __init__(self, config):
''' Initialize the Limitholdem environment
'''
self.name = 'no-limit-holdem'
self.default_game_config = DEFAULT_GAME_CONFIG
self.game = Game()
super().__init__(config)
self.actions = Action
self.state_shape = [[54] for _ in range(self.num_players)]
self.action_shape = [None for _ in range(self.num_players)]
# for raise_amount in range(1, self.game.init_chips+1):
# self.actions.append(raise_amount)
with open(os.path.join(rlcard.__path__[0], 'games/limitholdem/card2index.json'), 'r') as file:
self.card2index = json.load(file)
def _get_legal_actions(self):
''' Get all leagal actions
Returns:
encoded_action_list (list): return encoded legal action list (from str to int)
'''
return self.game.get_legal_actions()
def _extract_state(self, state):
''' Extract the state representation from state dictionary for agent
Note: Currently the use the hand cards and the public cards. TODO: encode the states
Args:
state (dict): Original state from the game
Returns:
observation (list): combine the player's score and dealer's observable score for observation
'''
extracted_state = {}
legal_actions = OrderedDict({action.value: None for action in state['legal_actions']})
extracted_state['legal_actions'] = legal_actions
public_cards = state['public_cards']
hand = state['hand']
my_chips = state['my_chips']
all_chips = state['all_chips']
cards = public_cards + hand
idx = [self.card2index[card] for card in cards]
obs = np.zeros(54)
obs[idx] = 1
obs[52] = float(my_chips)
obs[53] = float(max(all_chips))
extracted_state['obs'] = obs
extracted_state['raw_obs'] = state
extracted_state['raw_legal_actions'] = [a for a in state['legal_actions']]
extracted_state['action_record'] = self.action_recorder
return extracted_state
def get_payoffs(self):
''' Get the payoff of a game
Returns:
payoffs (list): list of payoffs
'''
return np.array(self.game.get_payoffs())
def _decode_action(self, action_id):
''' Decode the action for applying to the game
Args:
action id (int): action id
Returns:
action (str): action for the game
'''
legal_actions = self.game.get_legal_actions()
if self.actions(action_id) not in legal_actions:
if Action.CHECK in legal_actions:
return Action.CHECK
else:
print("Tried non legal action", action_id, self.actions(action_id), legal_actions)
return Action.FOLD
return self.actions(action_id)
def get_perfect_information(self):
''' Get the perfect information of the current state
Returns:
(dict): A dictionary of all the perfect information of the current state
'''
state = {}
state['chips'] = [self.game.players[i].in_chips for i in range(self.num_players)]
state['public_card'] = [c.get_index() for c in self.game.public_cards] if self.game.public_cards else None
state['hand_cards'] = [[c.get_index() for c in self.game.players[i].hand] for i in range(self.num_players)]
state['current_player'] = self.game.game_pointer
state['legal_actions'] = self.game.get_legal_actions()
return state