python炸金花【22/8】

1、代码思路

我的思路

  1. 先给五个玩家发三张牌(这个就不说了,用到一个random.sample,写的比较死,可以自己修改,如把5改成i)
  2. 三张牌先排序,这样子card_sort[j][2]就是三张牌中的最大牌j就是五个玩家对应的序列号,如第一个玩家j=0,第二个玩家j=1…
  3. 牌计分的方法来判断谁是赢家,先给他们设置最低分,只要是豹子,就是六万起步,(这样子不管顺子多大,都是五万多,不会超过六万,豹子就是最大的):豹子60000>顺金50000>同花40000>顺子30000>对子20000>单张10000
  4. 判断豹子顺子的,就不写了,详细看代码(比较冗余,我也懒得改了,仅提供思路),注意一下,对子是两张相同,先比较相同的两张的数字,别排序后取最大的数,这样子会出错
  5. 比较烦的是1 、11 、12 、13对应的牌号是AKQJ,还要换来换去,我就是想这个想的要哭了,解决办法是发牌前是AKQJ,发完牌后把他们变成数字1 、11 、12 、13进行计算分数。
  6. 最后呢是看会不会有玩家分数相同,并列第一,成为赢家,这个我没测试,应该没问题

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("单张")

运行结果:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值