110
社区成员
发帖
与我相关
我的任务
分享20233324 周浩然 2023-2024-2 《Python程序设计》实验四报告
课程:《Python程序设计》
班级: 2333
姓名: 周浩然
学号:20233324
实验教师:王志强
实验日期:2024年5月23日
必修/选修: 公选课
一、实验内容
Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
(1):编写从社交网络爬取数据,实现可视化舆情监控或者情感分析。
(2):利用公开数据集,开展图像分类、恶意软件检测等
(3):利用Python库,基于OCR技术实现自动化提取图片中数据,并填入excel中。
(4):爬取天气数据,实现自动化微信提醒
(5):利用爬虫,实现自动化下载网站视频、文件等。
(6):例如:编写小游戏:坦克大战、贪吃蛇、扫雷等等
注:在Windows/Linux系统上使用VIM、PDB、IDLE、Pycharm等工具编程实现。
二、实验过程及结果
项目概述:编写了一个简单的贪吃蛇小游戏,加上一个高等数学计算工具
1.贪吃蛇小游戏编程实践:
(1) 实现功能:
1) 界面:显示蛇身和食物,并有位置的游戏窗口
2) 游戏:控制蛇吃到食物会得分,并且在蛇头碰到墙壁或者蛇身时游戏结束。以获得更高的分数为游戏目的
(2) 编程实现:
1)
导入 Pygame 和 random 模块。
初始化 Pygame。
播放背景音乐。
设置游戏界面大小、背景颜色和游戏标题。以及蛇身颜色,食物颜色

2)
初始化蛇的位置、大小、速度
初始化食物的位置和大小

3)
定义蛇的初始移动方向,并用列表保存蛇的身体坐标
用draw函数跑来绘制蛇和食物

4)
进入主循环。
处理 Pygame 事件,包括窗口关闭事件和按键事件。

5)
根据按键事件改变蛇的移动方向。
根据蛇的移动方向移动蛇的头部。

6)
判断蛇是否吃到了食物,如果是,重新生成食物并在蛇的身体列表中添加头部坐标。更新蛇的身体坐标列表。

7)
判断游戏结束标志:蛇头撞到墙壁或蛇身

8)
绘制蛇和食物。
控制蛇的移动速度,使游戏画面更加流畅。
回到主循环。

(3)完整代码:
import pygame
import random
# 初始化 Pygame
pygame.init()
# 背景音乐播放
filepath = r"D:\The Python\贪吃蛇\music.mp3"
pygame.mixer.init()
pygame.mixer.music.load(filepath) # 加载MP3文件
pygame.mixer.music.play() # 播放mp3文件
# 设置游戏界面大小、背景颜色和游戏标题
screen_width = 640
screen_height = 480
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption('这是一只贪吃蛇')
# 定义颜色
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
# 定义蛇的初始位置、大小和速度
snake_x = 100
snake_y = 100
snake_size = 20
snake_speed = 5
# 定义食物的初始位置和大小
food_x = random.randrange(0, screen_width - snake_size, 20)
food_y = random.randrange(0, screen_height - snake_size, 20)
food_size = 20
# 定义蛇的移动方向
snake_direction = 'right'
# 定义一个列表来保存蛇的身体坐标
snake_body = []
# 定义一个计时器来控制蛇的移动速度
clock = pygame.time.Clock()
# 定义一个函数来绘制蛇和食物
def draw(snake_x, snake_y, snake_body, food_x, food_y):
screen.fill(BLACK)
for pos in snake_body:
pygame.draw.rect(screen, GREEN, [pos[0], pos[1], snake_size, snake_size])
pygame.draw.rect(screen, RED, [food_x, food_y, food_size, food_size])
pygame.display.update()
# 主循环
while True:
# 处理事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
# 退出游戏
pygame.quit()
quit()
# 处理按键事件
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP:
snake_direction = 'up'
elif event.key == pygame.K_DOWN:
snake_direction = 'down'
elif event.key == pygame.K_LEFT:
snake_direction = 'left'
elif event.key == pygame.K_RIGHT:
snake_direction = 'right'
# 移动蛇的头部
if snake_direction == 'up':
snake_y -= snake_speed
elif snake_direction == 'down':
snake_y += snake_speed
elif snake_direction == 'left':
snake_x -= snake_speed
elif snake_direction == 'right':
snake_x += snake_speed
# 判断是否吃到食物
if (snake_x == food_x and snake_y == food_y) or (snake_x == food_x and abs(snake_y - food_y) < snake_size) or (snake_y == food_y and abs(snake_x - food_x) < snake_size):
food_x = random.randrange(0, screen_width - snake_size, 10)
food_y = random.randrange(0, screen_height - snake_size, 10)
snake_body.append([snake_x, snake_y])
# 更新蛇的身体坐标
snake_body.insert(0, [snake_x, snake_y])
if len(snake_body) > 1:
snake_body.pop()
# 判断游戏是否结束
if snake_x < 0 or snake_x > screen_width - snake_size or snake_y < 0 or snake_y > screen_height - snake_size or [snake_x, snake_y] in snake_body[1:]:
# 游戏结束,显示分数并等待退出
font = pygame.font.Font(None, 36)
text = font.render('Score: ' + str(len(snake_body)), True, WHITE)
screen.blit(text, ((screen_width - text.get_width()) / 2, (screen_height - text.get_height()) / 2))
pygame.display.update()
pygame.time.wait(2000)
pygame.quit()
quit()
# 绘制蛇和食物
draw(snake_x, snake_y, snake_body, food_x, food_y)
# 控制蛇的移动速度
clock.tick(20)
(4)运行视频
(2) 编程实现:
1)导入数学库

2)求导模块

3)积分模块

4)求极限模块

5)解方程模块

6)主函数

