当前位置: 首页 > news >正文

python——扑克牌案列

斗地主发牌程序:
模拟一个斗地主发牌程序,实现对三个玩家进行手牌的派发,实现功能:

********** 欢迎进入 XX 斗地主 **********
请输入玩家姓名:<用户控制台输入 A>
请输入玩家姓名:<用户控制台输入 B>
请输入玩家姓名:<用户控制台输入 C>
洗牌中...
洗牌完成!
发牌中...
发牌完成!
A:<在这里展示 A 的所有手牌,要求按照从小到大的顺序排序,相同点数的情况下,按照 黑桃 > 红桃 > 方片 > 梅花 的大小关系排列>
B:<在这里展示 B 的所有手牌,要求按照从小到大的顺序排序,相同点数的情况下,按照 黑桃 > 红桃 > 方片 > 梅花 的大小关系排列>
C:<在这里展示 C 的所有手牌,要求按照从小到大的顺序排序,相同点数的情况下,按照 黑桃 > 红桃 > 方片 > 梅花 的大小关系排列>
谁叫地主? <用户控制台输入 A>
地主牌:<在这里展示地主牌,要求按照从小到大的顺序排序,相同点数的情况下,按照 黑桃 > 红桃 > 方片 > 梅花 的大小关系排列>
A:<在这里展示 A 的所有手牌,要求按照从小到大的顺序排序,相同点数的情况下,按照 黑桃 > 红桃 > 方片 > 梅花 的大小关系排列>
B:<在这里展示 B 的所有手牌,要求按照从小到大的顺序排序,相同点数的情况下,按照 黑桃 > 红桃 > 方片 > 梅花 的大小关系排列>
C:<在这里展示 C 的所有手牌,要求按照从小到大的顺序排序,相同点数的情况下,按照 黑桃 > 红桃 > 方片 > 梅花 的大小关系排列>


解题思路:
1. 需要准备一副扑克牌:
a. 一副扑克牌,本身就是一个数据容器,其中存储了54个扑克牌对象
b. 扑克牌类,需要具有的属性和方法:
ⅰ. 属性:点数、花色
ⅱ. 功能:显示(将自己的点数和花色拼接成一个字符串返回),可以比较大小
c. 扑克牌的点数和花色的类型:
ⅰ. 问题:无法直接通过字符串,比较大小
ⅱ. 解决:自定义数据类型,包含两个属性:呈现效果,权重
d. 顺序生成54张牌
e. 洗牌
2. 发牌
a. 遍历牌堆,依次给每一个玩家发牌
b. 【偷懒】切片,切17张牌给到玩家


