miracle2016 发表于 2021-7-15 15:10

炸金花小程序脚本

# 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 =
    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 =
      # 打印每个人手里的扑克牌
      # print(gamer_pork)
    # 返回每个人手里的牌的字典
    return gamer_pork


class GamerPork(object):
    def __init__(self, gamer_pork):
      # 获取玩家姓名
      self.name = gamer_pork
      # 获取玩家的扑克牌
      self.pork = gamer_pork
      # 定义一个新的玩家处理后的牌列表
      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 in deal_pork_resign:
                new_pork_list_number = deal_pork_resign]
            else:
                new_pork_list_number = i
            if i in deal_pork_resign:
                new_pork_list_colour = deal_pork_resign]
            else:
                new_pork_list_colour = i
            self.new_pork.append((new_pork_list_number, new_pork_list_colour))

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

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_918:},欢迎指教!

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

怎么才能玩炸金花啊:lol

miracle2016 发表于 2021-7-17 08:48

Super丶张德帅 发表于 2021-7-15 16:37
怎么才能玩炸金花啊

这个可能需要前段的知识,把代码图形化,或者做个pygame,然后就可以玩了

joivyhnman 发表于 2021-7-17 09:13

miracle2016 发表于 2021-7-17 08:48
类你也可以理解成一个容器,跟字典其实是一样的,self.x 就是字典的键,self.x= ??? ???就是字典的值,然 ...

谢谢。有点感觉了。

闭上的眼镜 发表于 2021-7-17 09:51

感谢分享!
页: [1] 2
查看完整版本: 炸金花小程序脚本