炸金花底层模拟

news2025/1/15 18:18:29

一.说明

经常刷视频,看到一个有意思的项目,非常适合练手,今天这里我们实现炸金花的底层模拟。

二.游戏规则

  • 1.一副扑克牌去掉大小王,剩下52张牌
  • 2.参与游戏的玩家每人发三张牌
  • 3.比较每个人手中牌的大小
  • 4.若三张牌相同,则是豹子,豹子最大
  • 5.若三张牌是同花顺,其次
  • 6.若三张牌是顺子,但不是同花顺,再其次
  • 7.若有两张牌相同,则是对子
  • 8.若以上都没有,则是单子,单子中A最大

三.分析思路

实现炸金花的思路可以分为以下几个步骤:

  1. 定义扑克牌

首先需要定义一副扑克牌,包括52张牌,每张牌由花色和点数组成。可以使用列表或字典等数据结构来存储牌的信息。

  1. 洗牌

将牌洗乱,打乱顺序,保证每个人得到的牌是随机的。可以使用random库中的shuffle函数来实现洗牌。

  1. 发牌

将洗好的牌分发给玩家,可以根据玩家人数平均分配,每个玩家得到3张牌。

  1. 牌型判断

判断每个玩家手中的牌的牌型,例如三条、同花、顺子、同花顺、炸弹等。可以使用if语句和循环来实现牌型判断。

  1. 比较大小

比较每个玩家手中牌的大小,确定最终胜负。可以使用牌型和点数大小来进行比较。

  1. 结束游戏

当有一名玩家赢得游戏后,游戏结束,输出胜者信息。

以上就是实现炸金花的大致思路,具体实现过程中还需要考虑很多细节问题,如输入输出、异常处理等。

四.重要部分原理及实现

1.构造牌

每张牌由两个部分:花色和数值构成,这样可以分别使用两个列表存储

list_colour=['♥','♣','♠','♦']                             #构造花色
list_num=[2,3,4,5,6,7,8,9,10,'J','Q','K','A']             #构造值
list_card=[]                                              #构造牌

def create_card():
    for i in list_colour:
        for j in list_num:
            card=f"{i}{j}"
            list_card.append(card)
    return list_card

2.比对牌

炸金花中比对牌大小的函数需要考虑以下几个因素:

  1. 牌型:不同的牌型有着不同的大小关系,例如豹子最大,依次为顺金、金花、顺子、对子、单牌。
  2. 点数和花色:对于同一种牌型,点数和花色也有着大小的区别。如顺子和同花顺,若两人都是同样的顺子,则比较顺子的最大点数,点数大者胜;若两人都是同花顺,则比较花色,黑桃最大,方块最小。
  3. 牌面点数:在对子和单牌的情况下,需要比较牌面点数大小,点数大者胜出。
  4. 特殊牌型:特殊的情况下有特殊的大小关系。如三张2可以打过任意其他的牌型,但是仅三张2之间还存在大小关系。

因此,比对牌大小的函数可以通过以下步骤来实现:

  1. 判断两张牌的牌型,若不同则直接返回比较结果。若相同则进入下一步。
  2. 根据牌型的大小关系确定胜负。例如豹子最大,对子和单牌需要比较牌面点数,而顺子和同花顺需要比较最大点数和花色。
  3. 若牌型相同、点数或花色相同,则需要继续比较下一张牌的大小。这个过程可以使用递归来实现。
  4. 如果两手牌都是特殊牌型,则需要按照特殊牌型的大小关系来比较。

里面最难的问题就是怎么判断牌的大小,因为每种的牌不一致,我们这里采用权值的方式来实现。

#判断单子
def danzi(list):
    result=0.1*list[0]+1*list[1]+10*list[2]         #[2,3,A]=143.2  [10,Q,K]=143
    return result

#判断对子
def duizi(list):
    if len(set(list))==2:                             #说明有对子
        counts = Counter(list)
        most_common_element = counts.most_common(1)[0][0]      #要知道重复的是哪个元素,这里元素的最大次数肯定是2
        least_common_element = counts.most_common()[-1][0]     #最少的元素既是单独的哪个元素
        result=most_common_element*100+least_common_element*1  #最大单子:[J,K,A]=143.2,最小对子:[2,2,3]=203
        return result
    else:
        return 0

