2020年10月发布的一篇Python21点小游戏的博客

粉丝问这个小游戏怎么实现
我就去翻看了一下这篇博客
发现就算当时都写了注释
但还是很难理解我当时的实现逻辑
还有一些错误的计算牌面下标的算法错误
难怪没人看得懂
2021年的尾声了
我想看看自己写代码有没有进步了
于是花了一下午的时间重新实现了这个小游戏(除去注释大概80行)
用这个小游戏来锻炼Python和编程逻辑是个不错的选择

废话还是说太多了 直接上代码

import random
import sys# 牌面列表
card_code = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']
# 花色列表
card_symbol = ['♦', '♣', '♥', '♠']# 游戏初始化
def init(player_count):# 根据玩家数来生成玩家记牌器player_group = [[] for _ in range(player_count)]# 根据玩家数来生成玩家是否要牌player_isWant = [True for _ in range(player_count)]# 生成元素1~52的列表 (去掉大小鬼的扑克牌[52张])poker = list(range(1, 53))# 用random的shuffle函数对列表打乱顺序 (洗牌)random.shuffle(poker)# 返回玩家组 玩家是否要牌 乱序52张扑克return player_group, player_isWant, poker# 打印玩家点数
def print_player_point(player_group):# 存放玩家点数player_point = []# 遍历每一位玩家for index in range(len(player_group)):# 打印每位玩家的牌和点数print("-------玩家"+str(index+1)+"------")# 初始化玩家点数 如果含有牌A 因为A可视为1点或11点 则有两种点数current_player = [0, 0]# 遍历每位玩家的手牌for card in player_group[index]:"""核心代码由于牌面的数字是从1到52 所以牌面要先减1再求余才是牌面列表真正的下标若玩家抽到牌为15 即牌面为15 - 13 = 2 且按花色顺序为♣ 即2♣牌面 15 - 1 = 14 再 14 % 13 = 1 这个就是对应牌面列表的第二位元素 即2花色 15 - 1 = 14 再 14 / 13 = 1 对应花色列表第二位元素 即♣"""# 获取牌面和花色下标code_index = int((card - 1) % 13)symbol_index = int((card - 1) / 13)# 打印玩家牌信息print(card_code[code_index] + card_symbol[symbol_index], end="\t")# 如果牌面含有A 则添加不同点数1和11if (code_index + 1) == 1:current_player[0] += 1current_player[1] += 11# 如果牌面不含A 则添加相同点数else:current_player[0] += code_index + 1current_player[1] += code_index + 1# 如果两个点数一致 则打印一个点数if current_player[0] == current_player[1]:print("点数为"+str(current_player[0])+"点")# 否则打印两个点数else:print("点数为"+str(current_player[0])+"点或"+str(current_player[1]))# 添加当前玩家点数player_point.append(current_player)# 返回所有玩家点数return player_point# 玩游戏
def play_game():# 打印游戏规则print("-------21点游戏------")print("---A可看做1点或11点---")# 死循环一直进行游戏while True:# 初始化玩家数为0player_count = 0# 当玩家数小于等于1或大于5时继续询问while player_count <= 1 or player_count > 5:# 询问玩家数print("有多少位玩家?(2~5位)", end="")# 获取控制台输入的数字 无验证输入 若输入非数字 程序直接报错player_count = int(input())# 初始化游戏 返回玩家组 玩家是否要牌 乱序52张扑克player_group, player_isWant, poker = init(player_count)# 开始发牌 先为每位玩家发两张牌 循环玩家数for index in range(player_count):for i in range(2):# pop() 函数用于移除列表中的一个元素(默认最后一个元素)并且返回该元素的值。player_group[index].append(poker.pop())# 打印玩家点数 并获取当前玩家点数player_point = print_player_point(player_group)# 只要玩家继续要牌 且 还有剩余牌 则一直询问玩家是否要牌while True in player_isWant and len(poker) > 0:# 遍历玩家for index in range(player_count):# 判断玩家是否有可能还需要牌if player_isWant[index] is True:# 询问玩家是否要牌print("玩家"+str(index+1)+",您再要一张?(y/n)")# 获取控制台输入isWant = str(input())[0]# 如果输入的字符为"n" 则将玩家标记为不再需要牌if isWant == "n":player_isWant[index] = False# 如果不为字符"n" 默认为继续要牌 给该玩家发一张牌else:player_group[index].append(poker.pop())# 每轮询问结束 打印玩家点数 并获取当前玩家点数player_point = print_player_point(player_group)print("\n"*5+"====本轮游戏结束====")# 定义一个计分器score = []# 要牌结束 遍历所有玩家的点数 判断哪位玩家胜利for point_list in player_point:# 如果两个两个点数相同 说明没有Aif point_list[0] == point_list[1]:# 如果分数大于21 直接取负数 小于等于21 任意取一个作为分数score.append(-point_list[0] if point_list[0] > 21 else point_list[0])# 如果两个点数不想同 说明含有A 则继续判断else:# 如果两个点数中大的那个点数还小于等于21if max(point_list) <= 21:# 去最大值为分数score.append(max(point_list))# 如果两个点数中大的那个点数大于21else:# 如果小的点数大于21 直接取负数 小于等于21 取最小值为分数score.append(-min(point_list) if min(point_list) > 21 else min(point_list))# 最高分max_point = max(score)# 如果最高分的人数为1 直接认为最高分的玩家获胜 打印游戏结果if score.count(max_point) == 1:print("玩家"+str(score.index(max_point) + 1)+"获胜!")# 否则最高分的分数有并列 认为有多个人获胜else:# 获胜玩家列表temp_list = []# 遍历分数for index in range(len(score)):# 分数等于最高分 记录玩家if score[index] == max_point:temp_list.append("玩家"+str(index+1))# 拼接获胜玩家列表 打印游戏结果print("恭喜"+",".join(temp_list)+"获胜!")# 询问是否继续游戏print("是否继续游戏?(y/n)")# 如果控制台输入不为字符"y" 表示退出if str(input())[0] != 'y':sys.exit()# 程序主入口
if __name__ == '__main__':# 玩游戏play_game()

