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

news2025/1/17 0:09:06

总项目目标:用面向过程思想设计一个简单的纸牌游戏程序,称为"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. 缺乏对象的交互和组合:程序中没有明确定义和管理对象之间的交互关系,而是通过函数和全局变量来进行数据传递和状态更新。这样的设计使得代码的可读性和可维护性较差。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学了些性能知识,实际工作如何开展性能测试?

目录 前言&#xff1a; 确定需求 了解业务 搭建测试环境 脚本执行及监控 收集测试结果 持续学习 前言&#xff1a; 学到了性能测试的知识&#xff0c;接下来如何在实际工作中开展性能测试呢&#xff1f; 确定需求 刚接触性能测试的同学往往不知道性能测试是有需求的。…

C++右值引用问题

1、右值引用与函数重载 class Int {int value; public:Int(int x 0) :value(x) { cout << "create " << this << endl; }~Int() { cout << "destroy " << this << endl; }Int(const Int& it) :value(it.value){…

系统原型设计,轻松搞定后台管理系统

伴随互联网的发展&#xff0c;越来越多的团队和企业开始使用自动化管理系统。近年来&#xff0c;各行各业的B端后台管理系统更是应运而生&#xff0c;并且快速发展迭代更新&#xff0c;直接推动了CMS、OA、 CRM、ERP、POS等系统原型的开发。 相比一般的web页面以及其他的互联网…

真实案例之视频下载性能测试分析报告

一、背景介绍 XXXX是一个以视频教学为主的教学平台&#xff0c;因此对服务器所支持的视频下载量、下载速度等都有相应的要求。其中视频采用HTTP协议&#xff0c;为下载后对视频进行一个播放和学习。为了得出测试服务器网络是否满足XXXX的要求&#xff0c;从而对该服务器做相应…

基于工业智能网关的电力能耗监测管理系统

据国家能源局最新数据显示&#xff0c;1至5月&#xff0c;全国全社会用电量35325亿千瓦时&#xff0c;同比增长5.2%&#xff0c;其中&#xff0c;5月份全国全社会用电量7222亿千瓦时&#xff0c;同比增长7.4%。 6月以来&#xff0c;随着我国经济形势的整体向好和气温的逐步升高…

流场粒子追踪精度数值实验

在计算流线&#xff0c;拉格朗日拟序结构等流场后处理时&#xff0c;我们常常需要计算无质量的粒子在流场中迁移时的轨迹&#xff0c;无质量意味着粒子的速度为流场当地的速度。此时&#xff0c;求解粒子的位移这个问题是一个非常简单的常微分方程问题。 假设流场中存在 i 个粒…

020:vue刷新跳转当前页面

第020个 查看专栏目录: VUE — element UI VUE刷新当前页面在很多场合都会使用到&#xff0c;比如在搜索页搜索内容并展示在搜索页&#xff1f;在当前页删除&#xff0c;添加内容的等&#xff0c;查看更新后的结果等。 方法一 用vue-router 重新路由的时候到当前页面的时候是…

vue移动端瀑布流布局

需求: 瀑布流, 图片大小统一不变, 描述长度根据内容确定, 不超过三行. 分两列,那边矮,下个元素就放那边 如图所示: 1. 给item设置top,和left 由于我的项目做了 amfe-flexible适配所以使用rem 完整 template <template><div class"HomePage"><van-l…

【好书精读】网络是怎样连接的 之 全世界 DNS 服务器的大接力

&#xff08;该图由AI制作 学习AI绘图 联系我&#xff09; 目录 域名的层次结构 寻找相应的 DNS 服务器并获取 IP 地址 通过缓存加快 DNS 服务器的响应 DNS 服务器的基本工作就是接收来自客户端的查询消息&#xff0c;然后根据消息的内容返回响应 客户端的查询消息&#xf…

信息量、熵、联合熵、条件熵、相对熵、交叉熵、JS散度、Wasserstein距离

信息量 I ( x i ) l o g 1 P ( x i ) − l o g P ( x i ) I(x_i)log \frac {1}{P(x_i)}-logP(x_i) I(xi​)logP(xi​)1​−logP(xi​) 信息量&#xff08;self-information&#xff09;&#xff0c;又译为信息本体&#xff0c;由克劳德 香农&#xff08;Claude Shannon&…

使用投票回归器VotingRegressor对糖尿病数据集进行回归预测

目录 1. 作者介绍2. 投票回归器VotingRegressor简介2.1 VotingRegressor介绍2.2 VotingRegressor算法遵循以下关键原则&#xff1a; 3. 使用投票回归器VotingRegressor对糖尿病数据集进行回归预测实验过程3.1 代码流程介绍3.2 完整代码3.3 实验结果 1. 作者介绍 余成伟&#x…

【深度学习】YOLOv8训练过程,YOLOv8实战教程,目标检测任务SOTA,关键点回归

文章目录 可用资源资源安装模型训练&#xff08;检测&#xff09;模型pridict模型导出 可用资源 https://github.com/ultralytics/ultralytics 官方教程&#xff1a;https://docs.ultralytics.com/modes/train/ 资源安装 更建议下载代码后使用 下面指令安装&#xff0c;这样…

Hug pylons, not trees 拥抱电网,而非树木 | 经济学人20230408版双语精翻

《经济学人》4月8日周报封面即社论区&#xff08;Leaders&#xff09;精选文章&#xff1a;《拥抱电网&#xff0c;而非树木》&#xff08;Hug pylons, not trees&#xff09;。 Hug pylons, not trees 拥抱电网&#xff0c;而非树木 The case for an environmentalism that bu…

100天精通Golang(基础入门篇)——第9天:Go语言程序的循环语句

&#x1f337; 博主 libin9iOak带您 Go to Golang Language.✨ &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &#x1f30a; 《I…

UWB定位的两种解法

UWB(Ultra-Wideband)技术是一种短脉冲无线电技术(短脉冲意味着信号的带宽很大&#xff0c;因此称为超宽带)&#xff0c;其应用非常广泛&#xff0c;其中之一就是室内定位&#xff0c;通过计算信号传播的时间差&#xff0c;可以得到标签和基站之间的距离,如果有足够多的基站&…

Unity核心1——图片导入与图片设置

一、图片导入概述 ​ Unity 支持的图片格式有很多 BMP&#xff1a;是 Windows 操作系统的标准图像文件格式&#xff0c;特点是几乎不进行压缩&#xff0c;占磁盘空间大 TIF&#xff1a;基本不损失图片信息的图片格式&#xff0c;缺点是体积大 JPG&#xff1a;一般指 JPEG 格…

【Elasticsearch】 之 Translog/FST/FOR/RBM算法

目录 Translog FST/FOR/RBM算法解析 FST FOR&#xff08;Frame of Reference&#xff09;: RBM&#xff08;Roaring Bitmaps&#xff09;-(for filter cache) Translog es是近实时的存储搜索引。近实时&#xff0c;并不能保证被立刻看到。数据被看到的时候数据已经作为一…

工业级以太网RJ45温湿度监控系统解决方案之关键POE供电温湿度传感器

目 录 一、关键词…………………………………………………………………………3 二、 产品概述………………………………………………………………………3 三、 应用范围………………………………………………………………………3 四、 产品特点………………………………

Linux0.11内核源码解析-file_dev.c

目录 功能描述 int file_read(struct m_inode * inode, struct file * filp, char * buf, int count) int file_write(struct m_inode * inode, struct file * filp, char * buf, int count) 功能描述 该文件主要是由两个函数file_read()和file_write()组成&#xff0c;提供…

Nginx网站服务——服务基础

文章目录 一.Nginx服务基础1.关于Nginx的特点2.简述Nginx和Apache的差异3.Nginx 相对于 Apache 的优点4.Apache 相对于 Nginx 的优点5.阻塞与非阻塞6.同步与异步7.nginx的应用场景 二.编译安装nginx服务1.在线安装nginx1.1 yum部署Nginx1.2 扩展源安装完后直接安装Nginx 2.ngin…