#判断顺子
def shunzi(list):
    if (list[1]-list[0]==1) and (list[2]-list[1]==1):                 #说明有顺子
        result=list[2]*300+list[1]*100+list[0]*10                    #最小顺子:[2,3,4]=1520,最大对子:[K,A,A]=1413
        return result
    else:
        return 0

#判断同花顺
def simlar_colour_shunzi(list1,list2):
    if (list1[1]-list1[0]==1)and(list1[2]-list1[1]==1):
        if list2[0]==list2[1]==list2[2]:
            reslut=list1[2]*1000+list1[1]*500+list1[0]*100
            return reslut
        else:
            return 0
    else:
        return 0

#判断豹子
def baozi(list):
    if list[0]==list[1]==list[2]:                                         #最大同花顺:[Q,K,A]=21700,最小豹子:[2,2,2]=30000
        result=list[0]*15000
        return result
    else:
        return 0

五.python实现

import random
from collections import Counter
list_colour=['♥','♣','♠','♦']                             #构造花色
list_num=[2,3,4,5,6,7,8,9,10,'J','Q','K','A']             #构造值
list_card=[]                                              #构造牌

def create_card():
    for i in list_colour:
        for j in list_num:
            card=f"{i}{j}"
            list_card.append(card)
    return list_card

list_user=["张三","李四","王五","赵六"]                      #构造用户

#发牌
def fapai():
    random.shuffle(list_card)                   #洗牌,打乱列表的顺序
    user_cards = {}                             #可以使用字典存储每个用户的组
    for i in list_user:
        cards = []                              #值是一个列表对象
        for _ in range(3):
            card = list_card.pop()              #取出列表里面的最后一个元素并从列表删除
            cards.append(card)
        user_cards[i] = cards                   #存放到值的列表中
    return user_cards

#改变部分牌的值
def change(a):
    if a=='J':
        a=11
    if a=='Q':
        a=12
    if a=='K':
        a=13
    if a=='A':
        a=14
    return a

#判断单子
def danzi(list):
    result=0.1*list[0]+1*list[1]+10*list[2]         #[2,3,A]=143.2  [10,Q,K]=143
    return result

#判断对子
def duizi(list):
    if len(set(list))==2:                             #说明有对子
        counts = Counter(list)
        most_common_element = counts.most_common(1)[0][0]      #要知道重复的是哪个元素,这里元素的最大次数肯定是2
        least_common_element = counts.most_common()[-1][0]     #最少的元素既是单独的哪个元素
        result=most_common_element*100+least_common_element*1  #最大单子:[J,K,A]=143.2,最小对子:[2,2,3]=203
        return result
    else:
        return 0

#判断顺子
def shunzi(list):
    if (list[1]-list[0]==1) and (list[2]-list[1]==1):                 #说明有顺子
        result=list[2]*300+list[1]*100+list[0]*10                    #最小顺子:[2,3,4]=1520,最大对子:[K,A,A]=1413
        return result
    else:
        return 0

#判断同花顺
def simlar_colour_shunzi(list1,list2):
    if (list1[1]-list1[0]==1)and(list1[2]-list1[1]==1):
        if list2[0]==list2[1]==list2[2]:
            reslut=list1[2]*1000+list1[1]*500+list1[0]*100
            return reslut
        else:
            return 0
    else:
        return 0

#判断豹子
def baozi(list):
    if list[0]==list[1]==list[2]:                                         #最大同花顺:[Q,K,A]=21700,最小豹子:[2,2,2]=30000
        result=list[0]*15000
        return result
    else:
        return 0


