1、代码思路
我的思路是
先给五个玩家发三张牌
(这个就不说了,用到一个random.sample
,写的比较死,可以自己修改,如把5改成i)- 三张牌先
排序
,这样子card_sort[j][2]就是三张牌中的最大牌
,j就是五个玩家对应的序列号
,如第一个玩家j=0,第二个玩家j=1… - 用
牌计分
的方法来判断谁是赢家,先给他们设置最低分,只要是豹子
,就是六万起步
,(这样子不管顺子多大,都是五万多
,不会超过六万,豹子就是最大的):豹子60000>顺金50000>同花40000>顺子30000>对子20000>单张10000
- 判断豹子顺子的,就不写了,详细看代码(比较冗余,我也懒得改了,仅提供思路),注意一下,
对子是两张相同,先比较相同的两张的数字
,别排序后取最大的数,这样子会出错 - 比较烦的是
1 、11 、12 、13对应的牌号是AKQJ
,还要换来换去,我就是想这个想的要哭了,解决办法是发牌前是AKQJ,发完牌后把他们变成数字1 、11 、12 、13进行计算分数。
- 最后呢是看
会不会有玩家分数相同,并列第一,成为赢家
,这个我没测试,应该没问题
2、完整代码
import random
from select import select
print("------欢迎五位玩家参与游戏------")
# print("------ 正在发牌 ------")
# print("------ 发牌完成 ------")
a = ["♠", "♥", "♦", "♣"]
# a = list(range(101, 105))
b = list(range(2, 10))
b.extend('JQKA')
card_list = []#设置列表存放52张牌
for i in a:#52张牌
for j in b:
card_list.append([i, j])
player_list = [] # 分别存放五个人的牌
for i in range(1, 6):#发牌
card_selected = random.sample(card_list, 3)
player_list.append(card_selected)
for b in card_selected:
card_list.remove(b)
print(f"{i}号玩家:{card_selected}") # 输出玩家的牌
card_sort = []#牌按数字大小摆放,三个三个摆放,不看花色
def change():#定义把AKQj改为数字的函数
for i in range(5):
for j in range(3):
if player_list[i][j][1]== "A":
player_list[i][j][1] = 14
elif player_list[i][j][1] == "J":
player_list[i][j][1] = 11
elif player_list[i][j][1] == "Q":
player_list[i][j][1] = 12
elif player_list[i][j][1] == "K":
player_list[i][j][1] = 13
if player_list[i][j][0] == "♠":
player_list[i][j][0] = 101
if player_list[i][j][0] == "♥":
player_list[i][j][0] = 102
if player_list[i][j][0] == "♣":
player_list[i][j][0] = 103
if player_list[i][j][0] == "♦":
player_list[i][j][0] = 104
change()#调用函数
for i in range(5):#把数字和花色分离,分别存放到列表
b = []
for j in range(3):
a = player_list[i][j][1]
# print(a) #输出数字
b.append(a)
b.sort()
card_sort.append(b)
# print(card_sort) # 输出排好序的牌
color_sort = []#颜色排序,可以不排,我多写了
for i in range(5):
b = []
for j in range(3):
a = player_list[i][j][0]
b.append(a)
b.sort()
color_sort.append(b)
# print(color_sort) # 输出花色
points = []#设置分数的列表
point = 0#初始分数为0
i = 0
for j in range(5):
if card_sort[j][i] == card_sort[j][i+1] and card_sort[j][i+1] == card_sort[j][i+2]:#三张牌,数字相等
# print("豹子!") # 不用写了
point = 60000+100*card_sort[j][2]
elif card_sort[j][i] == card_sort[j][i+1] or card_sort[j][i] == card_sort[j][i+2] or card_sort[j][i+1] == card_sort[j][i+2]:#两张牌,数字相等
if card_sort[j][i] == card_sort[j][i+1]:#判断哪个牌相等
point = 20000+100*card_sort[j][i]+card_sort[j][i+2]#分数相加
elif card_sort[j][i] == card_sort[j][i+2]:#判断哪个牌相等
point = 20000+100*card_sort[j][i]+card_sort[j][i+1]#分数相加
else:#同上
point = 20000+100*card_sort[j][i+1]+card_sort[j][i]
# print("对子!") # 写完了
else:
if card_sort[j][i]+1 == card_sort[j][i+1] and card_sort[j][i+1]+1 == card_sort[j][i+2]:#牌数字相等
if color_sort[j][i] == color_sort[j][i+1] and color_sort[j][i+1] == color_sort[j][i+2]:#且花色一样
# print("顺金")
point = 50000+100*card_sort[j][2] + \
card_sort[j][1]+0.01*card_sort[j][0]
else:
# print("顺子!")
point = 30000+100*card_sort[j][2] + \
card_sort[j][1]+0.01*card_sort[j][0]
else:
if color_sort[j][i] == color_sort[j][i+1] and color_sort[j][i+1] == color_sort[j][i+2]:
# print("同花")
point = 40000+100*card_sort[j][2] + \
card_sort[j][1]+0.01*card_sort[j][0]
else:
# print("单张")
point = 10000+100*card_sort[j][2] + \
card_sort[j][1]+0.01*card_sort[j][0]
points.append(point)#把五个人的分数分别存到points总表里
# print(f"分数为:{points}")
pm = max(points) # 找到五个人分数的最大值
pms = []#存放分数最大值的表
c_pms = 0#设置最大值的数量
# 输出
for i in range(5):
if points[i] == pm:#如果列表的某个数等于最大值
pms.append(i+1)#把列表的位置+1存到最大值表里
c_pms = c_pms+1#最大值的数量+1
if c_pms != 1:#如果不止一位牌数最大
print(f"------ 第{pms}位玩家获胜 ------")
else:#只有一个牌数最大
e = points.index(pm)+1 # 找到最大值的下标
print(f"------ 第{e}位玩家获胜 ------")
3、运行结果
运行之后就是这个样子
之前为了好判断写了每个玩家对应的牌是啥,可以去掉注释
,方便查看代码。
比如这一句,把注释去掉,就可以显示了
# print("单张")
运行结果: