吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5123|回复: 18
收起左侧

[Python 转载] 炸金花小程序脚本

  [复制链接]
miracle2016 发表于 2021-7-15 15:10
[Python] 纯文本查看 复制代码
# coding:utf-8
# coding:utf-8
import random


def pokers():
    # 生成2-11的列表
    num = list(i for i in range(2, 11))
    # 加上J Q K A
    num.extend('JQKA')
    # 定义扑克牌的花色
    color = ('梅花', '方块', '红桃', '黑桃')
    # 生成一副52张的牌的列表并返回
    poker = [(m, n) for m in num for n in color]
    # 返回扑克牌
    return poker


# 生成玩家列表
def sure_names():
    # 输入玩家姓名,或者自动生成5个玩家
    x = input('自己输入玩家姓名或者\n输入N则自动生成五个玩家').strip()
    gamers = []
    if x in ['N', 'n']:
        # 列表生成式生成5个玩家
        gamers = [f'玩家{i + 1}' for i in range(5)]
    else:
        # 增加刚输入的玩家
        gamers.append(x)
        # 一直让用户输入玩家姓名直到输入N,n 输入结束,或者超过14个玩家结束并生成玩家列表
        while True:
            gamer = input('请输入玩家姓名:\n 输入N则结束输入')
            if gamer not in ['N', 'n']:
                gamers.append(gamer)
                length_gamer = len(gamers)
                if length_gamer > 14:
                    print('人数过多,牌不够分了')
                    break
            else:
                break
    # 返回玩家列表
    return gamers


# 给每个玩家发牌:
def hand_out_card(gamers, one_poker):
    # 定义一个玩家的空字典用来存储玩家和他们的牌
    gamer_pork = {}
    for i in gamers:
        # 判断一下剩余的扑克牌数量
        # print(len(one_poker))
        # 每个人随机发三张牌,并将发掉的牌从牌堆里剔除掉以免发重
        gamer_pork[i] = [one_poker.pop(random.randint(0, len(one_poker) - 1)) for i in range(3)]
        # 打印每个人手里的扑克牌
        # print(gamer_pork)
    # 返回每个人手里的牌的字典
    return gamer_pork


class GamerPork(object):
    def __init__(self, gamer_pork):
        # 获取玩家姓名
        self.name = gamer_pork[0]
        # 获取玩家的扑克牌
        self.pork = gamer_pork[1]
        # 定义一个新的玩家处理后的牌列表
        self.new_pork = []
        # 将处理后的牌按分类,大小,花色定义
        self.i_type = None
        self.max_number = None
        self.max_colour = None
        self.data = None

    # 定义函数用来分类玩家手上的牌属于豹子还是同花顺等
    def class_pork(self):
        # 定义一个可以将牌中不能识别的字符串全部替换能识别的字段
        deal_pork_resign = {'J': 11, 'Q': 12, 'K': 13, 'A': 14, '红桃': 4, '方块': 3, '黑桃': 2, '梅花': 1}
        for i in self.pork:
            if i[0] in deal_pork_resign:
                new_pork_list_number = deal_pork_resign[i[0]]
            else:
                new_pork_list_number = i[0]
            if i[1] in deal_pork_resign:
                new_pork_list_colour = deal_pork_resign[i[1]]
            else:
                new_pork_list_colour = i[1]
            self.new_pork.append((new_pork_list_number, new_pork_list_colour))

    def deal_pork(self):
        # 重新排列组合一下牌的数值以及花色
        new_pork_number = sorted({i[0] for i in self.new_pork})
        new_pork_colour = sorted({i[1] for i in self.new_pork})
        # 牌的类型豹子为5,顺金为4, 顺子为3, 对子为2,单牌为1
        # 定义豹子类型,并将牌值也一并传入列表
        # 判断是否为豹子
        if len(new_pork_number) == 1:
            self.i_type = 5
            self.max_number = new_pork_number[0]
            # 豹子不存在花色大小的问题
            self.max_colour = new_pork_colour[2]
        # 判断是否为对子
        elif len(new_pork_number) == 2:
            self.i_type = 2
            # 这里取第二张牌必定是对子的那个
            self.max_number = new_pork_number[1]
            # 判断花色
            if self.new_pork[0][0] == self.new_pork[1][0]:
                self.max_colour = max(self.new_pork[0][1], self.new_pork[1][1])
            if self.new_pork[0][0] == self.new_pork[2][0]:
                self.max_colour = max(self.new_pork[0][1], self.new_pork[2][1])
            if self.new_pork[2][0] == self.new_pork[1][0]:
                self.max_colour = max(self.new_pork[2][1], self.new_pork[1][1])
        else:
            # 判断是否为顺子
            if new_pork_number[2] - new_pork_number[1] == 1 and new_pork_number[2] - new_pork_number[0] == 2:
                # 判断是否为顺金,顺金则花色只有一种
                if len(new_pork_colour) == 1:
                    self.i_type = 4
                    self.max_number = new_pork_number[2]
                    # 顺金也不存在花色大小的问题
                    self.max_colour = new_pork_colour[0]
                # 顺子
                else:
                    self.i_type = 3
                    self.max_number = new_pork_number[2]
                    # 顺子的最大的数字的花色
                    for i, v in enumerate(self.new_pork):
                        if new_pork_number[2] == v[0]:
                            self.max_colour = self.new_pork[i][1]
            # 判断是否为单数
            else:
                self.i_type = 1
                self.max_number = new_pork_number[2]
                # 最大数的花色
                for i, v in enumerate(self.new_pork):
                    if new_pork_number[2] == v[0]:
                        self.max_colour = self.new_pork[i][1]
        self.data = (self.i_type, self.max_number, self.max_colour)

def judge_winner(gamer_pork_list):
    # 按照data进行降序排列
    gamer_pork_list.sort(key=lambda x : x.data, reverse=True)

    winner = gamer_pork_list[0].name
    return winner

def main():
    # 首先生成一副扑克牌
    one_poker = pokers()
    # 确定玩家人数及其姓名
    gamers = sure_names()
    # 打印玩家列表
    print(gamers)
    print('='*100)
    # 发牌
    gamer_pork_dicts = hand_out_card(gamers, one_poker)
    # 输出每个人手里的牌
    print(gamer_pork_dicts)
    print('=' * 100)
    # 定义一个处理后的玩家集合
    gamer_pork_list = []
    for k in gamer_pork_dicts.items():
        gamer = GamerPork(k)
        gamer.class_pork()
        gamer.deal_pork()
        gamer_pork_list.append(gamer)
    # 判断谁是赢家
    winner = judge_winner(gamer_pork_list)
    print(f'最后的大赢家为{winner}')


if __name__ == '__main__':
    main()

免费评分

参与人数 3吾爱币 +3 热心值 +3 收起 理由
cabbage7 + 1 + 1 谢谢@Thanks!
joivyhnman + 1 + 1 热心回复!
ll52wj1pjo + 1 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| miracle2016 发表于 2021-7-17 08:48
joivyhnman 发表于 2021-7-15 15:27
很厉害啊。一直在学python。就是总是对类编程,和函数编程。搞不明白。函数编程还能理解点,涉及到类编程, ...

类你也可以理解成一个容器,跟字典其实是一样的,self.x 就是字典的键,self.x= ??? ???就是字典的值,然后你就明白了,想要啥就直接调用类的键就可以得到类的值,类下面的def 就是类的方法,你可以通过方法给类的键赋值,我的理解就是这样,希望可以帮到你
 楼主| miracle2016 发表于 2021-7-15 15:11
炸金花小程序脚本,,欢迎指教!

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
jwqwerty + 1 + 1 我很赞同

查看全部评分

joivyhnman 发表于 2021-7-15 15:27
很厉害啊。一直在学python。就是总是对类编程,和函数编程。搞不明白。函数编程还能理解点,涉及到类编程,就懵逼了。
287166966 发表于 2021-7-15 16:27
炸金花百分比赢了
bdcpc 发表于 2021-7-15 16:35
厉害了我的哥。
Super丶张德帅 发表于 2021-7-15 16:37
怎么才能玩炸金花啊
 楼主| miracle2016 发表于 2021-7-17 08:48

这个可能需要前段的知识,把代码图形化,或者做个pygame,然后就可以玩了
joivyhnman 发表于 2021-7-17 09:13
miracle2016 发表于 2021-7-17 08:48
类你也可以理解成一个容器,跟字典其实是一样的,self.x 就是字典的键,self.x= ??? ???就是字典的值,然 ...

谢谢。有点感觉了。
闭上的眼镜 发表于 2021-7-17 09:51
感谢分享!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 06:32

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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