import randomclass Poker:def __init__(self, suit, color, suit_weight, color_weight):self.suit = suitself.color = colorself.suit_weight = suit_weightself.color_weight = color_weightdef __repr__(self):if self.color != None:return f"{self.suit}{self.color}"else:return f"{self.suit}"def initPoker():poker_list = []for i in range(1, 14):suit = Nonesuit_weight = iif i == 1:suit = "A"suit_weight = 12elif i == 2:suit = 2suit_weight = 13elif i == 11:suit_weight = 9suit = "J"elif i == 12:suit_weight = 10suit = "Q"elif i == 13:suit_weight = 11suit = "K"else:suit_weight = i - 2suit = ifor k in range(1, 5):color = Nonecolor_weight = kmatch k:case 1:color = "♠"case 2:color = "♥"case 3:color = "♣"case 4:color = "♦"poker_list.append(Poker(suit, color, suit_weight, color_weight))poker_list.append(Poker("大王", None, 100, None))poker_list.append(Poker("小王", None, 99, None))return poker_listdef getThreePlayerName():# 输入三个玩家的名字s1 = set()while True:p1 = input("请输入第一个玩家的名字:")p2 = input("请输入第二个玩家的名字:")p3 = input("请输入第三个玩家的名字:")s1.add(p1)s1.add(p2)s1.add(p3)if len(s1) < 3:print("输入的玩家有重名的,请重新输入!")continueelse:return p1, p2, p3class Player:def __init__(self, name):self.name = nameself.poker_list = list()def __repr__(self):return f"{self.name}"# 发牌方法
"""
def send_pokers(self, poker_list: list[Poker], player_list: list[Player]):for i in range(17):print(player_list[0])player_list[0].poker_list.append(poker_list.pop())player_list[1].poker_list.append(poker_list.pop())player_list[2].poker_list.append(poker_list.pop())
"""def showAllPlayerPoker(player_list: list[Player]):for i in range(len(player_list)):player = player_list[i]print(f"玩家的名字{player.name}")player.poker_list = sorted(player.poker_list, key=lambda poker: (poker.suit_weight, poker.color_weight))print(f"玩家的牌是:{player.poker_list}")# 欢迎界面
def showMainScreen():print("**********欢迎进入东湖斗地主**********")n1, n2, n3 = getThreePlayerName()print(n1, n2, n3)playerList:list[Player] = [Player(n1), Player(n2), Player(n3)]# 初始化一下牌poker_list = initPoker()print(poker_list)print("洗牌中...")random.shuffle(poker_list)# 调用洗牌方法print("洗牌完成!")print(poker_list)print("发牌中...")# 调用发牌方法print(poker_list)print(playerList)# send_pokers(poker_list, playerList)for i in range(17):playerList[0].poker_list.append(poker_list.pop())playerList[1].poker_list.append(poker_list.pop())playerList[2].poker_list.append(poker_list.pop())print(poker_list)showAllPlayerPoker(playerList)# 叫地主master = input("谁叫地主?  ")if master in (n1, n2, n3):print(f"{master}是地主!")master_player = Nonefor player in playerList:if master == player.name:master_player = playermaster_player.poker_list += poker_listprint("**********叫地主结束**********")showAllPlayerPoker(playerList)print("发牌完成!")# 调用主方法
showMainScreen()

第二种方法:

"""1 创建一个类,Poker 类  点位JQKA  花色   权重  花色权重2、主屏幕3、初始化一副牌  54张3、调用三个玩家的初始化操作  玩家类 Player  属性  name  List存放玩家的牌4、洗牌 random.shuffle5、发牌  需要一个List[Poker]   使用 pop 冒出来一张,给三个玩家,同时删除这个List中的一张6、展示某个玩家的牌
"""
import randomclass Poker:def __init__(self,suit,color,suit_weight,color_weight):self.suit=suitself.color=colorself.suit_weight=suit_weightself.color_weight=color_weightdef __repr__(self):# 大小王怎么办?if self.color is None:return str(self.suit)else:return self.color+str(self.suit)# 初始化三个玩家,姓名要不同
def initPlayer():s1 = set() # 存储3个玩家的姓名# 定义一个List集合,存储各个玩家对象initPlayerList = []while True:name = input(f"请输入第{len(s1)+1}个玩家的姓名(不要重复):")s1.add(name)if len(s1) == 3:breakfor name in s1:initPokerList = []player = Player(name,initPokerList)initPlayerList.append(player)return initPlayerListclass Player:def __init__(self,name,list):self.name=nameself.list = listdef __repr__(self):return self.name +",扑克牌是:"+ ",".join(self.list)# 初始化一副牌
def initPoker():#54张牌initPokerList = []for i in range(1,14):suit = isuit_weight = imatch i:case 1:suit = 'A'suit_weight = 14case 11:suit = 'J'suit_weight = 9case 12:suit = 'Q'suit_weight = 10case 13:suit = 'K'suit_weight = 11case 2:suit_weight = 15case _:suit_weight = i - 2for color in ['♥','♠','♦','♣']:# 黑桃 > 红桃 > 方片 > 梅花color_weight = 0match color:case '♠':color_weight = 1case '♥':color_weight = 2case '♦':color_weight = 3case '♣':color_weight = 4poker = Poker(suit, color, suit_weight,color_weight)initPokerList.append(poker)initPokerList.append(Poker('大王',None,100,None))initPokerList.append(Poker('小王',None,100,None))return initPokerListdef showAllPokerByPlayer(player):print(f"开始展示{player.name}的所有牌:")pokerList = player.list# 先将所有的牌排序pokerList = sorted(pokerList,key=lambda poker: (poker.suit_weight,poker.color_weight) )print(pokerList)if __name__ == '__main__':print("----欢迎来到新澳门葡京娱乐城------")playList = initPlayer()print(playList)pokerList = initPoker()print(pokerList)# 开始洗牌print("洗牌中.....")random.shuffle(pokerList)print(pokerList)print("开始发牌.....")for index in range(len(pokerList)-3):poker = pokerList.pop()player = playList[index % 3]player.list.append(poker)# 先叫地主name = input("叫地主:")for player in playList:if player.name == name:print(f"{name}是地主")# 两个list的合并player.list += pokerList# 展示所有的底牌# 展示所有人的牌print("展示所有玩家的牌....")for player in playList:showAllPokerByPlayer(player)

