Python面向对象编程1-面向过程的简单纸牌游戏程序 项目1.6 完整的猜大小纸牌游戏

总项目目标:用面向过程思想设计一个简单的纸牌游戏程序,称为"Higher or Lower"(高还是低)。游戏中,玩家需要猜测接下来的一张牌是比当前牌高还是低。根据猜测的准确性,玩家可以得到或失去相应的积分。为后续对比面向对象编程思想做准备。

项目1.6   完整的猜大小纸牌游戏

import random

SUIT_TUPLE = ('黑桃', '红心', '梅花', '方块')
RANK_TUPLE = ('A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K')


# 洗牌函数
def shuffle(deckListIn):
    deckListOut = deckListIn.copy()  # 生成一副牌的副本
    random.shuffle(deckListOut)  # 洗牌
    return deckListOut


# 抽牌函数
def getCard(deckListIn):
    thisCard = deckListIn.pop()  # 从牌组中取第一张牌
    return thisCard


# 欢迎界面
print("欢迎来到猜大小纸牌游戏,游戏规则如下:")
print("游戏开始时,玩家有50分。")
print("从一副牌中随机抽取一张牌作为当前牌。")
print("玩家需要猜测下一张牌的大小是高还是低。")
print("如果玩家猜对了,得20分;如果猜错了,扣15分。")
print("游戏进行8轮,每轮玩家需要猜测下一张牌的大小。")
print("猜完8轮后,玩家可以选择再次玩游戏或退出游戏。")


# 存储生成的初始牌组
startingDeckList = []

# 两个嵌套的循环创建一个包含牌的字典cardDict,其中包括点数、花色和用于比较大小的值
# 并将各张牌的字典添加到startingDeckList列表中。
for suit in SUIT_TUPLE:
    for thisValue, rank in enumerate(RANK_TUPLE):
        cardDict = {'rank': rank, 'suit': suit, 'value': thisValue + 1}
        startingDeckList.append(cardDict)

# 游戏开始时,玩家有50分
score = 50
while True:  # 游戏一直重复,除非退出
    # 游戏正式开始,第一件事是洗牌,将返回的洗牌后的牌组赋值给gameDeckList
    gameDeckList = shuffle(startingDeckList)

    # 抽取第一张牌,将该牌的信息以字典形式保存在currentCardDict中
    currentCardDict = getCard(gameDeckList)

    # 将抽到的这张牌的各个信息通过字典索引拿出,包括花色,点数,和比较用的值
    currentCardRank = currentCardDict['rank']
    currentCardValue = currentCardDict['value']
    currentCardSuit = currentCardDict['suit']

    print('该副牌第一张是: ', currentCardSuit+currentCardRank)
    print()

    # 游戏抽8次牌进行比较
    for cardNumber in range(0,8):
        # 在进行牌的比较前,用户通过输入'h'或'l'来猜测下一张牌的大小。
        answer = input("猜猜下一张牌是大于还是小于当前的牌: " +
                       currentCardSuit + currentCardRank +
                       "(输入 h 或 l)")
        answer = answer.casefold()  # 为了只判断小写字母

        # 抽取下一张牌,将牌的信息以字典形式保存在nextCardDict中
        nextCardDict = getCard(gameDeckList)

        # 将下一张牌的各个信息通过字典索引拿出,包括花色,点数,和比较用的值
        nextCardRank = nextCardDict['rank']
        nextCardValue = nextCardDict['value']
        nextCardSuit = nextCardDict['suit']

        if answer == 'h':
            # 在条件判断语句中,比较下一张牌的值与当前牌的值。
            if nextCardValue > currentCardValue:
                print("你猜对了, ")
                score = score + 20  # 如果玩家猜对了,得20分

            else:
                print("你猜错了")
                score = score - 15  # 如果猜错了,扣15分。

        elif answer == 'l':
            if nextCardValue < currentCardValue:
                print("你猜对了")
                score = score + 20

            else:
                print("你猜错了")
                score = score - 15
        print("下张牌是: " + nextCardSuit + nextCardRank)
        print()
        print("你当前得分:", score)

        # 更新当前牌的信息为下一张牌的信息,为下一轮比较做准备。
        # 在下一轮的比较中,当前牌会变成上一轮比较中抽取到的下一张牌,以便玩家可以继续猜测下一张牌的大小。
        currentCardRank = nextCardRank
        currentCardValue = nextCardValue
        currentCardSuit = nextCardSuit
    goAgain = input('如果想在玩一次,按回车,或按q退出')
    if goAgain == 'q':
        break
print("再见")

效果如下:

程序分析:

这个程序实现了一个简单的猜大小纸牌游戏。以下是程序的解释: 

  1. 输出游戏的欢迎界面,介绍游戏规则,创建一个空的牌组列表。

  2. 使用两个嵌套的循环创建一副牌的字典,并将每张牌的字典添加到 startingDeckList 列表中。初始化玩家的初始得分为 50。

  3. 进入游戏循环,循环开始时进行洗牌操作,使用 getCard() 函数抽取第一张牌,并将该牌的信息存储在 currentCardDict 中。从 currentCardDict 字典中获取当前牌的花色、点数和比较用的值。打印当前抽到的第一张牌。

  4. 进入循环进行8次牌的比较。

  5. 在循环中,玩家通过输入 'h' 或 'l' 来猜测下一张牌是大于还是小于当前牌。

  6. 使用 getCard() 函数抽取下一张牌,并将该牌的信息存储在 nextCardDict 中。

  7. nextCardDict 字典中获取下一张牌的花色、点数和比较用的值。

  8. 根据玩家的猜测和下一张牌的值进行判断,更新玩家的得分。

  9. 打印下一张牌的信息和当前得分。

  10. 更新当前牌的信息为下一张牌的信息,为下一轮比较做准备。

  11. 在循环结束后,询问玩家是否想再次玩游戏,如果输入 'q' 则退出游戏,否则继续下一轮游戏。

  12. 打印 "再见",游戏结束。

 

这个程序的面向对象方面存在一些不足之处:

  1. 缺乏类的抽象和封装:整个程序都被写在了一个主函数中,并没有使用类来进行适当的抽象和封装。这导致程序的结构相对松散,代码的可重用性和可扩展性较差。

  2. 数据和功能耦合:程序中的数据(如牌的点数、花色等)和功能(如洗牌、抽牌等)没有被适当地封装在类的属性和方法中,而是通过全局变量和函数进行处理。这种耦合性使得代码难以维护和扩展。

  3. 缺乏面向对象设计原则:程序中没有明确地应用面向对象设计原则,如单一职责原则、开闭原则等。这使得代码结构和逻辑流程相对混乱,难以进行模块化和重用。

  4. 缺乏对象的交互和组合:程序中没有明确定义和管理对象之间的交互关系,而是通过函数和全局变量来进行数据传递和状态更新。这样的设计使得代码的可读性和可维护性较差。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/30086.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024考研408-计算机组成原理第三章-存储系统

文章目录 前言一、存储器概述1.1、层次结构1.2、存储器分类1.2.1、层次分类1.2.2、存储介质分类1.2.3、存取方式1.2.4、按照信息的可更改性&#xff08;读写、只读区别&#xff09; 1.3、存储器性能指标知识回顾 二、主存储器2.1、主存储器的基本组成&#xff08;介绍DRAM&…

专业是要选软工还是人工智能?

大家好&#xff0c;我是帅地。 在帅地的训练营里&#xff0c;也有不少 26 届的学员&#xff0c;不过大一即将过去&#xff0c;部分学校是到了大一后面或者大二才开始细分专业方向的&#xff0c;包括一些想要转专业的同学&#xff0c;也需要选择一个细分的方向&#xff0c;而且…

Python基础知识进阶之数据爬虫

一、爬虫概述 爬虫是指利用网络抓取模块对某个网站或者某个应用中有价值的信息进行提取。还可以模拟用户在浏览器或者APP应用上的操作行为&#xff0c;实现程序自动化。简单来说就是我们把互联网有价值的信息都比喻成大的蜘蛛网&#xff0c;而各个节点就是存放的数据&#xff0…

Vue-Element-Admin项目学习笔记(7)用Node.js写一个简单后端接口

前情回顾&#xff1a; vue-element-admin项目学习笔记&#xff08;1&#xff09;安装、配置、启动项目 vue-element-admin项目学习笔记&#xff08;2&#xff09;main.js 文件分析 vue-element-admin项目学习笔记&#xff08;3&#xff09;路由分析一:静态路由 vue-element-adm…

黑苹果 或者 Mac 因 mds资源占用过高,导致频繁死机

开机后不久&#xff0c;风扇狂转&#xff0c;温度升高&#xff0c;然后死机&#xff0c;关机。 1. 使用 “Apple 诊断”测试 Mac 先看看硬件层面是否有问题。 使用“Apple 诊断”测试 Mac。 这款 Mac 的处理器是 Intel &#xff0c;开启 Mac&#xff0c;然后在 Mac 启动时立…

状态机编程实例-嵌套switch-case法

嵌入式软件开发中&#xff0c;状态机编程是一个比较实用的代码实现方式&#xff0c;特别适用于事件驱动的系统。 本篇&#xff0c;以一个炸弹拆除的小游戏为例&#xff0c;介绍状态机编程的思路。 C/C语言实现状态机编程的方式有很多&#xff0c;本篇先来介绍最简单最容易理解…

KW 新闻 | KaiwuDB 亮相数字中国并发布离散制造场景解决方案

4月26-30日&#xff0c;以“加快数字中国建设&#xff0c;推进中国式现代化”为主题的第六届数字中国建设峰会在福州市圆满召开。KaiwuDB 受邀亮相大会参展并发布“离散制造场景解决方案”&#xff0c;旨在以数字化方案驱动生产方式、治理方式变革&#xff0c;推进离散制造业物…

45道SQL题目陆续更新

