python 实现炸金花小游戏

2023-11-13

python 实现炸金花小游戏

本文章在学习python中进行的练习小游戏,目的是为了让学习者熟悉python中的列表、字典、集合等数据操作。

游戏规则:
一付扑克牌,去掉大小王,每个玩家发3张牌,最后比大小,看谁赢。
有以下几种牌:
豹子:三张一样的牌,如3张6.
顺金:又称同花顺,即3张同样花色的顺子, 如红桃 5、6、7
顺子:又称拖拉机,花色不同,但是顺子,如红桃5、方片6、黑桃7,组成的顺子
对子:2张牌一样
单张:单张最大的是A
这几种牌的大小顺序为, 豹子>顺金>顺子>对子>单张

需程序实现的点:
先生成一付完整的扑克牌
给5个玩家随机发牌
统一开牌,比大小,输出赢家是谁

1.游戏分析

1.需要生成一副除去大小王的完整扑克牌
由于扑克牌中存在J、Q、K、A,为了方便进行大小比较,将对应的值存为11,12,13,14,这样玩家看到的值为JQKA,但实际后台运算时使用的是11,12,13,14。
2.根据玩家人数完成发牌
最少玩家为1名,最多玩家为14名,否则牌数不够。每个玩家分发三张牌
3.根据游戏规则比较玩家手中的牌面大小,牌面大的玩家获胜
此处采用权重的方式,将每种牌型赋予不同的权重,获得最后的牌数总点数进行比较,牌型及点数越大的总数和越大
如:
首先将玩家的三张牌根据点数大小升序排序,最大的点数10+中间的点数1+最小的点数*0.1,这样就能获得三张牌的基础分数score
然后判断玩家的牌型,当牌型为对子时,score = score * 100
当牌型为顺子时,score = score * 1000

以此类推,给不同的牌赋予不同的权重得到玩家最终的分数,最后根据分数排序,便能得到获胜的玩家

2.代码实现

def generatePoker():
    '''
    :param :
    :return: 生成完整地扑克牌
    '''
    color = ['♥','♠','♣','♦']
    size = [[2,2], [3,3], [4,4], [5,5], [6,6], [7,7], [8,8], [9,9], [10,10], ['J',11], ['Q',12], ['K',13], ['A',14]]
    poker = []
    for poker_color in color:
        for poker_size in size:
            poker.append([f'{poker_color}{poker_size[0]}',poker_size[1]])
    return poker

def distributePoker(poker, peopleList):
    '''
    :param poker: 一副不带王的完整地牌
    :param num:  发牌人数
    :return: 按照人数,每人发三张牌
    '''
    import random
    p_cards = {}
    if len(peopleList) > 14:
        return '人数最多为14人'
    if len(peopleList) < 1:
        return '人数不符合规范'
    for name in peopleList:
        cards = random.sample(poker, 3)
        p_cards[name] = cards
        for Poker in cards:
            poker.remove(Poker)
    return p_cards

def calculationSingle(p_cards,score):
    '''
    计算单张牌点数大小
    :param p_cards:
    :param score:
    :return:
    '''
    card_val = [card[1] for card in p_cards]
    card_val.sort()
    score += card_val[2] * 10 + card_val[1] * 1 + card_val[0] * 0.1
    return score

def calculationDouble(p_cards, score):
    '''
    计算对子的点数大小
    :param p_cards:
    :param score:
    :return:
    '''
    card_val = [card[1] for card in p_cards]
    card_val.sort()
    if len(set(card_val)) == 2:
        score *= 100
    return score

def calculationAlong(p_cards, score):
    '''
    计算顺子的点数大小
    :param p_cards:
    :param score:
    :return:
    '''
    card_val = [card[1] for card in p_cards]
    card_val.sort()
    if card_val[0]+1 == card_val[1] and card_val[1]+1 == card_val[2]:
        score *= 1000
    return score