相关文章:

python——扑克牌案列

斗地主发牌程序&#xff1a; 模拟一个斗地主发牌程序&#xff0c;实现对三个玩家进行手牌的派发&#xff0c;实现功能&#xff1a; ********** 欢迎进入 XX 斗地主 ********** 请输入玩家姓名&#xff1a;<用户控制台输入 A> 请输入玩家姓名&#xff1a;<用户控制台输…...

Java最全面试题->Java基础面试题->JavaWeb面试题->Git/SVN面试题

文章目录 Git/SVN面试题Git和SVN有什么区别&#xff1f;SVN优缺点&#xff1f;Git优缺点&#xff1f;说一下Git创建分支的步骤&#xff1f;说一下Git合并的两种方法以及区别&#xff1f;Git如何查看文件的提交历史和分支的提交历史?什么是 git stash&#xff1f;什么是git sta…...

引进Menu菜单与新增验证上传图片功能--系统篇

我的迭代小系统要更新2点。一是后台需要引进一种导航&#xff0c;众多导航之中我选择了Menu菜单。二是上传图片接口需要新增验证上传图片环节。先看看更新2点后的效果 引进Menu菜单效果如下&#xff0c;这部分修改后台前端代码 引进Menu菜单后&#xff0c;Menu菜单的默认数据我…...

安装Python及pip使用方法详解

一、安装Python Python是一种广泛使用的高级编程语言&#xff0c;其安装过程相对简单。以下是具体步骤&#xff1a; 访问Python官网&#xff1a; 打开浏览器&#xff0c;访问Python的官方网站[python.org](https://www.python.org/)&#xff0c;确保下载的是最新版本的Python安…...

利用Arcgis进行沟道形态分析

在做项目的时候需要学习到水文分析和沟道形态分析的学习&#xff0c;所以自己摸索着做了下面的工作和内容。如有不对请多指正&#xff01;&#xff01; 一、沟道形态分析概述 沟道形态分析是水文分析的一个重要方面&#xff0c;用于研究河流的形态和特征。沟道形态分析可以帮助…...

Excel:vba实现筛选出有批注的单元格

实现的效果&#xff1a;代码&#xff1a; Sub test() Dim cell As RangeRange("F3:I10000").ClearlastRow Cells(Rows.Count, "f").End(xlUp).Row MsgBox lastrow For Each cell In Range("a1:a21")If Not cell.Comment Is Nothing ThenMsgBox…...

RabbitMQ 发布确认模式

RabbitMQ 发布确认模式 一、原理 RabbitMQ 的发布确认模式&#xff08;Publisher Confirms&#xff09;是一种机制&#xff0c;用于确保消息在被 RabbitMQ 服务器成功接收后&#xff0c;发布者能够获得确认。这一机制在高可用性和可靠性场景下尤为重要&#xff0c;能够有效防止…...

【面试题】什么是SpringBoot以及SpringBoot的优缺点

什么是SpringBoot以及SpringBoot的优缺点 什么是SpringBoot SpringBoot是基于Spring的一个微框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。 SpringBoot的优点 可以创建独立的Spring应用程序&#xff0c;并且基于其Maven或Gradle插件&#xff0c;可以创建可执…...

git区分大小写吗?如果不区分,那要如何设置?

git区分大小写吗&#xff1f;如果不区分&#xff0c;那要如何设置&#xff1f; "Git在文件名的大小写方面是区分大小写的&#xff0c;但在某些操作系统&#xff08;如Windows和macOS&#xff09;上&#xff0c;文件系统默认是不区分大小写的。这可能导致一些问题&#xf…...

Docker 安装使用