运行结果如下


基本每一行都有详细的解释 如果实在难懂可以留言或者私信我

Python扑克牌21点小游戏相关推荐

  1. 如何使用Python实现21点小游戏?

    ①导入程序运行所需的包.import random import sys import time ②定义扑克牌类,每个对象代表一张扑克牌.class Card:"""定义 ...

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

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

  3. c++编写手机小游戏代码_只需22行代码,用python编写自己的小游戏

    假期最后一天,有些人在外面玩累了,有些人躺在家里快发霉了,闲暇时候不如动动手做个小游戏玩一玩吧! 本文实例为大家分享了python编写猜数字小游戏的具体代码,供大家参考,具体内容如下 1 import ...

  4. 使用C#实现简单的21点小游戏

    使用C#实现简单的21点小游戏 最近刚把C#学完,突发奇想就做了这么一个简易的21点小游戏 虽然说是简易,但是也碰到了一些坑,代码写的比较直接,其实可以先自定义一个放有4副扑克牌的集合类,把函数都写在 ...

  5. 【C++课设】21点小游戏C++

    文章目录 二.实验内容 (1)问题描述: (2)功能要求 (3)算法分析 三.概要设计 四.详细设计 五.程序运行结果测试与分析 分析: 六.结论与心得 完整资源免费: https://downloa ...

  6. python游戏设计_用Python设计一个经典小游戏

    本文主要介绍如何用Python设计一个经典小游戏:猜大小. 在这个游戏中,将用到前面我介绍过的所有内容:变量的使用.参数传递.函数设计.条件控制和循环等,做个整体的总结和复习. 游戏规则: 初始本金是 ...

  7. python 实现炸金花小游戏

    python 实现炸金花小游戏 本文章在学习python中进行的练习小游戏,目的是为了让学习者熟悉python中的列表.字典.集合等数据操作. 游戏规则: 一付扑克牌,去掉大小王,每个玩家发3张牌,最 ...

  8. 21点小游戏(C++版)

    用C++写一个21点小游戏: 话不多说,直接上代码: 头文件:paimiansheji.h #include<iostream> using namespace std;typedef e ...

  9. Python零基础速成班-第11讲-Python日志Logging,小游戏设计game of life

    Python零基础速成班-第11讲-Python日志Logging,小游戏设计game of life 学习目标 Python日志Logging 小游戏设计game of life 课后作业(2必做) ...

最新文章

  1. 如何复制一个含有随机指针节点的链表
  2. 推荐系统(工程方向)-策略平台
  3. 星来客机器人餐厅_在50米高空聚餐,在铁窗内吃饭,盘点全球特色餐厅,看看有多奇葩...
  4. js结合jquery实现的ajax瀑布流加载实例
  5. [旧博客]不用编程也能搞定作弊刷票
  6. java目录结构_Java项目目录结构解释
  7. 传奇登陆游戏黑屏错位以及登陆器配置和常见问题
  8. 三星 9810 android 9,【极光ROM】-【三星NOTE9 N960X-9810】-【V22.0 Android-Q-TK1】
  9. 神经网络与深度学习pdf下载
  10. 3d人体智能测试软件,人体系统女性3Dapp
  11. Java 作业数组——最小素数集
  12. 小米笔记本电脑的SN码如何查找?
  13. RGB_打开/获取颜色选择器(RGB)的几种方式/本地RGB查询/css颜色名参考
  14. unity3d+Android:v3签名问题,修改为v2
  15. NeuroImage:暴力的隐式创伤—异常运动振荡脑活动与创伤后应激症状有关
  16. Linux系统编程 50 -stat和stat函数 穿透和非穿透
  17. C语言使用信号量解决生产者消费者模型的同步问题
  18. 电游入侵传统教育,用练级学习
  19. Linux C/C++编程之(十三)系统IO函数
  20. 大数据培训需要有基础吗

热门文章

  1. 【游记】GDKOI2023游寄
  2. 图解 HTTP 的缓存机制 | 实用 HTTP
  3. 设计UI - Adobe xd剪切蒙版
  4. php 获取域名前缀,蓝奏批量自定义域名前缀替换php源码
  5. 笔记本电脑在AHCi模式下识别不到硬盘2
  6. access窗体转换html,access点击按钮打开窗体
  7. sql语句 舒适版
  8. 获取系统时间以及时间戳的理解与使用
  9. 另存为窗口没有“桌面”选项的解决方法
  10. js url 中文乱码问题