马上就要过年了
大家也都放假了吧
过年必不可少的活动 打牌!
今天带大家来写一份斗地主
那么实现一个斗地主呢
我们肯定要先完善卡牌系统
from collections import Counter
import numpy as np
import itertools
def cmp_to_key(mycmp):
'Convert a cmp= function into a key= function'
class K:
def __init__(self, obj, *args):
self.obj = obj
def __lt__(self, other):
return mycmp(self.obj, other.obj) < 0
def __gt__(self, other):
return mycmp(self.obj, other.obj) > 0
def __eq__(self, other):
return mycmp(self.obj, other.obj) == 0
def __le__(self, other):
return mycmp(self.obj, other.obj) <= 0
def __ge__(self, other):
return mycmp(self.obj, other.obj) >= 0
def __ne__(self, other):
return mycmp(self.obj, other.obj) != 0
return K
def get_action_space():
actions = [[]]
# max_cards = 20
# single
for card in Card.cards:
actions.append([card])
# pair
for card in Card.cards:
if card != '*' and card != '$':
actions.append([card] * 2)
# triple
for card in Card.cards:
if card != '*' and card != '$':
actions.append([card] * 3)
# 3 + 1
for main in Card.cards:
if main != '*' and main != '$':
for extra in Card.cards:
if extra != main:
actions.append([main] * 3 + [extra])
# 3 + 2
for main in Card.cards:
if main != '*' and main != '$':
for extra in Card.cards:
if extra != main and extra != '*' and extra != '$':
actions.append([main] * 3 + [extra] * 2)
# single sequence
for start_v in range(Card.to_value('3'), Card.to_value('2')):
for end_v in range(start_v + 5, Card.to_value('2')):
seq = list(range(start_v, end_v))
actions.append(Card.to_cards(seq))
# double sequence
for start_v in range(Card.to_value('3'), Card.to_value('2')):
for end_v in range(start_v + 3, min(start_v + 20 // 2, Card.to_value('2'))):
seq = list(range(start_v, end_v))
actions.append(Card.to_cards(seq) * 2)
# triple sequence
for start_v in range(Card.to_value('3'), Card.to_value('2')):
for end_v in range(start_v + 2, min(start_v + 20 // 3, Card.to_value('2'))):
seq = list(range(start_v, end_v))
actions.append(Card.to_cards(seq) * 3)
# 3 + 1 sequence
for start_v in range(Card.to_value('3'), Card.to_value('2')):
for end_v in range(start_v + 2, min(start_v + 20 // 4, Card.to_value('2'))):
seq = list(range(start_v, end_v))
main = Card.to_cards(seq)
remains = [card for card in Card.cards if card not in main]
for extra in list(itertools.combinations(remains, end_v - start_v)):
if not ('*' in list(extra) and '$' in list(extra)):
actions.append(main * 3 + list(extra))
# 3 + 2 sequence
for start_v in range(Card.to_value('3'), Card.to_value('2')):
for end_v in range(start_v + 2, min(start_v + 20 // 5, Card.to_value('2'))):
seq = list(range(start_v, end_v))
main = Card.to_cards(seq)
remains = [card for card in Card.cards if card not in main and card not in ['*', '$']]
for extra in list(itertools.combinations(remains, end_v - start_v)):
actions.append(main * 3 + list(extra) * 2)
# bomb
for card in Card.cards:
if card != '*' and card != '$':
actions.append([card] * 4)
# bigbang
actions.append(['*', '$'])
# 4 + 1 + 1
for main in Card.cards:
if main != '*' and main != '$':
remains = [card for card in Card.cards if card != main]
for extra in list(itertools.combinations(remains, 2)):
if not ('*' in list(extra) and '$' in list(extra)):
actions.append([main] * 4 + list(extra))
return actions
class Card:
cards = ['3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A', '2', '*', '$']
# full_cards = [x for pair in zip(cards, cards, cards, cards) for x in pair if x not in ['*', '$']]
# full_cards += ['*', '$']
cards.index('3')
cards_to_onehot_idx = dict((x, i * 4) for (i, x) in enumerate(cards))
cards_to_onehot_idx['*'] = 52
cards_to_onehot_idx['$'] = 53
cards_to_value = dict(