|
# -*- coding utg-8 -*-?
# Author alpha 2022-3-19
import random
import operator # python内部操作符函数
puke=[]
num_list=['2','3','4','5','6','7','8','9','10','J','Q','K','A']
hua_list=['梅花','红桃','黑桃','方块']
sotr_dic={'2':0,'3':1,'4':2,'5':3,'6':4,'7':5,'8':6,'9':7,'10':8,'J':9,'Q':10,'K':11,
'A':12,'对子':23,'顺子':57,'顺金':80,'豹子':102}
#此处没有清一色牌型。‘对子’赋值24代表最小的对2也要比最大的单牌AKJ分数22大。‘顺子’要比最大的对子AAK分数33加最大单牌22=55大....
#‘顺金’要比最大单牌22加顺子底数57=79大,‘豹子’要比顺金底数79加单牌最大AKJ的22分=101大
# 存储各种牌型的分数,用来对比不同牌型的大小
cout_new_list=[] #存储玩家分数和排序后的排名
count_dic={} #存储玩家分数
#准备52张牌
for hua in hua_list:
for num in num_list:
puke.append(hua+num)
# 52张牌全部存储于puke
player_dic={'玩家1':[],'玩家2':[],'玩家3':[],'玩家4':[],'玩家5':[]}
# 随机给5个玩家发牌
for key,value in player_dic.items(): # dic.items() #返回⼀个包含所有(键,值)元组的列表;
for i in range(3):
plate = random.sample(puke,3) # 在52张扑克中随机选取3张牌
# 发出的3张牌存储到key玩家
player_dic[key]=plate
for i in plate:
puke.remove(i) # 将发出的3张牌从牌垛中去除
# 获取玩家的牌型
def paixing(list1): #把玩家的牌型中的花色和数字分开
num=[] #牌点数
huase=[] #牌的花色
for i in list1: #list1为发给玩家的牌,例如['方块9', '方块6', '黑桃J']
a=i[2:] #取元素第3位以后,主要考虑到10有两位,因此去3为以后的数据为牌的点数
b=i[:2] #取元素前两位为花色
num.append(a)
huase.append(b)
return num,huase #返回牌的点数和花色
# 对数字的牌型进行排序
def sotr(num): #将牌数传入函数进行计算
new_num=[]
sort_list2=[]
list1=[]
for i in num:
new_num.append(sotr_dic[i]) #牌数对应的分数存储在new_num
# print(new_num)
new_num=sorted(new_num) # sorted函数对所有可迭代的对象进行排序操作,默认为升序
# print(new_num)
for new in new_num:
for k, v in sotr_dic.items():
if v == new:
sort_list2.append([k])
# 根据得分排序返回牌型排序
# print("sort_list2打印出来为:"+str(sort_list2))
for m in sort_list2: # sort_list2类似[['2'], ['8'], ['A']]这种列表嵌套列表,这一段循环的作用就是去掉把大列表转成小列表
for n in m:
list1.append(n)
# print("n为:"+str(list1))
return list1
# 对玩家的牌型统计分数
def count(num,huase): #本函数判断牌型,并根据牌型从字典里对各种牌型赋基础分值,再基础分值的基础上加上单牌的分数,从而为下一步根据分值排序提供依据
a=0
base_count=sotr_dic[num[0]]+sotr_dic[num[1]]+sotr_dic[num[2]] #单牌的分数。
if num[0]==num[1] and num[1]==num[2]:
paixing='豹子'
a=base_count+sotr_dic[paixing]
elif (sotr_dic[num[0]])+1==sotr_dic[num[1]] and sotr_dic[num[2]]-1==sotr_dic[num[1]] and (huase[0]==huase [1]) and huase[1]==huase[2]:
paixing='顺金'
a = base_count + sotr_dic[paixing]
elif (sotr_dic[num[0]]+1==sotr_dic[num[1]]) and (sotr_dic[num[2]]-1==sotr_dic[num[1]]) and (huase[0]!=huase[1]) or (huase[1]!=huase[2]):
paixing='顺子'
a = base_count + sotr_dic[paixing]
elif (num[0]==num[1] and num[1]!=num[2]) or (num[1]==num[2] and num[0]!=num[1]) or (num[0]==num[2] and num[1]!=num[0]):
paixing='对子'
a = base_count + sotr_dic[paixing]
else:
a = base_count
return a
# 对存储玩家分数的字典进行排序
def compare(count_dic):
d=list(zip(count_dic.values(),count_dic.keys())) #zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
return sorted(d,reverse=True)
# 降序排列
for key,value in player_dic.items():
# print(key,value)
num,huase=paixing(value)
#print(num,huase)
num=sotr(num)
count1=count(num,huase)
# print(count1)
count_dic[key]=count1
print(key+"的牌为:"+str(value))
count_new_list=compare(count_dic)
print('最终排名:'+"\t"+count_new_list[0][1]+"为第一名"+'\t'+count_new_list[1][1]+"为第二名"+'\t'+count_new_list[2][1]+"为第三名"+'\t'+count_new_list[3][1]+"为第四名"'\t'+count_new_list[4][1]+"为第五名")
|
|