(3)完整代码.
import math
# 求导
def qiudao(f, x):
h = 1e-6
return (f(x + h) - f(x)) / h
# 积分
def jifen(f, a, b):
n = 1000
h = (b - a) / n
result = 0
for i in range(n):
x = a + i * h
result += f(x)
return result * h
# 极限
def jixian(f, x):
h = 1e-6
return (f(x + h) - f(x - h)) / (2 * h)
# 方程求解
def jiefangchen(f, x0):
max_iter = 100
epsilon = 1e-6
x = x0
for i in range(max_iter):
fx = f(x)
if abs(fx) < epsilon:
break
dfx = qiudao(f, x)
x = x - fx / dfx
return x
# 主程序
def main():
while True:
print('1. 求导')
print('2. 积分')
print('3. 极限')
print('4. 方程求解')
print('5. 退出')
choice = int(input('请输入操作编号:'))
if choice == 1:
expression = input('请输入函数表达式:')
x = float(input('请输入自变量值:'))
f = lambda x: eval(expression)
result = qiudao(f, x)
print(f'在点{x}处的导数为:{result}')
elif choice == 2:
expression = input('请输入函数表达式:')
a = float(input('请输入积分下限:'))
b = float(input('请输入积分上限:'))
f = lambda x: eval(expression)
result = jifen(f, a, b)
print(f'{expression}在区间[{a},{b}]上的积分结果为:{result}')
elif choice == 3:
expression = input('请输入函数表达式:')
x = float(input('请输入自变量值:'))
f = lambda x: eval(expression)
result = jixian(f, x)
print(f'在点{x}处的极限值为:{result}')
elif choice == 4:
expression = input('请输入函数表达式:')
x0 = float(input('请输入初始解值:'))
f = lambda x: eval(expression)
result = jiefangchen(f, x0)
print(f'方程{expression}=0的解为:{result}')
elif choice == 5:
break
else:
print('无效的操作,请重新输入!')
# 运行主程序
if __name__ == '__main__':
main()
(4)运行视频


三、实验过程中遇到的问题及解决方法
1.问题:蛇头与食物碰撞检测不准确。
解决方法:调整了一下蛇头和食物的大小,使得二者大小一致,检测就比较准确了。
2.问题:蛇撞到自己的身体没有显示游戏结束。
解决方法:在蛇移动时,加入了检查蛇头是否与身体碰撞的代码,如果碰撞则游戏结束。通过记录蛇头和蛇身各部分的位置,存储于列表中,只要蛇头与蛇身任意部位重合,则游戏结束。在编写代码的过程中忘记考虑这一点了。
3.问题:蛇在移动过程中卡顿
解决方法: 询问GPT后,加入了一个定时器clock,使得蛇的移动看起来更加顺滑。
4.问题:添加背景音乐时,只有拖动游戏窗口时背景音乐才会播放,而游戏过程中不会播放
解决方法:将播放背景音乐的模块从主函数部分移到外面,这样在游戏进行时背景音乐就会正常播放了
四、实验感想体会
在本次实验过程中,命题自由开放,可以任意选择自己喜欢的程序进行设计,我做了两个简单的小程序,一个是一直以来想浅浅尝试的游戏,这个在学习C语言的过程中就有所接触,也是写的贪吃蛇,但是最终的成品却属实令我有些失望,巨多的bug,图形编程困难,当时有点心灰意冷了属于是。在学习python的过程中,早有耳闻其编写游戏功能强大,语言简洁,趁此机会,也就写了一个简单的贪吃蛇小游戏,说实话比用C好太多了,可以说也算是圆梦了。另一个呢则是写了一个简单的高等数学计算器,这个想法源于本学期的python实验二,当时是要编写一个简单的加减乘除模计算器,我就想都上大学了,也学过高等数学了,是不是应该去做一个有点高等数学的东西呢,于是这一次就写了一个能够求导、积分、求极限、解方程的小程序,还是挺不错的。
在实验过程中,bug也是层出不穷,借助编译器、GPT、乃至上网查询资料都能得到不错的解决。最终还是完成了这次实验,在调试代码的过程中,也是深刻感受到GPT功能之强大,有打算借助暑假时间来学习一下Chat-GPT的原理和实践,写出自己的人工智能,顺便借助华为云的300元券来训练一下。
五、《python程序设计》课程总结
“人生苦短,我用Python!”从第一节《python程序设计》课开始,王老师就时常挂在嘴边,自此,python编程语言的简洁性、易用性便让我印象深刻。
1.python基本语法简单,语句简洁,这一点远不同于C语言,更有强大的各种外部库,足以应对日常绝大多数的程序设计需求。也让我进一步走进了编程的世界。
2.本学期学习到了:基础语法:变量、数据类型、运算符、条件语句、循环语句等;数据类型:列表、元组、字典、集合等数据类型;函数与模块化:学习函数的定义与调用,以及如何使用模块来组织代码,提高代码的复用性和可维护性;面向对象编程:理解面向对象编程的概念,学习类与对象的定义、属性与方法的操作以及继承与多态等相关知识。
3.王老师上课幽默风趣,认真负责,课程氛围轻松愉悦,个人感觉效果非常好,有了不少的收获。“人生苦短,我用python”可谓是贯穿课程始终。
但是我还是想给老师提一个建议,就是我觉得不止是“人生苦短,我用python”,而且应该给大家介绍一下“python之禅”。
Import this

4.在接下来的学习生活之中,虽然python程序设计这门课程已经结束,但是我对python的学习和探索还没有结束,下一个小目标是用python写出一个私有化的Chat-GPT,并且拥有一整套训练机制!相信接下来的路会越加精彩!
5.最后感谢王志强老师的悉心教导,助您生活愉快,当然未来可能还有问题要请教您呀!
人生苦短,我用python!