def calculationAlongSame(p_cards, score):
    '''
    计算同花顺的点数大小
    :param p_cards:
    :param score:
    :return:
    '''
    color_val = [card[0][0] for card in p_cards]
    if len(set(color_val)) == 1:
        card_val = [card[1] for card in p_cards]
        card_val.sort()
        if card_val[0] + 1 == card_val[1] and card_val[1] + 1 == card_val[2]:
            score *= 10000
    return score

def calculationPanther(p_cards, score):
    '''
    计算豹子的点数大小
    :param p_cards:
    :param score:
    :return:
    '''
    card_val = {card[1] for card in p_cards}
    if len(card_val) == 1:
        score *= 100000000
    return score

def main(customer, calculation_poker_func=None):
    '''
    :param customer:
    :param calculation_poker_func:
    :return:
    '''
    if calculation_poker_func is None:
        calculation_poker_func = [
            calculationSingle,
            calculationDouble,
            calculationAlong,
            calculationAlongSame,
            calculationPanther
        ]
    poker = generatePoker()
    player_poker = distributePoker(poker=poker, peopleList=customer)
    player_score = []
    for name, cards in player_poker.items():
        score = 0
        for calc_func in calculation_poker_func:
            score = calc_func(p_cards=cards, score=score)
        player_score.append([name, score])
    player_score.sort(key=lambda player_score: player_score[1])
    winner = player_score[-1]
    winner_poker = []
    for poker in player_poker[winner[0]]:
        winner_poker.append(poker[0])
    print("玩家及所获取的牌如下:\n", player_poker)
    print(f'恭喜玩家 {winner[0]} 获得胜利,他的牌是{winner_poker},他的分数为:{winner[1]}分')

if __name__ == '__main__':
    '''  '''
    customer = ["王五","李三",'国王',"丞相","首辅"]
    main(customer=customer)

运行结果如下:

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python 实现炸金花小游戏 的相关文章