#测试代码
create_card()                          #初始化,生成牌
user_cards = {}
user_cards = fapai()                                #发牌
print(user_cards)
zuihou=[]
for i in list_user:
    list=user_cards.get(i)              #取出每张牌
    a=list[0]
    b=list[1]
    c=list[2]
    card_a=(a[1:])
    card_b=(b[1:])
    card_c=(c[1:])
    card_a = change(card_a)
    card_b = change(card_b)
    card_c = change(card_c)
    value=[int(card_a),int(card_b),int(card_c)]
    sorted_value=sorted(value)
    colour_a = (a[0:1])
    colour_b = (b[0:1])
    colour_c = (c[0:1])
    colour=[colour_a,colour_b,colour_c]
    result1=danzi(sorted_value)
    result2=duizi(sorted_value)
    result3=shunzi(sorted_value)
    result4=simlar_colour_shunzi(sorted_value,colour)
    result5=baozi(sorted_value)
    result=[result1,result2,result3,result4,result5]
    zuihou.append(result)
print(zuihou)
jieguo1=sorted(zuihou[0])
jieguo2=sorted(zuihou[1])
jieguo3=sorted(zuihou[2])
jieguo4=sorted(zuihou[3])
a=jieguo1[4]
b=jieguo2[4]
c=jieguo3[4]
d=jieguo4[4]
value=sorted([a,b,c,d])
print(value)
if value[3]==a:
    print(f"{list_user[0]}赢了")
if value[3]==b:
    print(f"{list_user[1]}赢了")
if value[3]==c:
    print(f"{list_user[2]}赢了")
if value[3]==d:
    print(f"{list_user[3]}赢了")

六.实验结果

wjY6.jpg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/557683.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【工具】vscode的常用插件之注释插件

🐚作者简介:花神庙码农(专注于Linux、WLAN、TCP/IP、Python等技术方向)🐳博客主页:花神庙码农 ,地址:https://blog.csdn.net/qxhgd🌐系列专栏:善假于物&#…

CyberLink的视频编辑软件PowerDirector Ultimate 21.4版本在win10系统的下载与安装配置教程

目录 前言一、PowerDirector Ultimate安装二、使用配置总结 前言 PowerDirector Ultimate是由CyberLink公司开发的一款视频编辑软件,其为高级版本,拥有多种强大的视频编辑和效果功能。该软件具有许多强大的功能和工具,包括多轨时间线编辑、视…

CBLUE_中文生物医学语言理解评估基准_源码详解

CBLUE_中文生物医学语言理解评估基准_源码详解 源码链接:https://github.com/CBLUEbenchmark/CBLUE 项目中包括八个不同的中文医学NLP任务:1.中文医学命名实体识别(CMeEE)、2.中文医学文本实体关系抽取(CMeIE&#xf…

英国 VM600 CPUR2 机架控制器和通信接口卡

英国 VM600 CPUR2 机架控制器和通信接口卡VM600 CPUR2/IOCR2机架控制器和通信接口卡对,支持Modbus TCP和PROFIBUS DP使用以太网连接到运行VM600 MPSx和VibroSight软件的计算机,对VM600机架中的保护卡(MPC4)进行“一次性”配置管理对通过现场总线共享的数…

基于 Python 长时间序列遥感数据处理及在全球变化、物候提取、植被变绿与固碳分析、生物量估算与趋势分析等领域中的应用

植被是陆地生态系统中最重要的组分之一,也是对气候变化最敏感的组分,其在全球变化过程中起着重要作用,能够指示自然环境中的大气、水、土壤等成分的变化,其年际和季节性变化可以作为地球气候变化的重要指标。此外,由于…

【CANN训练营0基础赢满分秘籍】 应用开发深入讲解→端到端案例

1 样例调试 1.1 日志文件 运行应用程序后,若出现报错或异常,需录取日志进一步定位问题。日志文件的默认目录为$HOME/ascend/log。 可通过环境变量指定日志文件的落盘路径 export ASCEND_PROCESS_LOG_PATH/$HOME/xxx但需要确保该目录为任意有读写权限…

文档图像智能分析与处理:CCIG技术论坛的思考与展望

文档图像智能分析与处理:CCIG技术论坛的思考与展望 文档识别与理解的发展趋势视觉-语言预训练模型在文档处理中的应用篡改文本图像的生成与检测的研究进展华为云OCR技术的进展与行业实践智能文档处理技术的应用与挑战文档图像预处理的整体架构弯曲矫正摩尔纹去除版面…

【Linux】普通用户无法使用sudo指令的方法

​ ​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:Linux 🎯长路漫漫浩浩,万事皆有期待 上一篇博客:【Linux】…

