93
社区成员




20234227 《Python程序设计入门》实验四报告
课程:《Python程序设计入门》
班级: 2342
姓名: 孙语汐
学号:20234227
实验教师:王志强
实验日期:2024年5月24日
必修/选修: 专选课
一、实验内容
Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。(源代码、视频、综合实践报告)
注意事项:在Windows/Linux系统上使用VIM、PDB、IDLE、Pycharm等工具编程实现。
例如:编写从社交网络爬取数据,实现可视化舆情监控或者情感分析。
例如:利用公开数据集,开展图像分类、恶意软件检测等
例如:利用Python库,基于OCR技术实现自动化提取图片中数据,并填入excel中。
例如:爬取天气数据,实现自动化微信提醒
例如:利用爬虫,实现自动化下载网站视频、文件等。
例如:编写小游戏:坦克大战、贪吃蛇、扫雷等等
注:在Windows/Linux系统上使用VIM、PDB、IDLE、Pycharm等工具编程实现。
评分标准:
(1)程序能运行,功能丰富。(需求提交源代码,并建议录制程序运行的视频)10分
(2)综合实践报告,要体现实验分析、设计、实现过程、结果等信息,格式规范,逻辑清晰,结构合理。20分。
(3)实验4的遇到的问题以及感想体会。5分。
(4)对全课进行总结,并写课程感想体会、意见和建议等。10分。
二、实验分析
理解游戏逻辑:了解贪吃蛇游戏的基本规则,包括蛇的移动、食物的生成、碰撞检测等。
提升问题解决能力:面对编程中的问题和挑战,学习如何分析和解决。
定义游戏对象:包括蛇、食物、墙壁等,可以使用面向对象编程来定义这些对象及其属性(如位置、大小、速度等)和方法(如移动、绘制等)。
实现游戏逻辑:编写代码来实现蛇的移动、食物的生成和碰撞检测等功能。
测试与调试:运行程序,测试游戏功能是否正常,对出现的问题进行调试。
优化与扩展:根据测试结果对游戏进行优化,如提升运行速度、改善用户体验等;也可以添加新功能,如增加关卡、引入道具等。
代码结构:分析代码的组织结构,评估其是否符合面向对象编程的原则,是否易于阅读和维护。
游戏性能:测试游戏的运行速度、内存占用等性能指标,评估其是否满足要求。
用户体验:从用户的角度出发,评估游戏的操作是否流畅、界面是否美观、音效是否合适等。
问题解决能力:回顾在编程过程中遇到的问题和挑战,分析问题的原因和解决方案,评估自己的问题解决能力是否得到提升。
扩展性:评估游戏是否具有良好的扩展性,即是否容易添加新功能和改进现有功能。
三、实验设计
贪吃蛇游戏:
完整源代码如下:
import pygame
import sys
import random
# 初始化pygame
pygame.init()
# 设置颜色
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
# 设置屏幕大小
WIDTH = 400
HEIGHT = 400
SCREEN = pygame.display.set_mode((WIDTH, HEIGHT))
# 设置蛇的初始位置和速度
SNAKE_SPEED = 10
SNAKE_SIZE = 20
SNAKE_POS = [(5 * SNAKE_SIZE, 5 * SNAKE_SIZE), (4 * SNAKE_SIZE, 5 * SNAKE_SIZE), (3 * SNAKE_SIZE, 5 * SNAKE_SIZE)]
SNAKE_DIR = (SNAKE_SIZE, 0)
# 设置食物的位置
FOOD_POS = None
FOOD_SIZE = SNAKE_SIZE
# 生成食物
def generate_food():
global FOOD_POS
x = random.randint(0, (WIDTH // FOOD_SIZE) - 1) * FOOD_SIZE
y = random.randint(0, (HEIGHT // FOOD_SIZE) - 1) * FOOD_SIZE
FOOD_POS = (x, y)
while FOOD_POS in SNAKE_POS:
generate_food()
generate_food()
# 游戏主循环
clock = pygame.time.Clock()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT and SNAKE_DIR[0] != SNAKE_SIZE:
SNAKE_DIR = (-SNAKE_SIZE, 0)
elif event.key == pygame.K_RIGHT and SNAKE_DIR[0] != -SNAKE_SIZE:
SNAKE_DIR = (SNAKE_SIZE, 0)
elif event.key == pygame.K_UP and SNAKE_DIR[1] != SNAKE_SIZE:
SNAKE_DIR = (0, -SNAKE_SIZE)
elif event.key == pygame.K_DOWN and SNAKE_DIR[1] != -SNAKE_SIZE:
SNAKE_DIR = (0, SNAKE_SIZE)
# 移动蛇
new_head = (SNAKE_POS[0][0] + SNAKE_DIR[0], SNAKE_POS[0][1] + SNAKE_DIR[1])
SNAKE_POS.insert(0, new_head)
# 检查是否吃到食物
if new_head == FOOD_POS:
generate_food()
else:
SNAKE_POS.pop()
# 检查是否撞到墙或自己
if new_head[0] < 0 or new_head[0] >= WIDTH or new_head[1] < 0 or new_head[1] >= HEIGHT or new_head in SNAKE_POS[1:]:
pygame.quit()
sys.exit()
# 绘制屏幕
SCREEN.fill(WHITE)
pygame.draw.rect(SCREEN, GREEN, (FOOD_POS[0], FOOD_POS[1], FOOD_SIZE, FOOD_SIZE))
for pos in SNAKE_POS:
pygame.draw.rect(SCREEN, RED, (pos[0], pos[1], SNAKE_SIZE, SNAKE_SIZE))
pygame.display.flip()
# 控制游戏速度
clock.tick(SNAKE_SPEED)
运行视频:https://v.youku.com/v_show/id_XNjM5NDUyMjEwMA==.html(密码000000)
gif图像:
四、实验过程
定义蛇的初始位置、长度和方向。
定义食物的位置和生成规则。
设计碰撞检测机制,用于检测蛇是否碰到自己或边界。
1.编写代码
初始化
导入必要的库和模块。
初始化pygame和设置窗口大小。
游戏循环
创建一个主循环,用于不断更新游戏状态并渲染画面。
事件处理
在游戏循环中处理用户输入事件,如键盘按键。
游戏逻辑更新
更新蛇的位置和方向。
检查蛇是否吃到食物。
如果吃到食物,增加蛇的长度并重新生成食物。
检查蛇是否碰到自己或边界,如果是,则结束游戏。
渲染画面
清除屏幕。
绘制蛇、食物和其他游戏元素。
更新屏幕显示。
结束游戏
如果游戏结束,显示游戏结束画面和分数。
2. 测试与调试
运行程序,检查游戏是否按预期工作。
调试代码,修复任何发现的错误或问题。
3.优化与扩展
优化游戏性能,如提高帧率或减少内存使用。
添加更多功能,如增加难度级别、添加音效或背景音乐、支持多人游戏等。
4. 文档与分享
编写用户手册或帮助文档,解释游戏玩法和操作方法。
将游戏分享给朋友或在线社区,收集反馈并进行进一步改进。
五、遇到的问题
我最初的想法是简单地将蛇头的位置更新为食物的位置,并将蛇身的其余部分依次向前移动一个单位。但是,我发现这会导致蛇身的每一节都移动到前一节的位置,造成一种蛇身瞬移的视觉效果,而不是平滑的移动。 为了解决这个问题,设计了一个蛇身数组,每次移动时,我都会将蛇头的位置添加到数组的开头,并删除数组的最后一个元素,从而实现了蛇身的平滑移动。
还有处理蛇吃到食物后增长。开始只是简单地将蛇的长度增加了一个单位,但这样做并没有在视觉上增加蛇身的长度。后来修改了蛇吃到食物后的处理逻辑。当蛇吃到食物时,不再只是增加蛇的长度,而是额外地创建一个新的蛇身元素,并将其添加到蛇身数组的开头。这样,每次蛇吃到食物时,它都会在视觉上变长。
在实现游戏边界和蛇身碰撞检测时也有问题。我的想法是简单地检查蛇头的位置是否超出了游戏边界或与蛇身的其它部分重合。但是,这样做需要遍历整个蛇身数组,效率较低。为了提高效率,设计了一个边界和蛇身碰撞检测的函数,它利用蛇身数组中的信息来快速判断是否存在碰撞。这样,每次移动时,只需调用这个函数即可判断蛇是否死亡,大大提高了游戏的性能。
六、感悟
通过设计Python贪吃蛇程序并进行实验分析,我们可以深入理解编程概念和游戏设计原理,提升编程能力和问题解决能力。同时,我们也可以根据实验结果对游戏进行优化和扩展,使其更加完善和有趣。这个过程不仅是一个学习的过程,也是一个挑战和成长的过程。
意识到编程不仅仅是编写代码,更是一个思考和解决问题的过程。在设计贪吃蛇程序时,我遇到了许多挑战,如蛇身移动、增长、边界检测等问题。通过不断思考、尝试和改进,我逐渐找到了解决问题的方法,这让我深刻体会到了编程的乐趣和价值。
其次,我更加明白了代码逻辑和算法的重要性。贪吃蛇游戏虽然看似简单,但其中涉及到了许多逻辑判断和算法设计。如何高效地移动蛇身、检测碰撞、处理食物等都是需要精心设计和优化的。这让我认识到,一个好的程序不仅需要美观的界面和友好的用户体验,更需要强大的代码逻辑和算法支持。
七、全课总结
首先,学习Python让我认识到编程并不只是理科生的专长。文科生在学习的过程中,更加注重的是人文关怀、批判性思维和表达能力。而编程,作为一种解决问题的工具,同样需要这些能力的运用。在编写代码的过程中,我们需要清晰地表达我们的想法,准确地描述问题,并创造性地提出解决方案。这些能力,都是文科生在学习过程中积累下来的宝贵财富。
其次,Python的简洁、易读和易学的特性让我深受吸引。相比于其他编程语言,Python的语法更加简洁明了,易于上手。这让我在学习的过程中感到更加轻松和愉悦。同时,Python的强大功能也让我感受到了编程的魅力和实用性。通过编写Python程序,我可以轻松地处理数据、分析文本、制作网页等等,这些技能在文科领域同样具有广泛的应用价值。
认识到了跨学科学习的重要性。在现代社会中,各个学科之间的交叉融合越来越普遍。学习Python可以促进我与其他学科之间的交流和合作。例如,在数据分析方面,我可以将Python与统计学、社会学等学科结合起来,进行深入的数据挖掘和分析;在文本处理方面,我可以将Python与语言学、文学等学科结合起来,进行文本分析和情感分析等等。这种跨学科的学习模式可以拓宽我的视野。
学习Python也让我更加深刻地认识到了计算机技术在现代社会中的重要性。随着信息技术的不断发展,计算机技术已经渗透到了我们生活的方方面面。无论是工作、学习还是生活,我们都离不开计算机技术的支持。因此,掌握一门编程语言,可以帮助我们更好地适应现代社会的发展需求。
我相信在未来的学习和工作中,我会继续深入学习Python和其他编程语言,不断提升自己的综合素质和竞争力。