随机推荐

  • k8s之Deployment篇

    Deployment控制器 概念 原理解读 Deployment官方文档 https kubernetes io docs concepts workloads controllers deployment Deployment概述 Dep
  • 大数据——Ubuntu配置docker的阿里云镜像加速

    Ubuntu配置docker的阿里云镜像加速 阿里云镜像加速 阿里云镜像加速 由于docker的官方的镜像源速度太慢 在国内可以通过使用阿里云或者网易云的镜像源提高下载速度 通常使用阿里云的镜像源 下面介绍怎么使用阿里云的镜像加速器 注册阿
  • python编程练习题:随机生成的各科成绩,60分以下为10-15%之间,60-90分的占70-75%之间,90分以上10%-15%之间

    d 题目 python编程练习题 随机生成的各科成绩 60分以下为10 15 之间 60 90分的占70 75 之间 90分以上10 15 之间 分析 各分数之间生成分数的概率并不是独立的 而是相互影响的 比如60分以下的占10 那么为了满
  • html纵向导航,【练习实例】HTML+CSS制作导航栏(横向与纵向)

    纵向导航栏 建立一个列表 主页 新闻 联系 关于 2 定义列表基本样式 ul 去掉列表的样式 list style type none width 200px background color DDDDDD li a 将内联元素转换为块级元
  • 安装并使用 iDRAC 服务模块

    DELL服务器 Integrated Dell Remote Access Controller 8 7 默认增加了iDRAC Service Module 但是根据官方文档 这个功能默认是没有打开 需要在服务器上安装 未安装前方法如下 1
  • linux下,用crontab定时执行scrapy任务

    之前尝试过很多方法用crontab执行scrapy的爬虫任务 但是都没出成功 总结下来有两点错误与相应的解决方法 1 手动执行时 在工程目录下输入scrapy crawl xxx就可以执行爬虫脚本了 但是用crontab时 如果直接在cro
  • 请收藏——QKL123!它能帮你挖掘项目价值(附2019年3月排行榜)

    QKL123区块链排行榜包括区块链项目 区块链交易平台 区块链媒体 区块链公众号 区块链矿机 区块链矿池 EOS Dapp ETH Dapp 区块链钱包九大榜单 相对第二期 2019年02月 榜单 该期首次新增ETH Dapp排行榜 并改进
  • 今天给大家分享一个绘图的 RGB COLOR TABLE

    如果大家觉得有用 就点个赞让更多的人看到吧
  • unity 触摸屏幕

    if Event current type EventType MouseDown 这里写鼠标按下 屏幕触摸按下 的代码 if Event current type EventType MouseDrag 这里写鼠标拖动 屏幕触摸滑动 的代
  • docker学习笔记--狂神

    Docker入门 Docker能做什么 虚拟机技术 虚拟机技术缺点 资源占用十分多 冗余步骤多 启动很慢 容器化技术 容器化技术不是模拟的一个完整的操作系统 比较Docker 和 虚拟机技术不用 传统虚拟机 虚拟出一条硬件 运行一个完整的操
  • springboot+mybatis实现多数据源

    1 前言 最近做项目碰到了一个需要连4个不同数据库的需求 其中db1 db2表结构都不相同 另外两个数据库same db private same db public表结构完全相同 一个对内一个对外 只是从物理上隔离了数据而已 所以打算通过
  • # Arduino小车PID调速——整定参数初试水

    Arduino小车PID调速 整定参数初试水 在实现了小车较为可靠的测速基础上 便可以正式开展PID调速实验了 本文是基于使用Arduino平台上由Brett Beauregard大神写的PID库进行参数整定的 侧重于在对PID算法有基本了
  • ubuntu下安装Docker

    ubuntu下安装Docker 注意 由于Docker需要在Linux Kernel 3 8及以上才可以很好的工作 本人在ubuntu12 04 lts 内核3 2也正常安装 官方更是推荐Ubuntu系统 这里有两种选择 Ubuntu 12
  • go语言面试题:简述bitmap的应用场景有哪些

    数据库索引 用来高效地进行数据查询 Web 日志分析 用来统计访问者信息 布隆过滤器 用来判断一个元素是否属于集合 缓存位图 用来高效地实现缓存管理 图像处理 用来表示和操作图像数据
  • 在服务器设置中smtp协议是指什么,outlook中的smtp协议具体是指什么

    outlook中smtp协议是指应用层的服务 可以适用于各种网络系统 outlook是微软办公软件套装的组件之一 它对windows自带的outlook express的功能进行了扩充 学习视频分享 编程视频 详细说明 Microsoft
  • ntp服务器超时无响应,设备从ntpd获取时间,但“ntpq -p”命令正在等待超时

    在我们的代码中 我们使用ntpd从服务器获取时间并设置时间 执行ntpd命令后 我们运行 ntpq p 来检查服务器偏移量 我们在不同的进程中运行ntpd的命令 并在完成ntpq之后运行 设备从ntpd获取时间 但 ntpq p 命令正在等
  • 祝福 Eric 的下一段旅程|Flutter 3.3 现已发布

    Flutter 团队及社区成员们在美丽的城市挪威奥斯陆向您发来问候 我们正在此参加社区举办的 Flutter Vikings 活动 这是一个为期两天的开发技术交流盛会 虽然线下门票已经售罄 但您还可以通过在线方式查看本次会议 本周 我们也有
  • wpf拖拽图片,滚轮放大缩小

    WPF提供了很多函数方便我们处理图片 例如各式各样的Transform类用来移动 缩放和旋转图片 有各式各样的Effect类来修改图片的外观 更难得的是 这些类都可以在XAML代码直接设置 而XAML为了提高代码的可维护性 又为我们提供了R
  • 工作3个月,我的测试工作感悟

    项目感想 经过将近3个月以来的迭代版本的测试 这段时间以来的工作和以前有点不同 迭代版本时间紧 任务重 同时对质量的要求更高 每天的工作时间安排的非常紧 一个星期的任务需要完成这个星期的测试任务 同时回归上个星期的bug 这样的工作流程 我
  • python 实现炸金花小游戏

    python 实现炸金花小游戏 本文章在学习python中进行的练习小游戏 目的是为了让学习者熟悉python中的列表 字典 集合等数据操作 游戏规则 一付扑克牌 去掉大小王 每个玩家发3张牌 最后比大小 看谁赢 有以下几种牌 豹子 三张一