一、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面向对象实战之扑克游戏的更多相关文章

  1. python基础实战之猜年龄游戏

    目录 一.Python基础实战之猜年龄游戏 给定年龄,用户可以猜三次年龄 年龄猜对,让用户选择两次奖励 用户选择两次奖励后可以退出 age = 18 # 答案 count = 0 # 游戏次数控制 p ...

  2. python 面向对象编程 - 小游戏

    面向对象写的小游戏 欢迎玩耍 class Omnicience: camp = 'Omniscience' def __init__(self, name, atk=100, hp=1000, mp= ...

  3. 给缺少Python项目实战经验的人

    我们在学习过程中最容易犯的一个错误就是:看的多动手的少,特别是对于一些项目的开发学习就更少了! 没有一个完整的项目开发过程,是不会对整个开发流程以及理论知识有牢固的认知的,对于怎样将所学的理论知识应用 ...

  4. python面向对象重新梳理

    关于本篇博文: 面向对象中所有的内容的重新梳理,其实面向对象的知识早在一个多月前就学习过并整理过,但是发现还是有所欠缺,故在此以极其简介的语言风格重新梳理一遍 面向对象详细介绍:http://www. ...

  5. python面向对象(一)

    什么是面向对象的程序设计及为什么要有它 面向过程的程序设计:核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么......面向过程的设计就好比精心设计好一条流水线,是一种机械式的思维方式. ...

  6. 转 Python爬虫实战一之爬取糗事百科段子

    静觅 » Python爬虫实战一之爬取糗事百科段子 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 友情提示 糗事百科在前一段时间进行了改版,导致 ...

  7. python经典书籍:Python编程实战 运用设计模式、并发和程序库创建高质量程序

    Python编程实战主要关注了四个方面 即:优雅编码设计模式.通过并发和编译后的Python(Cython)使处理速度更快.高层联网和图像.书中展示了在Python中已经过验证有用的设计模式,用专家级 ...

  8. python 面向对象初级篇

    Python 面向对象(初级篇) 概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发" ...

  9. Python 面向对象 基础

    编程范式概述:面向过程 和 面向对象 以及函数式编程 面向过程:(Procedure Oriented)是一种以事件为中心的编程思想. 就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现 ...

  10. Python开发【第七篇】:面向对象 和 python面向对象(初级篇)(上)

    Python 面向对象(初级篇)   51CTO同步发布地址:http://3060674.blog.51cto.com/3050674/1689163 概述 面向过程:根据业务逻辑从上到下写垒代码 ...

随机推荐

  1. WPF应用启动时,检测触摸失效的几种方式

    在开发OPS项目,发现插拔式的OPS在切换系统.开关机.重启,会时不时出现部分WPF开机自启的 应用触摸失效的问题.而且出现问题的应用都是全屏窗口应用.用snoop 附加上去,没有Touch 和Sty ...

  2. Springboot笔记<10>常用注解总结

    Springboot常用注解总结 • 项目配置注解 1.@SpringBootApplication 注解 @SpringBootApplication是一个复合注解,包含了@SpringBootCo ...

  3. [XYCTF 2025 web 出题人已疯]以新手角度快速理解官方exp的解题思路

    前言 这是一道非常简洁明了的ssti漏洞题目,就是要求攻击payload长度不得高于25.在LamentXU大佬的官方wp中写道: "直接往os里塞字符.随后一起拿出来exec.这样子就可以 ...

  4. android input

    通常,从EditText中获取字符串很简单:    EditText text = findViewById(R.id.textName);    String name = text.getText ...

  5. 推荐五大AI+MCP自动化测试工具!

    在当今快速发展的软件行业,自动化测试已成为提升开发效率和产品质量的关键.今天,我们将给大家推荐五大MCP自动化测试工具,助你在自动化测试领域更进一步. 1.MCP介绍 首先,你得知道,MCP是什么? ...

  6. 微信小程序里 wx:for和wx:for-item区别(补充下wx:key)

    wx:for 一维数组情况: 在页面上 view  wx:for  ="{{list}}" {{item.id}} view 是循环list item是List的别名 多维数组情况 ...

  7. java--Spring代理模式、AOP、jdbc支持

    代理模式 静态代理, 1) 代理对象,要实现与目标对象一样的接口: 2) 举例:保存用户(模拟) Dao , 直接保存 DaoProxy, 给保存方法添加事务处理 App.java public cl ...

  8. 有100块石头, A和B交替拿, 每人一次拿1-5块, 如果A先拿, 第一次拿几块能保证最后能赢

    简介 其实这题可以分成 A | B A | B A ...| B A A第一次拿取x个 然后, 剩下B A 每次拿去一定要大于6等于6个. 如果 B A 拿取6个的话, 推出 第一次 拿取4个. 如果 ...

  9. 低代码开发平台,可零代码发布API

    RestCloud低代码开发平台可以快速的开发企业级前后端分离的业务系统以及基于微服务架构的业务系统.平台通过建立数据模型和业务模型能够无代码快速的发布API服务,同时也能基于数据模型快速生成Java ...

  10. LLM多模态•audiocraft•av(interfacing FFmpeg API)•Audio/Video/Bitstream•pytorch•sklearn•numpy•pandas•spacy•librosa•opencv

    无论是ChatGPT. LLM大语言模型.还是Meta公司的AI生成音乐, 都需要对 Audio.Video.Bitstream 进行处理. Text的算法库 SpaCy, numpy, pytorc ...