21点游戏的python实现

import random
import sys
import timeclass Card:"""定义扑克牌类。每个对象代表一张扑克牌。"""def __init__(self, card_type, card_text, card_value):"""初始化方法。Parameters-----card_type : str牌的类型。(红桃,黑桃,梅花,方片)card_text : str牌面显示的文本。(A,K,Q,J)card_value : int牌面真实的点数。(如A为1点或11点。K为10点等)"""self.card_type = card_typeself.card_text = card_textself.card_value = card_valueclass Role:"""定义角色类,用来表示电脑(庄家)与我们用户(玩家)。"""def __init__(self):"""初始化方法"""# 定义列表,用来保存当前角色手中的牌。初始牌为空。self.cards = []def show_card(self):"""向控制台打印手中所有的牌。"""for card in self.cards:print(card.card_type, card.card_text, sep="", end=" ")# 打印当前角色手中所有牌之后,再进行一个换行。print()def get_value(self, min_or_max):"""获得当前角色手中牌的点数。(分为最小值与最大值)。Parameters-----min_or_max : str,值为min或max。当值为min时,返回的是最小点数。即所有的A当成是1时的点数。(用来判断是否爆牌的情况。)当值为max时,返回在不爆牌的前提下,可表示的最大点数。此时A可能表示为11,也可能表示为1。Returns-----value : int返回手中牌的点数。(最小点数或最大点数。)"""# 总的点数sum2 = 0# 牌面中A的数量。(有几张A)A = 0for card in self.cards:# 累计想加牌面所有的点数sum2 += card.card_value#  累计A的数量if card.card_text == "A":A += 1if min_or_max == "max":# 逐渐减少A的数量,选择一个小于等于21点的最大值。for i in range(A):# 在总的点数上减去10,相当于将A当成1点看待。(减去几个10,就相当于# 是将几个A当成1点来看待。)value = sum2 - i * 10if value <= 21:return value# 如果把所有的A都当成1,则最大值与最小值是相同的。return sum2 - A * 10def burst(self):"""判断是否爆牌,是返回True,否则返回False。Returns-----b : bool是否爆牌,爆牌返回True,否则返回False。"""# 判断是否爆牌,只需要判断最小值是否大于21点即可。return self.get_value("min") > 21class CardManager:"""扑克牌管理类。管理一整副扑克牌,并且能够进行发牌。"""def __init__(self):"""初始化方法"""# 定义列表,用来保存一整副扑克牌(52张)self.cards = []# 定义所有牌的类型。all_card_type = "♥♠♣♦"# 定义所有牌面显示的文本all_card_text = ["A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3", "2"]# 定义牌面文本对应的真实点数all_card_value = [11, 10, 10, 10, 10, 9, 8, 7, 6, 5, 4, 3, 2]# 对牌面类型与牌面文本进行嵌套循环。for card_type in all_card_type:for index, card_text in enumerate(all_card_text):# 创建Card类型的对象。(一张扑克牌)card = Card(card_type, card_text, all_card_value[index])# 将创建好的card对象加入到整副扑克牌当中。self.cards.append(card)# 洗牌操作random.shuffle(self.cards)def send_card(self, role, num=1):"""给电脑或者玩家发牌。Parameters-----role : Role电脑或玩家对象。num : int发牌的张数。默认为1。"""for i in range(num):card = self.cards.pop()role.cards.append(card)# 创建扑克牌管理器类
cards = CardManager()
# 创建电脑角色对象
computer = Role()
# 创建玩家角色对象
player = Role()
# 初始时,给庄家发一张牌,给玩家发两张牌。
cards.send_card(computer)
cards.send_card(player, 2)
# 显示庄家与玩家手中牌。
computer.show_card()
player.show_card()
# 询问玩家是否要牌,要则继续发牌,否则停牌。
while True:# 询问玩家是否要牌,y:要牌,n:停牌。choice = input("是否再要一张牌?【y/n】")# 玩家选择要牌if choice == "y":# 向玩家发牌cards.send_card(player)# 发牌后,显示庄家与玩家手中的牌。computer.show_card()player.show_card()# 判断每次玩家要牌后,是否爆牌。如果爆牌,则玩家负。# 如果没有爆牌,则继续向玩家询问是否要牌。if player.burst():print("爆牌,您输了!")# 退出程序sys.exit()# 否则,没有要牌,则退出循环。(停牌)else:break
# 玩家停牌之后,庄家发牌。庄家在小于17点时,必须一直要牌。在大于等于17点,小于等于21点时,必须停牌。
while True:print("庄家发牌中……")# 因为庄家发牌不需要向玩家那样进行询问,所以没有停顿时间。程序会显示非常快速。# 为了能有一个很好的间隔性,我们在每次发牌时,暂停1秒。time.sleep(1)# 向庄家发牌cards.send_card(computer)# 更新显示庄家与玩家手中的牌。computer.show_card()player.show_card()# 判断庄家是否爆牌。如果爆牌,则庄家负。if computer.burst():print("庄家爆牌,您赢了!")sys.exit()# 如果没有爆牌,则判断庄家的牌面值是否达到17点,如果达到17点,则庄家必须停牌,否则,庄家必须继续要牌。elif computer.get_value("max") >= 17:break
# 如果庄家与玩家都没有爆牌,则根据手中的牌面点数,比价大小。
# 获取在不爆牌的前提下,可表示的最大点数。
player_value = player.get_value("max")
computer_value = computer.get_value("max")
# 比较点数大小,多者胜出。如果一样大,则平局。
if player_value > computer_value:print("您赢了!")
elif player_value == computer_value:print("平均")
else:print("您输了")