文章目录 学习视频配置环境第一天内连接 外连接sql执行顺序 第二天group by 的用法 第三天第四天order bycase when窗口函数 第五天第六天第七天limit第八天 45、查询下月过生日的学生信息 学习视频 学习视频 配置环境 四张表 配置四张表的sql语句 #创建发据库 create dat…

TOGAF10®标准中文版--(阶段A — 架构愿景)方法

3.5.1 概述 阶段 A 从收到发起组织向架构组织发出的架构工作请求开始。 在TOGAF 标准 —EA能力和治理中讨论了确保公司管理层的适当认可和确认&#xff0c;以及直线管理层的支持和承诺所涉及的问题。 A阶段还定义了架构工作的范围内和范围外的内容以及必须处理的约束条件。在…

浅析 xml 数据格式文件

浅析 xml 数据格式文件 xml ( Extensible Markup Language ) 全称 -> 可拓展的标记语言&#xff1b; xml文件的主要用途&#xff1a;xml文件主要用于数据的 传输 和 存储&#xff0c;并不是展示&#xff1b; xml标签与html的区别&#xff1a;节点的标签使用方式和 html 十分…

linuxOPS系统服务_linux高级命令

find命令 find 路径 [选项 选项的值] … 选项作用-name根据文件的名称进行-type按文件类型进行搜索&#xff0c;f代表普通文件&#xff0c;d代表文件夹 find命令查找文件 示例1 查找一个文件 案例1 ,在linux整个系统中查找 test.txt文件 find / -name test.txt -type f案例…

算法刷题-字符串-重复的子字符串

KMP算法还能干这个 459.重复的子字符串 力扣题目链接 给定一个非空的字符串&#xff0c;判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母&#xff0c;并且长度不超过10000。 示例 1: 输入: “abab” 输出: True 解释: 可由子字符串 “ab” 重复两…

Ubuntu下载速度过慢解决

今天用Ubuntu下载Roberta文件到本地&#xff0c;速度特别慢&#xff0c;Ubuntu 系统自带的源文件&#xff0c;都是国外的源网址&#xff0c;在国内下载安装升级源或者依赖的时候&#xff0c;都比较慢&#xff0c;更换国内的源地址&#xff0c;轻松搞定此问题。 目录 一、备份…

ChatGPT的未来发展

文章目录 1.什么是ChatGPT2.ChatGPT的基础技术3.ChatGPT工作原理4.ChatGPT应用场景5.ChatGPT局限性6.ChatGPT的未来发展 ✍创作者&#xff1a;全栈弄潮儿 &#x1f3e1; 个人主页&#xff1a; 全栈弄潮儿的个人主页 &#x1f3d9;️ 个人社区&#xff0c;欢迎你的加入&#xff…

一键部署通义千问预体验丨阿里云云原生 5 月动态

云原生月度动态 云原生是企业数字创新的最短路径。 《阿里云云原生每月动态》&#xff0c;从趋势热点、产品新功能、服务客户、开源与开发者动态等方面&#xff0c;为企业提供数字化的路径与指南。 本栏目每月更新。 01 趋势热点 &#x1f947; Apache RocketMQ 入选可信开…

哨兵3号(Sentinel 3)卫星数据处理

李国春 本文介绍使用RSD处理欧空局哨兵3号&#xff08;Sentinel 3&#xff09;卫星数据的具体方法。 气象数据多用NetCDF格式交换和存储&#xff0c;气象卫星数据也是如此。气象业内认为HDF5也是NetCDF的一部分&#xff0c;虽然文件扩展名使用的是.nc&#xff0c;但是实际上就…

【AntDB数据库】AntDB数据库告警管理

告警历史 功能概述 数据库系统的主机、单节点集群的被监测指标达到告警阀值时&#xff0c;AMOPS就会产生告警并展示在告警分类页面上。 告警分类页面提供告警搜索查看功能&#xff0c;用户可以指定监控项、集群、事件级别、时间范围和告警对象对告警进行搜索。 查询的告警数…

【MySQL数据库基础】

MySQL数据库基础 1. 数据库的操作1.1 显示当前的数据库1.2 创建数据库1.3 使用数据库1.4 删除数据库 2. 常用数据类型2.1整数&#xff08;xxxint&#xff09;2.2日期时间类型2.3字符串型 3. 表的操作3.1 查看表结构3.2 创建表3.3 删除表 1. 数据库的操作 1.1 显示当前的数据库…

React学习之路-目录结构

目录结构 node_modules — 存放项目依赖包 public — 存放网站的静态资源文件 favicon.icon — 网站偏爱图标index.html — 主页面&#xff08;重要&#xff09;logo192.png — logo图logo512 — logo图manifest.json — 应用加壳的配置文件robots.txt — 爬…

Elasticsearch:实用 BM25 - 第 1 部分:分片如何影响 Elasticsearch 中的相关性评分

作者&#xff1a;Shane Connelly 背景 在 Elasticsearch 5.0 中&#xff0c;我们切换到 Okapi BM25 作为我们的默认相似度算法&#xff0c;这是用于对与查询相关的结果进行评分的算法。 在本博客中&#xff0c;我不会过多地介绍 BM25 与替代措施&#xff0c;但如果你想了解 B…