1. 下载 下载地址&#xff1a;Index of linux/static/stable/x86_64/ 下载好后&#xff0c;将文件docker-18.06.3-ce.tgz用WinSCP等工具&#xff0c;上传到不能外网的linux系统服务器 2. 安装 解压后的文件夹docker中文件如下所示&#xff1a; 将docker中的全部文件&#xff…...

Linux Docker配置镜像加速

Docker配置常用镜像加速地址包含阿里、腾讯、百度、网易 1. 编辑docke配置文件 vim /etc/docker/daemon.json写入以下内容 {"registry-mirrors": ["https://docker.mirrors.aliyuncs.com","https://registry.docker-cn.com","https://mi…...

了解CSS Typed OM

CSS Typed OM&#xff08;CSS Typed Object Model&#xff09;是一项前沿的技术&#xff0c;旨在改变我们编写和操作CSS的方式。以下是对CSS Typed OM的详细解析&#xff1a; 一、CSS Typed OM概述 CSS Typed OM是一个包含类型和方法的CSS对象模型&#xff0c;它暴露了作为Ja…...

[ 钓鱼实战系列-基础篇-6 ] 一篇文章让你了解邮件服务器机制(SMTP/POP/IMAP)-2

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…...

在 Docker 中搭建 PostgreSQL16 主从同步环境

1. 环境搭建 本文介绍了如何在同一台机器上使用 Docker 容器搭建 PostgreSQL 的主从同步环境。通过创建互联网络和配置主库及从库&#xff0c;详细讲解了数据库初始化、角色创建、数据同步和验证步骤。主要步骤包括设置主库的连接信息、创建用于复制的角色、使用 pg_basebacku…...

SpringCloud无介绍快使用,sentinel服务熔断功能与持久化(二十四)

TOC 问题背景 从零开始学springcloud微服务项目 注意事项&#xff1a; 约定 > 配置 > 编码IDEA版本2021.1这个项目&#xff0c;我分了很多篇章&#xff0c;每篇文章一个操作步骤&#xff0c;目的是显得更简单明了controller调service&#xff0c;service调dao默认安装ngi…...

判断浏览器环境,前端打开微信浏览器

我们知道微信浏览器有自带针对微信的组件(比如&#xff1a;微信JSAPI支付使用的WeixinJSBridge)&#xff0c;那么&#xff0c;有办法在普通浏览器中打开微信浏览器并跳转页面吗&#xff1f;(似乎微信已禁用外部浏览器调用的普通页面直接跳转&#xff0c;只能通过“weixin://前缀…...

【算法笔记】前缀和算法原理深度剖析(超全详细版)

【算法笔记】前缀和算法原理深度剖析&#xff08;超全详细版&#xff09; &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;算法笔记 文章目录 【算法笔记】前缀和算法原理深度剖析&#xff08;超全详细版&#xff09;前言一.一维前缀和1.1题…...

linux之网络子系统- 地址解析协议arp 源码分析和邻居通用框架

一、arp 的作用 ARP&#xff08;Address Resolution Protocol&#xff0c;地址解析协议&#xff09;是将IP地址解析为以太网MAC地址&#xff08;物理地址&#xff09;的协议。在局域网中&#xff0c;当主机或其他网络设备有数据要发送给另一个主机或设备时&#xff0c;它必须知…...

经典动态规划问题:含手续费的股票买卖【从 O(n) 到 O(1) 的优化解析】

题目理解 我们要在给定的股票价格数组 prices 中进行买卖操作&#xff0c;并尽可能多次交易以获取最大利润。每次交易都需要支付一定的手续费 fee&#xff0c;因此我们必须考虑如何通过合适的交易策略最大化利润。 在本题中&#xff0c;每一天可以选择&#xff1a; 不进行任…...

Python画笔案例-088 绘制 滚动的汉字

1、绘制 滚动的汉字 通过 python 的turtle 库绘制 滚动的汉字,如下图: 2、实现代码 绘制 滚动的汉字,以下为实现代码: """滚动的汉字.py """ import time from turtle import * from write_patch import *width,height...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分&#xff1a; 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...

MySQL:分区的基本使用

目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区&#xff08;Partitioning&#xff09;是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分&#xff08;分区&#xff09;可以独立存储、管理和优化&#xff0c;…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...