61 lines
1.8 KiB
Python
61 lines
1.8 KiB
Python
class KuhnPoker:
|
|
def __init__(self):
|
|
self.cards = ['J', 'Q', 'K']
|
|
self.actions = [0, 1] # Check/Fold=0, Bet/Call=1
|
|
|
|
def is_terminal(self, history):
|
|
return history in ['00', '10', '010', '011', '11']
|
|
|
|
def get_util(self, cards, history, player):
|
|
if not self.is_terminal(history):
|
|
return 0.0
|
|
|
|
card_values = {'J': 0, 'Q': 1, 'K': 2}
|
|
p0_cardv = card_values[cards[0]]
|
|
p1_cardv = card_values[cards[1]]
|
|
|
|
p0_wins = p0_cardv > p1_cardv
|
|
if history == '00':
|
|
if p0_wins:
|
|
return 1.0 if player == 0 else -1.0
|
|
else:
|
|
return -1.0 if player == 0 else 1.0
|
|
|
|
elif history == '10':
|
|
return 1.0 if player == 0 else -1.0
|
|
|
|
elif history == '010':
|
|
return -1.0 if player == 0 else 1.0
|
|
|
|
elif history == '011':
|
|
if p0_wins:
|
|
return 2.0 if player == 0 else -2.0
|
|
else:
|
|
return -2.0 if player == 0 else 2.0
|
|
|
|
elif history == '11':
|
|
if p0_wins:
|
|
return 2.0 if player == 0 else -2.0
|
|
else:
|
|
return -2.0 if player == 0 else 2.0
|
|
|
|
return 0.0
|
|
|
|
def get_Info_set(self, card, history):
|
|
return f"{card}.{history}"
|
|
|
|
def get_cur_player(self, history):
|
|
if self.is_terminal(history):
|
|
return -1
|
|
return len(history) % 2
|
|
|
|
def get_valid_act(self, history):
|
|
if self.is_terminal(history):
|
|
return []
|
|
return [0, 1]
|
|
|
|
def get_act_name(self, history, action):
|
|
if history == "01":
|
|
return "Fold" if action == 0 else "Call"
|
|
else:
|
|
return "Check" if action == 0 else "Bet" |