21点游戏的python实现相关推荐

  1. 用python编21点游戏_【Python3】21点游戏

    刚开始学python,试着写了一个21点游戏. 游戏过程就是,一开始给你和庄家(就是电脑啦)各发两张牌,但庄家有一张是暗牌.接下来你可以选择是要牌(hit me)还是停止发牌直接开(stand),要牌 ...

  2. Python 实现简单的单机版 21 点游戏

    Python 实现简单的单机版 21 点游戏 1. 21 点游戏规则简介 2. 实现代码 3. 运行效果 4. 总结 1. 21 点游戏规则简介 21 点游戏规则: 点数计算:每张牌都有点数.2 到 ...

  3. 【python教程入门学习】Python扑克牌21点游戏实例代码

    大家好,本篇文章主要讲的是Python扑克牌21点游戏实例代码,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览 废话还是说太多了 直接上代码 | `import` `random ...

  4. python完成‘21点游戏’

    完成'21点游戏' 人机对战: 输入玩家姓名: 玩家可以多次要牌,其中JQK,大小王是半点,其他是正常点数,玩家每要一次牌就打印下当前点数和系统点数. 可以设置系统:只要大于等于21点就不要牌了,系统 ...

  5. 21点游戏简单开发(Python)

    程序功能 实现21点游戏 游戏规则 1.玩家共两个角色:电脑和人类,电脑是庄家 2.游戏开始时,先给人类和电脑每个玩家分别发两张牌作为底牌,庄家底牌只漏一张 3.判断双方底牌是否直接为21点,如果其中 ...

  6. Sutton 强化学习, 21 点游戏的策略蒙特卡洛值预测

    作者 | MyEncyclopedia 来源 | MyEncyclopedia(ID:MyEncyclopedia) 头图 |  CSDN 下载自东方IC 从这期开始我们进入 Sutton 强化学习第 ...

  7. leetcode-292-Nim游戏(java|python)

    title: leetcode-292-Nim游戏(java|python) date: 2019-10-12 21:18:57 categories: leetcode tags: leetcode ...

  8. 转:一个古老的编程游戏:Python Challenge全通攻略

    Python Challenge是一个网页闯关游戏,通过一些提示找出下一关的网页地址.与众不同的是,它是专门为程序员设计的,因为大多数关卡都要编程来算哦!! 去年和同学一起玩的,他做了大半,我做了小半 ...

  9. PC微信扫描浏览器Cookies?腾讯:目前无法重现问题;华为手机分拆?官方否认;pip 21.0停止支持Python 3.5...

    点击上方 "编程技术圈"关注, 星标或置顶一起成长 后台回复"大礼包"有惊喜礼包! 每日英文 Make the person mature is not the ...

最新文章

  1. vim删除多行_Vim 可视化模式入门 | Linux 中国
  2. 揭秘:倒卖火车票的惊人黑幕全过程!
  3. mysql 主主同步配置_MySQL 主主同步配置
  4. 运维记录 - 业务日志清理功能
  5. Dijkstra迪杰斯特拉算法 C++实现
  6. mysql新用户不能创建数据库中_MYSQL添加新用户 MYSQL为用户创建数据库 MYSQL为新用户分配权限...
  7. python绘制时间轴_MatPlotLib动态时间轴
  8. 用于Ubuntu 16.04和18.04的TensorFlow,Keras,Caffe,Caffe,CUDA,cuDNN和NVIDIA驱动程序的单行安装
  9. 分形——数学与艺术结合的明珠
  10. 早期预警系统的组成要素
  11. 大数据奏鸣曲,听出了什么?
  12. oracle语句_ORACLE 常用语句实例:CTE MERGE 结合
  13. Word2016目录自动生成+页码从目录页后面显示
  14. win10服务器文件夹显示不全,win10电脑为什么只显示部分文件夹该如何处理
  15. 无锡市委书记杜小刚等领导一行莅临华云数据调研:为无锡现代化建设插上“数字翅膀”
  16. AWS免费账号取消步骤
  17. 电脑微信QQ正常登录,浏览器无法访问网站
  18. 上海市一级计算机ps,上海市计算机一级考试ps部分练习题.docx
  19. 《庄子》中说到,“一尺之棰,日取其半,万世不竭”。第一天有一根长度为 a的木棍,从第二天开始,每天都要将这根木棍锯掉一半
  20. java达内项目_达内课程:完成一个项目的整个流程

热门文章

  1. TBox、ECall、BCall、ICall简介及之间的关系
  2. thinkpad触控笔怎么用_触控笔的这些技巧,你都get到了吗?
  3. [计蒜客][二分]切割钢管
  4. JavaScript中的运算符和表达式
  5. C++虚函数,虚函数表,虚继承,虚继承表
  6. vs2019 MFC实现office界面的画图小项目(超超级详细)
  7. 激光显示产业三大风向标
  8. 多种方法(聚类、衍生变量、多重筛选、损失函数)解决解决异常值识别效果不佳问题(含2022年全国服务外包大赛实例)
  9. 电影【万里归途】定档了吗?什么时候上映?
  10. 计算机毕业设计Android图书馆借阅系统app(源码+系统+mysql数据库+Lw文档)