20221115 实验四《Python程序设计》实验报告

毅秋 2023-05-25 22:27:37

20221115 2022-2023-2 《Python程序设计》实验x报告

课程:《Python程序设计》
班级: 2022
姓名: 尹毅
学号:20221115
实验教师:王志强
实验日期:2022年5月25日
必修/选修: 公选课

1.实验内容

Python综合应用:编写小游戏———flappybird.

2. 实验过程及结果

实验代码:
import pygame
import sys
import random

class Bird(object):
"""定义一个鸟类"""

def __init__(self):
    """定义初始化方法"""
    self.birdRect = pygame.Rect(65, 50, 50, 50)  # 鸟的矩形
    # 定义鸟的3种状态列表
    self.birdStatus = [pygame.image.load("assets/1.png"),
                       pygame.image.load("assets/2.png"),
                       pygame.image.load("assets/dead.png")]
    self.status = 0  # 默认飞行状态
    self.birdX = 120  # 鸟所在X轴坐标,即是向右飞行的速度
    self.birdY = 350  # 鸟所在Y轴坐标,即上下飞行高度
    self.jump = False  # 默认情况小鸟自动降落
    self.jumpSpeed = 10  # 跳跃高度
    self.gravity = 5  # 重力
    self.dead = False  # 默认小鸟生命状态为活着

def birdUpdate(self):
    if self.jump:
        # 小鸟跳跃
        self.jumpSpeed -= 1  # 速度递减,上升越来越慢
        self.birdY -= self.jumpSpeed  # 鸟Y轴坐标减小,小鸟上升
    else:
        # 小鸟坠落
        self.gravity += 0.2  # 重力递增,下降越来越快
        self.birdY += self.gravity  # 鸟Y轴坐标增加,小鸟下降
    self.birdRect[1] = self.birdY  # 更改Y轴位置

class Pipeline(object):
"""定义一个管道类"""

def __init__(self):
    """定义初始化方法"""
    self.wallx = 400;  # 管道所在X轴坐标
    self.pineUp = pygame.image.load("assets/top.png")
    self.pineDown = pygame.image.load("assets/bottom.png")

def updatePipeline(self):
    """"管道移动方法"""
    self.wallx -= 5  # 管道X轴坐标递减,即管道向左移动
    # 当管道运行到一定位置,即小鸟飞越管道,分数加1,并且重置管道
    if self.wallx < -80:
        global score
        score += 1
        self.wallx = 400

def createMap():
"""定义创建地图的方法"""
screen.fill((255, 255, 255)) # 填充颜色
screen.blit(background, (0, 0)) # 填入到背景

# 显示管道
screen.blit(Pipeline.pineUp, (Pipeline.wallx, -300));  # 上管道坐标位置
screen.blit(Pipeline.pineDown, (Pipeline.wallx, 500));  # 下管道坐标位置
Pipeline.updatePipeline()  # 管道移动

# 显示小鸟
if Bird.dead:  # 撞管道状态
    Bird.status = 2
elif Bird.jump:  # 起飞状态
    Bird.status = 1
screen.blit(Bird.birdStatus[Bird.status], (Bird.birdX, Bird.birdY))  # 设置小鸟的坐标
Bird.birdUpdate()  # 鸟移动

# 显示分数
screen.blit(font.render('Score:' + str(score), -1, (255, 255, 255)), (100, 50))  # 设置颜色及坐标位置
pygame.display.update()  # 更新显示

def checkDead():
# 上方管子的矩形位置
upRect = pygame.Rect(Pipeline.wallx, -300,
Pipeline.pineUp.get_width() - 10,
Pipeline.pineUp.get_height())

# 下方管子的矩形位置
downRect = pygame.Rect(Pipeline.wallx, 500,
                       Pipeline.pineDown.get_width() - 10,
                       Pipeline.pineDown.get_height())
# 检测小鸟与上下方管子是否碰撞
if upRect.colliderect(Bird.birdRect) or downRect.colliderect(Bird.birdRect):
    Bird.dead = True
