找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 908|回复: 0

[代码与实例] 扎金花游戏程序(超详细注释),适合新手练手

1

主题

1

帖子

1

积分

贫民

积分
1
snake008 发表于 2022-4-1 20:55:48 | 显示全部楼层 |阅读模式
# -*- 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]+"为第五名")

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表