def get_best_play(mycard, handcard, last_remain, next_remain):
"""
返回最佳出牌方式
Parameters:
mycard (list[int]): 手牌
handcard (list[int]): 场上牌
last_remain (int): 上家剩余牌数
next_remain (int): 下家剩余牌数
Returns:
list[int]: 最佳出牌方式
"""
# 牌面值
# values = {str(i): i for i in range(3, 11)}
# values['J'] = 11
# values['Q'] = 12
# values['K'] = 13
# values['A'] = 14
# values['2'] = 15
# values['小王'] = 16
# values['大王'] = 17
#
values = {};
for s in ['♠', '♥', '♣', '♦']:
values.update({str(i) + s: i for i in range(3, 11)});
values['11' + s] = 11
values['12' + s] = 12
values['13' + s] = 13
values['14' + s] = 14
values['15' + s] = 15
values['小王'] = 16
values['大王'] = 17
# 牌面值对应的数量
num_mycard = [values[str(card)] for card in mycard]
num_handcard = [values[str(card)] for card in handcard]
# 场上牌最大值
if num_handcard:
max_handcard = max(num_handcard)
else:
# handle the case where num_handcard is empty
max_handcard = 0;
# 如果场上牌的数量为1或2,则出所有比场上牌大的牌
if len(handcard) <= 2:
return [x for x in mycard if values[x] > max_handcard]
# 如果场上牌的数量为3,则出所有三带一、三带二、顺子、连对、炸弹中比场上牌大的牌
if len(handcard) == 3:
# 如果场上牌为三带一
if num_handcard[0] == num_handcard[1] == num_handcard[2]:
for i in range(len(num_mycard) - 1):
if num_mycard[i] == num_mycard[i + 1] == num_mycard[i + 2]:
return [mycard[i], mycard[i + 1], mycard[i + 2], mycard[-1]]
# 如果场上牌为三带二
if num_handcard[0] == num_handcard[1] == num_handcard[2] != num_handcard[3]:
for i in range(len(num_mycard) - 2):
if num_mycard[i] == num_mycard[i + 1] == num_mycard[i + 2]:
num_mycard_dict = {num: num_mycard.count(num) for num in set(num_mycard)}
for j in range(len(num_mycard)):
if num_mycard_dict[num_mycard[j]] >= 2 and num_mycard[j] != num_mycard[i]:
return [mycard[i], mycard[i + 1], mycard[i + 2], mycard[j], mycard[j + 1]]
# 如果场上牌为顺子
if len(handcard) == len(set(num_handcard)) and num_handcard == list(
range(num_handcard[0], num_handcard[-1] + 1, 1)):
num_mycard_dict = {num: num_mycard.count(num) for num in set(num_mycard)}
for i in range(len(num_mycard) - len(handcard)):
if all([num_mycard_dict[num] >= 1 for num in range(num_mycard[i], num_mycard[i] + len(handcard))]):
return mycard[i:i + len(handcard)]
# 如果场上牌为连对
if len(handcard) % 2 == 0 and len(handcard) // 2 == len(set(num_handcard)) and \
all([num_handcard[i] == num_handcard[i + 1] for i in range(0, len(handcard) - 1, 2)]):
num_mycard_dict = {num: num_mycard.count(num) for num in set(num_mycard)}
for i in range(len(num_mycard) - len(handcard)):
if all([num_mycard_dict[num] >= 2 for num in range(num_mycard[i], num_mycard[i] + len(handcard) // 2)]):
result = []
for j in range(num_mycard[i], num_mycard[i] + len(handcard) // 2):
result += [card for card in mycard if values[str(card)] == j][:2]
return result
# 如果场上牌为炸弹
if len(set(num_handcard)) == 1:
for i in range(len(num_mycard) - 3):
if num_mycard[i] == num_mycard[i + 1] == num_mycard[i + 2] == num_mycard[i + 3]:
return [mycard[i], mycard[i + 1], mycard[i + 2], mycard[i + 3]]
# 如果场上牌的数量为4,则出所有四带二、炸弹中比场上牌大的牌
if len(handcard) == 4:
# 如果场上牌为四带二
if num_handcard[0] == num_handcard[1] == num_handcard[2] == num_handcard[3]:
num_mycard_dict = {num: num_mycard.count(num) for num in set(num_mycard)}
for i in range(len(num_mycard) - 3):
if num_mycard[i] == num_mycard[i + 1] == num_mycard[i + 2] == num_mycard[i + 3]:
if num_mycard_dict[num_mycard[i]] >= 2:
for j in range(len(num_mycard)):
if num_mycard_dict[num_mycard[j]] >= 2 and num_mycard[j] != num_mycard[i]:
return [mycard[i], mycard[i + 1], mycard[i + 2], mycard[i + 3], mycard[j],
mycard[j + 1]]
# 如果场上牌为炸弹
if len(set(num_handcard)) == 1:
for i in range(len(num_mycard) - 4):
if num_mycard[i] == num_mycard[i + 1] == num_mycard[i + 2] == num_mycard[i + 3]:
return [mycard[i], mycard[i + 1], mycard[i + 2], mycard[i + 3]]
# 如果场上牌的数量大于4,则出所有炸弹中比场上牌大的牌
if len(handcard) > 4:
if len(set(num_handcard)) == 1:
for i in range(len(num_mycard) - len(handcard)):
if all([num_mycard[i + j] == num_handcard[0] for j in range(len(handcard))]) and num_mycard[i] > \
num_handcard[0]:
return mycard[i:i + len(handcard)]
for i in range(len(num_mycard) - 4):
if num_mycard[i] == num_mycard[i + 1] == num_mycard[i + 2] == num_mycard[i + 3] and \
num_mycard[i] > num_handcard[0]:
return [mycard[i], mycard[i + 1], mycard[i + 2], mycard[i + 3]]
# 如果场上没有牌,则出所有炸弹、顺子、连对中最大的牌
if not handcard:
for i in range(len(num_mycard) - 3):
if num_mycard[i] == num_mycard[i + 1] == num_mycard[i + 2] == num_mycard[i + 3]:
return [mycard[i], mycard[i + 1], mycard[i + 2], mycard[i + 3]]
for i in range(len(num_mycard) - 4):
if num_mycard[i] == num_mycard[i + 1] == num_mycard[i + 2] == num_mycard[i + 3]:
return [mycard[i], mycard[i + 1], mycard[i + 2], mycard[i + 3]]
for i in range(len(num_mycard) - 4):
if all([num_mycard[j + k] == num_mycard[i] + k for k in range(len(handcard))]) and \
len(set(num_mycard[i:i + len(handcard)])) == len(handcard):
return mycard[i:i + len(handcard)]
for i in range(len(num_mycard) - 5):
if all([num_mycard[j + k] == num_mycard[i] + k and num_mycard[j + k + 1] == num_mycard[i] + k for k in
range(len(handcard) // 2)]) and \
len(set(num_mycard[i:i + len(handcard) // 2])) == len(handcard) // 2:
result = []
for j in range(num_mycard[i], num_mycard[i] + len(handcard) // 2):
result += [card for card in mycard if values[str(card)] == j][:2]
return result
return [mycard[-2], mycard[-1]]
# 如果以上条件都不满足,则只能出一张牌
return [mycard[-1]]
import random
values = {'3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9, '10': 10, 'J': 11, 'Q': 12, 'K': 13, 'A': 14, '2': 15,
'小王': 16, '大王': 17}
suits = ['♠', '♥', '♣', '♦']
cards = [str(value) + suit for value in range(3, 16) for suit in suits] + ['小王', '大王']
# 洗牌
random.shuffle(cards)
# 发牌
player1 = sorted(cards[:20],
key=lambda card: values[card[:-1]] if card[:-1] in values else (values[card] if card in values else 0))
player2 = sorted(cards[20:37],
key=lambda card: values[card[:-1]] if card[:-1] in values else (values[card] if card in values else 0))
player3 = sorted(cards[37:],
key=lambda card: values[card[:-1]] if card[:-1] in values else (values[card] if card in values else 0))
# 场上的牌
handcard = ['3♠', '4♠', '5♠']
for i in handcard:
player1 = [elem for elem in player1 if elem != i]
player2 = [elem for elem in player2 if elem != i]
player3 = [elem for elem in player3 if elem != i]
# 地主出牌
mycard = player1
handcard = get_best_play(mycard, handcard, len(player3), len(player2))
print('地主出牌:', handcard)
handcard = []
# 农民1出牌
mycard = player2
handcard = get_best_play(mycard, handcard, len(player1), len(player3))
print('农民1出牌:', handcard)
handcard = []
# 农民2出牌
mycard = player3
handcard = get_best_play(mycard, handcard, len(player2), len(player1))
print('农民2出牌:', handcard)
handcard = []
简单的斗地主出牌算法(python)
最新推荐文章于 2023-10-27 14:07:37 发布