# 检测小鸟是否飞出上下边界
if not 0 < Bird.birdRect[1] < height:
    Bird.dead = True
    return True
else:
    return False

def getResutl():
final_text1 = "Game Over"
final_text2 = "Your final score is: " + str(score)
ft1_font = pygame.font.SysFont("Arial", 70) # 设置第一行文字字体
ft1_surf = font.render(final_text1, 1, (242, 3, 36)) # 设置第一行文字颜色
ft2_font = pygame.font.SysFont("Arial", 50) # 设置第二行文字字体
ft2_surf = font.render(final_text2, 1, (253, 177, 6)) # 设置第二行文字颜色
screen.blit(ft1_surf, [screen.get_width() / 2 - ft1_surf.get_width() / 2, 100]) # 设置第一行文字显示位置
screen.blit(ft2_surf, [screen.get_width() / 2 - ft2_surf.get_width() / 2, 200]) # 设置第二行文字显示位置
pygame.display.flip() # 更新整个待显示的Surface对象到屏幕上

if name == 'main':
"""主程序"""
pygame.init() # 初始化pygame
pygame.font.init() # 初始化字体
font = pygame.font.SysFont("Arial", 50) # 设置字体和大小
size = width, height = 400, 650 # 设置窗口
screen = pygame.display.set_mode(size) # 显示窗口
clock = pygame.time.Clock() # 设置时钟
Pipeline = Pipeline() # 实例化管道类
Bird = Bird() # 实例化鸟类
score = 0
while True:
clock.tick(60) # 每秒执行60次
# 轮询事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
if (event.type == pygame.KEYDOWN or event.type == pygame.MOUSEBUTTONDOWN) and not Bird.dead:
Bird.jump = True # 跳跃
Bird.gravity = 5 # 重力
Bird.jumpSpeed = 10 # 跳跃速度

    background = pygame.image.load("assets/background.png")  # 加载背景图片
    if checkDead():  # 检测小鸟生命状态
        getResutl()  # 如果小鸟死亡,显示游戏总分数
    else:
        createMap()  # 创建地图
pygame.quit()

引用的图片:

img

img

img

img

img

img

img

运行视频:

将代码上传到gitee:

img

3. 实验过程中遇到的问题和解决过程

  • 问题1:一开始跟着书上的代码敲无法正常运行
  • 问题1解决方案:在项目里面下载pygame后能够正常运行
  • 问题2:书中代码并不完善
  • 问题2解决方案:上网寻找资料将省略的代码完善。
  • ...

心得体会(感悟、思考等)

选择flappybird这个游戏是因为我以前用过C语言编译过这个的游戏,但是那个更加简单,图案也非常单调,而利用python编译的这个游戏时之前的经历给了我很大帮助,有了基本的思路,把这个复杂的程序分成几个小的部分,逐一解决,再一次又一次的代码纠错,程序能够运行的时候,看到屏幕上运行着自己尝试制作的小游戏,我的内心十分有成就感。在兴奋之余,我也在思考这个程序可以完善改进的地方,比如柱子的高度可以改成随机的,且死亡之后添加是否继续的对话框,选择难度等等。我相信在我对python有更深一步的理解和学习后这些问题都能够解决。

全课总结

转眼间Python就结课了,在这之中我学到很多Python基础知识,如面向对象,字典,爬虫等等。在课程中,我见识了Python相对于C语言的便捷之处,“人生苦短,我用python”。对我来说,最震撼的就是Python的库和函数的量,很多都可以用库中函数来很容易的解决,无需像C语言一样写很多的函数。我对python教学过程中深刻就是对爬虫的学习,在学长讲完爬虫后,我见证了Python的应用之广泛与强大,同时,运用爬虫在Python上运用ChatGPT和拟声,在我认为这会需要很多代码,但却只需要十几行代码,这让我很震撼。同时,我还对web编程十分感兴趣,我试过做过一个html链接,也看到过很多神奇的应用,在我们学校C语言练习网站上,有一个小游戏2048就是用HTMl写的。在进行对python的有关学习之后,我对它的兴趣更加浓厚。至于意见,在我看来,老师讲课很有趣,有很多操作实例,这让我有了一个很直观的认识,也让我很好的去理解陌生的知识。但我建议老师可以平时多分享一些python简单但是有趣的小程序,多让同学动手操作,同时多分享一些教辅资料。

