Python面向对象实战之扑克游戏
一、Python面向对象实战之扑克游戏
我们的扑克只有52张牌(没有大小王),游戏需要将 52 张牌发到 4 个玩家的手上,
每个玩家手上有 13 张牌,按照黑桃、红心、草花、方块的顺序和点数从小到大排列,
以下实现:21点游戏(Black Jack)。
import random
from enum import Enum
class Suite(Enum):
"""花色(枚举)"""
SPADE, HEART, CLUB, DIAMOND = range(4)
class Card:
"""牌"""
def __init__(self, suite, face):
self.suite = suite
self.face = face
def __repr__(self):
suites = ''
faces = ['', 'A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']
return f'{suites[self.suite.value]}{faces[self.face]}' # 返回牌的花色和点数
def __lt__(self, other):
if self.suite == other.suite:
return self.face < other.face # 花色相同比较点数的大小
return self.suite.value < other.suite.value # 花色不同比较花色对应的值
class Poker:
"""扑克"""
def __init__(self):
self.cards = [Card(suite, face)
for suite in Suite
for face in range(1, 14)] # 52张牌构成的列表
self.current = 0 # 记录发牌位置的属性
def shuffle(self):
"""洗牌"""
self.current = 0
random.shuffle(self.cards) # 通过random模块的shuffle函数实现随机乱序
def deal(self):
"""发牌"""
card = self.cards[self.current]
self.current += 1
return card
@property
def has_next(self):
"""还有没有牌可以发"""
return self.current < len(self.cards)
class Player:
"""玩家"""
def __init__(self, name):
self.name = name
self.cards = [] # 玩家手上的牌
def get_one(self, card):
"""摸牌"""
self.cards.append(card)
def arrange(self):
"""整理手上的牌"""
self.cards.sort()
def calculate_score(self):
"""计算手牌点数(A可计为1或11,J/Q/K计为10)"""
score = 0
aces = 0 # 记录A的数量
for card in self.cards:
if card.suite == 1: # A
score += 11
aces += 1
elif 2 <= card.face <= 10: # 2-10
score += card.face
else: # J/Q/K
score += 10
# 如果总分超过21分,且手上有A,将A视为1分
while score > 21 and aces > 0:
score -= 10
aces -= 1
return score
class BlackJack:
"""21点"""
def __init__(self):
self.poker = Poker()
self.player = Player('玩家')
self.dealer = Player('庄家')
def start_game(self):
"""开始游戏"""
print("===== 21点游戏开始 =====")
self.poker.shuffle()
# 初始发牌,每人两张
for _ in range(2):
self.player.get_one(self.poker.deal())
self.dealer.get_one(self.poker.deal())
# 显示初始牌面
self.show_hands(show_dealer_first_card=False)
# 玩家回合
self.player_turn()
# 庄家回合(如果玩家未爆牌)
if self.player.calculate_score() <= 21:
self.dealer_turn()
# 结算
self.settle()
def player_turn(self):
"""玩家回合"""
while True:
choice = input('要牌(Hit)或停牌(Stand)?[H/S]').strip().upper()
if choice == 'H':
self.player.get_one(self.poker.deal())
self.show_hands(show_dealer_first_card=False)
if self.player.calculate_score() > 21:
print('爆牌!你的点数超过21!')
break
elif choice == 'S':
break
else:
print('输错了,傻屌!')
def dealer_turn(self):
"""庄家回合(规则:点数<17必须要牌)"""
print("\n庄家回合。。。")
self.show_hands(show_dealer_first_card=True)
while self.dealer.calculate_score() < 17:
self.dealer.get_one(self.poker.deal())
print(f'庄家要牌:{self.dealer.cards[-1]}')
if self.dealer.calculate_score() > 21:
print('庄家爆牌!')
break
def show_hands(self, show_dealer_first_card=False):
"""显示当前手牌"""
print("\n=== 当前牌面 ===")
print(f"玩家手牌:{self.player.cards} 点数:{self.player.calculate_score()}")
if show_dealer_first_card:
print(f'庄家手牌:{self.dealer.cards} 点数:{self.dealer.calculate_score()}')
else:
# 隐藏庄家第二张牌
print(f'庄家手牌:[{self.dealer.cards[0]},?]')
def settle(self):
"""结算"""
player_score = self.player.calculate_score()
dealer_score = self.dealer.calculate_score()
print('\n=== 游戏结果 ===')
print(f'玩家点数:{player_score}')
print(f'庄家点数:{dealer_score}')
if player_score > 21:
print('你爆牌了,庄家赢!')
elif dealer_score > 21:
print('庄家爆牌,你赢!')
elif player_score > dealer_score:
print('你赢!')
elif player_score < dealer_score:
print('庄家赢!')
else:
print('平了!')
if __name__ == '__main__':
game = BlackJack()
game.start_game()
===== 21点游戏开始 =====
=== 当前牌面 ===
玩家手牌:[Q, 4] 点数:14
庄家手牌:[6,?]
要牌(Hit)或停牌(Stand)?[H/S]h
=== 当前牌面 ===
玩家手牌:[Q, 4, J] 点数:24
庄家手牌:[6,?]
爆牌!你的点数超过21!
=== 游戏结果 ===
玩家点数:24
庄家点数:14
你爆牌了,庄家赢!
Python面向对象实战之扑克游戏的更多相关文章
- python基础实战之猜年龄游戏
目录 一.Python基础实战之猜年龄游戏 给定年龄,用户可以猜三次年龄 年龄猜对,让用户选择两次奖励 用户选择两次奖励后可以退出 age = 18 # 答案 count = 0 # 游戏次数控制 p ...
- python 面向对象编程 - 小游戏
面向对象写的小游戏 欢迎玩耍 class Omnicience: camp = 'Omniscience' def __init__(self, name, atk=100, hp=1000, mp= ...
- 给缺少Python项目实战经验的人
我们在学习过程中最容易犯的一个错误就是:看的多动手的少,特别是对于一些项目的开发学习就更少了! 没有一个完整的项目开发过程,是不会对整个开发流程以及理论知识有牢固的认知的,对于怎样将所学的理论知识应用 ...
- python面向对象重新梳理
关于本篇博文: 面向对象中所有的内容的重新梳理,其实面向对象的知识早在一个多月前就学习过并整理过,但是发现还是有所欠缺,故在此以极其简介的语言风格重新梳理一遍 面向对象详细介绍:http://www. ...
- python面向对象(一)
什么是面向对象的程序设计及为什么要有它 面向过程的程序设计:核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么......面向过程的设计就好比精心设计好一条流水线,是一种机械式的思维方式. ...
- 转 Python爬虫实战一之爬取糗事百科段子
静觅 » Python爬虫实战一之爬取糗事百科段子 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 友情提示 糗事百科在前一段时间进行了改版,导致 ...
- python经典书籍:Python编程实战 运用设计模式、并发和程序库创建高质量程序
Python编程实战主要关注了四个方面 即:优雅编码设计模式.通过并发和编译后的Python(Cython)使处理速度更快.高层联网和图像.书中展示了在Python中已经过验证有用的设计模式,用专家级 ...
- python 面向对象初级篇
Python 面向对象(初级篇) 概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发" ...
- Python 面向对象 基础
编程范式概述:面向过程 和 面向对象 以及函数式编程 面向过程:(Procedure Oriented)是一种以事件为中心的编程思想. 就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现 ...
- Python开发【第七篇】:面向对象 和 python面向对象(初级篇)(上)
Python 面向对象(初级篇) 51CTO同步发布地址:http://3060674.blog.51cto.com/3050674/1689163 概述 面向过程:根据业务逻辑从上到下写垒代码 ...
随机推荐
- AI生成应用:图片批量重命名工具 - 自动化整理您的图片库
图片批量重命名工具 - 自动化整理您的图片库 GitHub项目地址: https://github.com/dependon/renameImage 项目介绍 这是一个基于Python开发的图形界面工 ...
- 前端EXCEL插件智表ZCELL数据源功能详解
一.数据源功能介绍前端EXCEL插件智表ZCELL提供了强大的数据源管理功能,使开发者能够灵活地在电子表格中集成和管理结构化数据.数据源功能主要分为两种类型: 卡片式数据源:适合展示和编辑单个数据记录 ...
- 字符型union注入
注入目标和思路:拿到库名---拿到表名---拿到列名---拿到用户名和密码 用 id=1' order by x --+ 来确定表有几列,然后用 id=0' union select x1,x1,x3 ...
- 5 MyBatis动态sql中foreach标签的使用
1 MyBatis动态SQL之if 语句 2 MyBatis动态sql之where标签|转 3 MyBatis动态SQL之set标签|转 4 MyBatis动态SQL之trim元素|转 5 MyBat ...
- 【对称加密】DES与AES算法详解及Java实现
对称加密:DES与AES算法详解及Java实现 目录 对称加密概述 DES算法详解 AES算法详解 Java实现示例 安全注意事项 总结 1. 对称加密概述 对称加密是指加密和解密使用相同密钥的加密算 ...
- 袋鼠云数栈UI5.0体验升级背后的故事:可用性原则与交互升级
最近,我们袋鼠云的UED部⻔小伙伴们,不声不响地⼲了⼀件⼤事--升级了全新设计语言「数栈UI5.0」. 众所周知,用户在使用产品时,是一个动态的过程,用户和产品之间进行交互的可用性,能否让用户愉悦.快 ...
- [原创]《C#高级GDI+实战:从零开发一个流程图》第04章:来个圆形,连线它!
一.前言 上一节我们实现了在矩形与矩形之间添加连线,光是矩形太单调了,某些问题也暴露不出来,我们本节就来看一下,如何添加一个圆形,且支持圆形与圆形.圆形与矩形.矩形与矩形间的连线.在这个过程中我们会发 ...
- GIM 1.4 发布了 (附使用 mkdocs 快速制作静态站点流程)
GIM 1.4.0 今天发布了! GIM 是 MAC 上一个根据文件或代码变更自动总结文件变更总汇总生成提交消息的工具:GIT仓库. 官方文档:https://git-intelligence-mes ...
- 在 django-ninja 中实现类似腾讯阿里云的应用鉴权机制
前言 本文章介绍如何使用基于 AppClient 模型的 Django-Ninja API 鉴权机制. 这也是上次说的中台项目衍生物 中台项目相关的文章,我大概还会再写一篇 这个系列的文章注定是没什么 ...
- Docker永远在“docker desktop starting .”Settings 一直在转圈
一些用户抱怨Docker 需要很长时间才能启动.这是一个众所周知的问题,用户多年来一直报告.因此,如果您是遇到此问题的用户之一,请不要担心.您可以通过在计算机上执行这些简单的步骤轻松解决问题. 有些用 ...