计算机视觉的应用6-利用VGG模型做毕加索风格图像迁移

大家好,我是微学AI,今天给大家介绍一下计算机视觉的应用5-利用VGG模型做毕加索风格图像迁移,本文将利用VGG模型实现毕加索风格图像迁移的方法。首先,我们将简要说明图像风格迁移的原理,然后使用PyTorch框架&#xff0c…

chatgpt赋能Python-python_fig

Python中的fig:简介和应用 什么是fig? fig是Python中一个高效且易用的图形库,它支持大量的图像绘制功能,包括2D图形绘制、曲线和图像处理,以及3D图形和动画绘制等应用。fig可以在多个平台上运行,包括Wind…

客户体验|审美体验与体验管理

Guofu 第 93⭐️ 篇原创文章分享 (点击👆🏻上方卡片关注我,加⭐️星标⭐️~) 🚏 写在前面 伽达默尔说:“如果某个东西被经历过,而且它的经历存在还获得一种使自身继续存在意义的特征…

chatgpt赋能Python-python_har

Python HAR:一种高效的网络监测工具 Python HAR(HTTP Archive)是一个用于监测网络资源的强大工具,它能够记录网络请求、响应和资源加载的细节信息,并以可视化和格式化的方式呈现出来。Python HAR的应用范围广泛&#…

单模光纤二维模场分布的MATLAB仿真

在上一篇文章中,我们介绍了单模光纤的一维模场分布,能看出沿着径向的光场分布情况,并分析能量的分布 这一篇中,我们绘制光纤横截面上的二维光场分布:代码如下: clear close all V 2.4000; U 1.6453; W …

C4D R26 渲染学习笔记(1):C4D版本选择和基础知识(更新中)

C4D版本知识 C4D通过R来进行版本区分,现在2023年5月22日最新版的是R26。说一下特殊版本。 C4D版本介绍特点R19OC快乐版3.07最高版本,OC是C4D最具性价比的渲染器,OC学习成本低,渲染速度快,但是注意OC 3.07只支持10系N…

如何提取微信公众号的链接?非常简单!

今天在公众号里面想要复制公众号链接,用于小程序里面引导用户关注,因为小程序里面的关注公众号只能是扫码小程序才能使用,想起以前使用的原始链接跳转方法,就想试一试,结果公众号后台居然没有链接可以复制了&#xff0…

代码随想录算法训练营day49 | 121. 买卖股票的最佳时机,122.买卖股票的最佳时机II

代码随想录算法训练营day49 | 121. 买卖股票的最佳时机,122.买卖股票的最佳时机II 121. 买卖股票的最佳时机解法一:动态规划解法二:贪心算法 122.买卖股票的最佳时机II解法一:动态规划解法二:贪心算法 121. 买卖股票的…

数据要素流通使用的安全风险分析及应对策略

数据要素流通使用的安全风险分析及应对策略 刘业政1,2, 宗兰芳1, 金斗1,袁昆1,2 1 合肥工业大学管理学院,安徽 合肥 230009 2 大数据流通与交易技术国家工程实验室,上海 201203 摘要:系统地分析了数据要素流通使用过程中存在的安全…

直播预告 | 医疗人工智能入行经验分享

(本文阅读时间:2 分钟) 或许大家从不同程度上听说或使用过智能导诊机器人、语音电子病历或是智能问诊?这些高端大气又便利的产物都是人工智能在医疗健康领域的重要应用场景产品及服务。 “AI医疗”是人工智能技术赋能医疗健康产业…

综述 | 基于 Transformer 网络的多模态学习

关注公众号,发现CV技术之美 Transformer 网络结构作为一种性能卓越的神经网络学习器,已经在各类机器学习问题中取得了巨大的成功。伴随着近年来多模态应用和多模态大数据的蓬勃发展,基于Transformer 网络的多模态学习已经成为了人工智能领域的…

chatgpt赋能Python-python_for_loop

Python For Loop: 了解循环结构控制的重要性 在Python编程中,循环结构控制是必备技能之一。它允许程序员重复执行指定的代码块,而不需要手动多次输入。Python提供了几种类型的循环结构,其中for循环是最常用的之一。我们将在本文中讨论for循环…