...全文
521 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
内容概要:本文围绕“阶梯碳下考虑P2G-CCS与供需灵活响应的IES优化调度”展开,基于Matlab平台构建综合能源系统(IES)在阶梯式碳交易机制下的优化调度模型。研究深度融合电制气(P2G)与碳捕集、利用与封存(CCS)技术,结合需求侧灵活响应机制,旨在提升系统的低碳运行能力与经济性。通过建立多能流耦合的优化模型,协调电力、天然气、热力等多种能源形式的协同调度,有效降低系统碳排放强度,并借助YALIMIP工具包调用求解器进行高效求解。文档提供了完整的代码实现、模型构建流程与结果分析方法,涵盖从问题建模到仿真实现的全过程,具备较强的可复现性与科研参考价值。; 适合人群:具备电力系统、能源系统或优化建模相关背景的研究生、高校教师及工程技术人员,尤其适合从事综合能源系统、碳减排策略、P2G与CCS技术集成研究的专业人员,需熟练掌握Matlab编程与基本的数学规划知识。; 使用场景及目标:①用于研究阶梯式碳交易政策下综合能源系统的低碳经济调度策略;②支撑P2G-CCS技术与需求响应机制在IES中的仿真集成与性能评估;③作为撰写高水平学术论文(如EI/SCI收录)的技术基础与复现资源,推动碳中和背景下能源系统优化方向的创新研究。; 阅读建议:建议结合百度网盘提供的完整代码与资料包,按照模块逐步调试程序,重点理解目标函数的设计逻辑、碳交易成本的建模方式、约束条件的数学表达及求解器的配置方法,同时关注多能耦合设备的建模细节,配合公众号“荔枝科研社”获取持续的技术支持与案例拓展。
内容概要:本文系统研究了基于卷积神经网络(CNN)与支持向量机(SVM)融合的CNN-SVM混合模型在数据分类预测中的应用,尤其聚焦于工业故障识别领域。通过Matlab平台实现,该方法首先利用CNN强大的多层次特征提取能力对原始输入数据进行深度特征学习,自动捕获关键局部模式与空间结构信息,随后将提取的高层特征作为输入传递至SVM分类器,借助SVM在高维空间中小样本条件下卓越的分类性能与泛化能力完成最终判别任务。文中详尽阐述了模型的整体架构设计、网络参数配置、训练优化流程及特征迁移机制,充分结合了深度学习在特征表达上的优势与传统机器学习在分类决策上的稳健性。实验部分通过实际故障数据集验证了该混合模型相较于单一CNN或SVM模型在分类准确率、鲁棒性和抗过拟合能力方面的显著提升,证明了其在复杂故障诊断任务中的有效性与先进性; 适合人群:具备一定机器学习与深度学习理论基础,熟悉Matlab编程环境,从事故障诊断、模式识别、智能制造、电力系统监控或工业数据分析等相关领域的研究生、科研人员及工程技术开发者; 使用场景及目标:① 应用于旋转机械、电力设备、航空航天等领域的多类别故障识别与状态监测;② 掌握深度特征提取与传统分类器融合的技术路径,提升小样本、高噪声环境下数据分类的精度与可靠性;③ 为撰写高水平学术论文、开展科研项目或工程实践提供可复现的算法框架与完整代码支持; 阅读建议:读者应深入理解CNN与SVM的协同工作机制,重点分析特征提取层与分类层之间的接口设计,建议动手运行并调试所提供的Matlab代码,尝试在不同数据集上进行迁移实验与参数调优,以全面掌握该混合模型的应用技巧与优化策略。

144

社区成员

发帖
与我相关
我的任务
社区描述
开展Python教学和技术交流
python 高校 北京·丰台区
社区管理员
  • blackwall0321
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