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——扑克牌案列
斗地主发牌程序: 模拟一个斗地主发牌程序,实现对三个玩家进行手牌的派发,实现功能: ********** 欢迎进入 XX 斗地主 ********** 请输入玩家姓名:<用户控制台输入 A> 请输入玩家姓名:<用户控制台输…...
Java最全面试题->Java基础面试题->JavaWeb面试题->Git/SVN面试题
文章目录 Git/SVN面试题Git和SVN有什么区别?SVN优缺点?Git优缺点?说一下Git创建分支的步骤?说一下Git合并的两种方法以及区别?Git如何查看文件的提交历史和分支的提交历史?什么是 git stash?什么是git sta…...
引进Menu菜单与新增验证上传图片功能--系统篇
我的迭代小系统要更新2点。一是后台需要引进一种导航,众多导航之中我选择了Menu菜单。二是上传图片接口需要新增验证上传图片环节。先看看更新2点后的效果 引进Menu菜单效果如下,这部分修改后台前端代码 引进Menu菜单后,Menu菜单的默认数据我…...
安装Python及pip使用方法详解
一、安装Python Python是一种广泛使用的高级编程语言,其安装过程相对简单。以下是具体步骤: 访问Python官网: 打开浏览器,访问Python的官方网站[python.org](https://www.python.org/),确保下载的是最新版本的Python安…...
利用Arcgis进行沟道形态分析
在做项目的时候需要学习到水文分析和沟道形态分析的学习,所以自己摸索着做了下面的工作和内容。如有不对请多指正!! 一、沟道形态分析概述 沟道形态分析是水文分析的一个重要方面,用于研究河流的形态和特征。沟道形态分析可以帮助…...
Excel:vba实现筛选出有批注的单元格
实现的效果:代码: 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 的发布确认模式(Publisher Confirms)是一种机制,用于确保消息在被 RabbitMQ 服务器成功接收后,发布者能够获得确认。这一机制在高可用性和可靠性场景下尤为重要,能够有效防止…...
【面试题】什么是SpringBoot以及SpringBoot的优缺点
什么是SpringBoot以及SpringBoot的优缺点 什么是SpringBoot SpringBoot是基于Spring的一个微框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。 SpringBoot的优点 可以创建独立的Spring应用程序,并且基于其Maven或Gradle插件,可以创建可执…...
git区分大小写吗?如果不区分,那要如何设置?
git区分大小写吗?如果不区分,那要如何设置? "Git在文件名的大小写方面是区分大小写的,但在某些操作系统(如Windows和macOS)上,文件系统默认是不区分大小写的。这可能导致一些问题…...
Docker 安装使用
1. 下载 下载地址:Index of linux/static/stable/x86_64/ 下载好后,将文件docker-18.06.3-ce.tgz用WinSCP等工具,上传到不能外网的linux系统服务器 2. 安装 解压后的文件夹docker中文件如下所示: 将docker中的全部文件ÿ…...
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(CSS Typed Object Model)是一项前沿的技术,旨在改变我们编写和操作CSS的方式。以下是对CSS Typed OM的详细解析: 一、CSS Typed OM概述 CSS Typed OM是一个包含类型和方法的CSS对象模型,它暴露了作为Ja…...
[ 钓鱼实战系列-基础篇-6 ] 一篇文章让你了解邮件服务器机制(SMTP/POP/IMAP)-2
🍬 博主介绍 👨🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…...
在 Docker 中搭建 PostgreSQL16 主从同步环境
1. 环境搭建 本文介绍了如何在同一台机器上使用 Docker 容器搭建 PostgreSQL 的主从同步环境。通过创建互联网络和配置主库及从库,详细讲解了数据库初始化、角色创建、数据同步和验证步骤。主要步骤包括设置主库的连接信息、创建用于复制的角色、使用 pg_basebacku…...
SpringCloud无介绍快使用,sentinel服务熔断功能与持久化(二十四)
TOC 问题背景 从零开始学springcloud微服务项目 注意事项: 约定 > 配置 > 编码IDEA版本2021.1这个项目,我分了很多篇章,每篇文章一个操作步骤,目的是显得更简单明了controller调service,service调dao默认安装ngi…...
判断浏览器环境,前端打开微信浏览器
我们知道微信浏览器有自带针对微信的组件(比如:微信JSAPI支付使用的WeixinJSBridge),那么,有办法在普通浏览器中打开微信浏览器并跳转页面吗?(似乎微信已禁用外部浏览器调用的普通页面直接跳转,只能通过“weixin://前缀…...
【算法笔记】前缀和算法原理深度剖析(超全详细版)
【算法笔记】前缀和算法原理深度剖析(超全详细版) 🔥个人主页:大白的编程日记 🔥专栏:算法笔记 文章目录 【算法笔记】前缀和算法原理深度剖析(超全详细版)前言一.一维前缀和1.1题…...
linux之网络子系统- 地址解析协议arp 源码分析和邻居通用框架
一、arp 的作用 ARP(Address Resolution Protocol,地址解析协议)是将IP地址解析为以太网MAC地址(物理地址)的协议。在局域网中,当主机或其他网络设备有数据要发送给另一个主机或设备时,它必须知…...
经典动态规划问题:含手续费的股票买卖【从 O(n) 到 O(1) 的优化解析】
题目理解 我们要在给定的股票价格数组 prices 中进行买卖操作,并尽可能多次交易以获取最大利润。每次交易都需要支付一定的手续费 fee,因此我们必须考虑如何通过合适的交易策略最大化利润。 在本题中,每一天可以选择: 不进行任…...
Python画笔案例-088 绘制 滚动的汉字
1、绘制 滚动的汉字 通过 python 的turtle 库绘制 滚动的汉字,如下图: 2、实现代码 绘制 滚动的汉字,以下为实现代码: """滚动的汉字.py """ import time from turtle import * from write_patch import *width,height...
iOS模拟器效率革命:Alfred工作流实现键盘流式开发
1. 项目概述与核心价值如果你是一名iOS开发者,或者正在学习Swift或React Native,那么你一定对Xcode自带的iOS模拟器又爱又恨。爱的是它让我们在没有实体设备的情况下也能快速测试应用;恨的是每次想启动模拟器、安装应用、截图或录屏ÿ…...
MCP密钥安全管理的无侵入解决方案:mcp-safe-run工具详解
1. 项目概述:告别硬编码,拥抱安全的MCP密钥管理如果你和我一样,日常开发中深度依赖Claude、Cursor、Windsurf这类智能编码助手,那你肯定对Model Context Protocol(MCP)不陌生。MCP作为连接AI模型与外部工具…...
2篇3章3节:Trae 的高效小说创作与文件管理实操
在人工智能辅助小说创作的过程中,工具操作方式、内容生成逻辑与文件管理体系,直接决定写作效率与文稿质量。Trae作为适配小说创作的专业工具,不仅支持单章、全章智能化生成正文内容,适配短篇、长篇不同创作场景,还具备多屏拆分、标签页管理、规范化文件收纳等实用功能。熟…...
移动SoC设计演进:从骁龙600/400系列看芯片战略与体验竞争
1. 从一场发布会看移动芯片的十年演进2015年2月,巴塞罗那世界移动通信大会前夕,高通的一则新闻稿在业内激起了不小的涟漪。他们宣布了全新的骁龙600和400系列移动平台,其中最引人注目的,是首次将当时ARM最新的64位Cortex-A72核心引…...
OpenClaw 如何实现任务恢复与失败重试?
网罗开发(小红书、快手、视频号同名)大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方…...
新手入门教程使用curl命令直连Taotoken测试大模型聊天补全接口
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 新手入门教程:使用curl命令直连Taotoken测试大模型聊天补全接口 本文面向刚接触API调用的开发者,旨在指导如…...
共享屏幕怎么弄 共享屏幕用什么工具好
共享屏幕怎么弄?不管是异地办公同步方案、远程协助操作设备,还是和朋友分享游戏画面,都离不开共享屏幕的需求。共享屏幕怎么弄才不麻烦、不卡顿?其实答案很简单,无界趣连2.0就能轻松搞定,不用复杂设置&…...
Linux fanotify vs inotify:如何为你的监控需求选择正确的工具?
Linux文件监控技术选型:fanotify与inotify深度对比与实践指南 在构建需要实时感知文件系统变化的应用程序时,开发者常面临监控工具的选择困境。无论是开发安全扫描工具、持续备份系统还是智能IDE,文件监控都是核心需求。Linux平台提供了inoti…...
别再只点CubeMX的SDRAM选项了!STM32F429IGT6外扩W9825G6KH内存的完整驱动与读写测试指南
STM32F429IGT6外扩W9825G6KH内存实战:从CubeMX配置到完整驱动开发的深度解析 如果你正在使用STM32F429IGT6开发板,并且需要扩展大容量内存,W9825G6KH-6I这颗32MB的SDRAM芯片可能已经在你的硬件清单上。许多开发者习惯性地依赖STM32CubeMX生成…...
先进制程重塑晶圆代工格局:从HPC需求到供应链博弈
1. 行业现状:先进制程如何重塑晶圆代工格局最近和几位在芯片设计公司负责流片的朋友聊天,大家讨论最激烈的,除了产能紧张,就是到底要不要、以及何时上更先进的工艺节点。一个普遍的共识是:7纳米和5纳米这类所谓“先进制…...
