游戏规则:一付扑克牌,去掉大小王,每个玩家发3张牌,最后比大小,看谁赢。单张最大的是A,牌的大小顺序为,豹子>顺金>顺子>对子>单张
先生成一付完整的扑克牌给5个玩家随机发牌统一开牌,比大小,输出赢家是谁思路:
1.生成一副牌,然后发牌给玩家
真人视讯游戏,存在一个数据结构中。计算分值时不同级别给予权重
2.计算单牌的分值,先给每张单牌加个权重,如01,1,10,然后算出总分(三张牌乘以权重后的合计)
3.计算对子的分值,单牌的分值乘以权重10,单牌的最高分乘以权重就是最小对子的分值
4.计算顺子,同花顺,豹子的分值,思路同上,权重分别100,1000,10000,权重差距要大点,拉开豹子,同花顺的分值。
5.在计算前先做一个排序功能,对发的牌做一个排序。判断对子,三张牌放到集合中,判断长度,等于2是对子,等于1是豹子;判断顺子,三张单牌排序后中间的减前面的==1同时后面的减中间的也是==1;判断同花,取出花色放到集合中,长度为1就是同花;同花顺的判断则是在顺子的判断里加入花色判断。
代码如下:
import random
# 生成牌
def generate_pokes():
poke_types = ["♥", "♠", "♣", "♦"]
poke_nums = [2, 3, 4, 5, 6, 7, 8, 9, 10, "J", "Q", "K", "A"]
poke_list = []
# 外层循环花色
for p_type in poke_types:
count = 2 # 将牌的值定义出来,方便后面对比
# 内侧魂环点数
for p_num in poke_nums:
# 牌的构造分为两部分,前面给玩家显示的,后面的值方便计算
card = [f"{p_type}{p_num}", count]
count += 1
poke_list.append(card)
return poke_list
poke_list = generate_pokes()
# 发牌
players = ["张飞", "赵云", "关羽", "黄忠", "马超", "吕布"]
def issue_cards(players, poke_list):
# 保存发牌结果,用字典存对应玩家的牌
player_dic = {}
for p_name in players:
# 随机发牌
p_cards = random.sample(poke_list, 3) # 截取列表中的3个元素
# 每发完一个人的牌,剔除
for card in p_cards:
poke_list.remove(card)
player_dic[p_name] = p_cards
print(f"{p_name}发的牌是:\n{p_cards}")
print("*"*50)
return player_dic
player_dic = issue_cards(players, poke_list)
# 写好每种牌规则的函数
# 排序
def sortlist(A):
l = len(A)
# 冒泡排序
for i in range(0, l):
for j in range(0, l - i - 1):
if (A[j][1]) > (A[j + 1][1]):
temp = A[j]
A[j] = A[j + 1]
A[j + 1] = temp
return A
# 计算单牌
def calculate_single(p_cards, score):
score = 0
# 先排序
p_cards = sortlist(p_cards)
# print(p_cards)
# 加权重
weight = [0.1, 1, 10]
count = 0
# 三张单牌按照设定的比重从小到大相乘,结果相加得到最后的分数
for card in p_cards:
score += card[1] * weight[count]
# print(score,card[1])
count += 1
print("计算单牌:", p_cards, score)
return score
# 计算对子,将单牌三张最大组和的分数拿来比重乘十作为最小对子的分数
def calculate_pair(p_cards, score):
# 取出牌的第2个元素即牌的值,放进集合去重
card_val_set = {i[1] for i in p_cards}
if len(card_val_set) == 2: # 长度为2是对子,为1是豹子
score *= 10
print("计算对子:", p_cards, score)
return score
# 计算顺子,同对子,比重为100
def calculate_straight(p_cards, score):
p_cards = sortlist(p_cards)
# 取出三张牌的值赋值给三个变量,作比较
card_val = [i[1] for i in p_cards]
a, b, c = card_val
if b - a == 1 and c - b == 1:
score *= 100
print("计算顺子:", p_cards, score)
return score
# 计算同花,同上
def calculate_TongHua(p_cards, score):
p_cards = sortlist(p_cards)
# 取出三张牌的花色,放进集合去重
color_set = {i[0][0] for i in p_cards}
if len(color_set) == 1:
score *= 1000
print("计算同花:", p_cards, score)
return score
# 计算同花顺
def calculate_TongHuaShun(p_cards, score):
p_cards = sortlist(p_cards)
card_val = [i[1] for i in p_cards]
a, b, c = card_val
if b - a == 1 and c - b == 1:
color_set = {i[0][0] for i in p_cards}
if len(color_set) == 1:
score *= 10000
print("计算同花顺:", p_cards, score)
return score
# 计算豹子
def calculate_BaoZi(p_cards, score):
# 取出三张牌的值,放进集合去重
card_val_set = {i[1] for i in p_cards}
if len(card_val_set) == 1:
score *= 1000000
print("计算豹子:", p_cards, score)
return score
# 对比
# 将计算分值的函数对象按顺序放到列表中去,遍历列表,传入参数,一次执行判断计算。
calc_func_orders = [calculate_single,
calculate_pair,
calculate_straight,
calculate_TongHua,
calculate_TongHuaShun,
calculate_BaoZi
]
performance = [] # 存放所有玩家分值
for p_name, p_cards in player_dic.items():
print("-*-" * 30)
print(f"开始计算玩家{p_name}的牌:")
score = 0
for calc_func in calc_func_orders:
score = calc_func(p_cards, score)
performance.append([p_name, score])
print("-*-"*30)
print("最后分值排名:")
print(sortlist(performance))
print("-*-"*30)
print("赢家是:", sortlist(performance)[-1])
测试结果:
张飞发的牌是:
[['♠Q', 12], ['♠5', 5], ['♥9', 9]]
**************************************************
赵云发的牌是:
[['♦9', 9], ['♥Q', 12], ['♥8', 8]]
**************************************************
关羽发的牌是:
[['♥A', 14], ['♥K', 13], ['♠9', 9]]
**************************************************
黄忠发的牌是:
[['♦7', 7], ['♦Q', 12], ['♦8', 8]]
**************************************************
马超发的牌是:
[['♠8', 8], ['♠J', 11], ['♣Q', 12]]
**************************************************
吕布发的牌是:
[['♥6', 6], ['♣K', 13], ['♣9', 9]]
**************************************************
-*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*-
开始计算玩家张飞的牌:
计算单牌: [['♠5', 5], ['♥9', 9], ['♠Q', 12]] 129.5
计算对子: [['♠5', 5], ['♥9', 9], ['♠Q', 12]] 129.5
计算顺子: [['♠5', 5], ['♥9', 9], ['♠Q', 12]] 129.5
计算同花: [['♠5', 5], ['♥9', 9], ['♠Q', 12]] 129.5
计算同花顺: [['♠5', 5], ['♥9', 9], ['♠Q', 12]] 129.5
计算豹子: [['♠5', 5], ['♥9', 9], ['♠Q', 12]] 129.5
-*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*-
开始计算玩家赵云的牌:
计算单牌: [['♥8', 8], ['♦9', 9], ['♥Q', 12]] 129.8
计算对子: [['♥8', 8], ['♦9', 9], ['♥Q', 12]] 129.8
计算顺子: [['♥8', 8], ['♦9', 9], ['♥Q', 12]] 129.8
计算同花: [['♥8', 8], ['♦9', 9], ['♥Q', 12]] 129.8
计算同花顺: [['♥8', 8], ['♦9', 9], ['♥Q', 12]] 129.8
计算豹子: [['♥8', 8], ['♦9', 9], ['♥Q', 12]] 129.8
-*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*-
开始计算玩家关羽的牌:
计算单牌: [['♠9', 9], ['♥K', 13], ['♥A', 14]] 153.9
计算对子: [['♠9', 9], ['♥K', 13], ['♥A', 14]] 153.9
计算顺子: [['♠9', 9], ['♥K', 13], ['♥A', 14]] 153.9
计算同花: [['♠9', 9], ['♥K', 13], ['♥A', 14]] 153.9
计算同花顺: [['♠9', 9], ['♥K', 13], ['♥A', 14]] 153.9
计算豹子: [['♠9', 9], ['♥K', 13], ['♥A', 14]] 153.9
-*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*-
开始计算玩家黄忠的牌:
计算单牌: [['♦7', 7], ['♦8', 8], ['♦Q', 12]] 128.7
计算对子: [['♦7', 7], ['♦8', 8], ['♦Q', 12]] 128.7
计算顺子: [['♦7', 7], ['♦8', 8], ['♦Q', 12]] 128.7
计算同花: [['♦7', 7], ['♦8', 8], ['♦Q', 12]] 128699.99999999999
计算同花顺: [['♦7', 7], ['♦8', 8], ['♦Q', 12]] 128699.99999999999
计算豹子: [['♦7', 7], ['♦8', 8], ['♦Q', 12]] 128699.99999999999
-*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*-
开始计算玩家马超的牌:
计算单牌: [['♠8', 8], ['♠J', 11], ['♣Q', 12]] 131.8
计算对子: [['♠8', 8], ['♠J', 11], ['♣Q', 12]] 131.8
计算顺子: [['♠8', 8], ['♠J', 11], ['♣Q', 12]] 131.8
计算同花: [['♠8', 8], ['♠J', 11], ['♣Q', 12]] 131.8
计算同花顺: [['♠8', 8], ['♠J', 11], ['♣Q', 12]] 131.8
计算豹子: [['♠8', 8], ['♠J', 11], ['♣Q', 12]] 131.8
-*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*-
开始计算玩家吕布的牌:
计算单牌: [['♥6', 6], ['♣9', 9], ['♣K', 13]] 139.6
计算对子: [['♥6', 6], ['♣9', 9], ['♣K', 13]] 139.6
计算顺子: [['♥6', 6], ['♣9', 9], ['♣K', 13]] 139.6
计算同花: [['♥6', 6], ['♣9', 9], ['♣K', 13]] 139.6
计算同花顺: [['♥6', 6], ['♣9', 9], ['♣K', 13]] 139.6
计算豹子: [['♥6', 6], ['♣9', 9], ['♣K', 13]] 139.6
-*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*-
最后分值排名:
[['张飞', 129.5], ['赵云', 129.8], ['马超', 131.8], ['吕布', 139.6], ['关羽', 153.9], ['黄忠', 128699.99999999999]]
-*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*-
赢家是: ['黄忠', 128699.99999999999]