20211403 左颖《Python程序设计》实验四综合实践实验报告
20211403 2021-2022-2 《Python程序设计》实验四报告
课程:《Python程序设计》
班级: 2114
姓名: 左颖
学号:20211403
实验教师:王志强
实验日期:2022年5月31日
必修/选修: 公选课
1.实验内容
课程要求
Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
课代表和各小组负责人收集作业(源代码、视频、综合实践报告)
注:在华为ECS服务器(OpenOuler系统)和物理机(Windows/Linux系统)上使用VIM、PDB、IDLE、Pycharm等工具编程实现。
批阅:注意本次实验不算做实验总分,前三个实验每个实验10分,累计30分。本次实践算入综合实践,打分为25分。
评分标准:
(1)程序能运行,功能丰富。(需求提交源代码,并建议录制程序运行的视频)10分
(2)综合实践报告,要体现实验分析、设计、实现过程、结果等信息,格式规范,逻辑清晰,结构合理。10分。
(3)在实践报告中,需要对全课进行总结,并写课程感想体会、意见和建议等。5分
(4)如果没有使用华为云服务(ECS或者MindSpore均可),本次实践扣10分。
注意:每个人的实验不能重复,课代表先统计大家做的内容并汇总,有重复的需要自行协商。
实验具体内容
“见缝插针”小游戏相信大家并不陌生,在商场中有很多口红机都使用了“见缝插针”小游戏作为原型,所以我想自己制作一款这样的游戏。
2. 实验过程及结果
实验分析
玩家按下空格键后发射一根针到圆盘上,所有已发射的针跟着圆盘逆时针方向转动;如果新发射的针碰到了已有的针,则游戏结束。
实验还需要添加一些音效来增加游戏体验。
圆盘与针的显示以及针的旋转
首先在窗口显示一个空心圆,然后绘制一根针,在已经完成前两步的基础上,添加代码,使针旋转(这里使用了update()函数)。
针的发射与开始转动
多针发射与转动
游戏失败之后的判断与停止旋转
得分统计与游戏信息显示
添加一些音效(搜集网上资源、教程)
华为云上运行
3. 实验过程中遇到的问题和解决过程
- 问题1:开始做圆的时候,圆太小了,然后到了后来发现整体不太美观
- 问题1解决方案:修改了前期生成的圆的大小,并且保持圆心在一个点不移动。
- 问题2:想要加音效,但是找了素材,匹配不上针的发射
- 问题1解决方案:看了网上相关的成功例子,到社区下载相匹配的素材,然后匹配。
4.源码
import pgzrun # 导入游戏库
TITLE = 'Python见缝插针 --- by 童晶'
startNeedle = Actor('needle', anchor=(170+50, 1)) # 导入初始位置针的图片、设置锚点相对坐标
startNeedle.x = 200 # 设置针锚点的x坐标
startNeedle.y = 300 # 设置针锚点的y坐标
needles = [] # 存储所有针的列表,开始为空
rotateSpeed = 1 # 旋转速度,默认是1,后面游戏结束后改成0
score = 0 # 游戏得分
def draw(): # 绘制模块,每帧重复执行
screen.fill('white') # 白色背景
startNeedle.draw() # 初始位置针的绘制
for needle in needles: # 绘制列表中每根针
needle.draw() # 绘制针
screen.draw.filled_circle((400, 300), 80, 'red') # 绘制圆盘
screen.draw.text(str(score), (50, 250),
fontsize=50, color='green') # 显示游戏得分
if rotateSpeed == 0: # 游戏失败
screen.draw.text("Game Over!", (10, 320), fontsize=35, color='red')
def update(): # 更新模块,每帧重复操作
for needle in needles: # 对列表中每根针遍历处理
needle.angle = needle.angle + rotateSpeed # 针的角度增加,即慢慢旋转
def on_key_down(): # 当按下任意键盘键时执行
global rotateSpeed, score
if rotateSpeed >0: # 播放音效
music.play_once('弹簧')
# 再新建一根针
newNeedle = Actor('needle', anchor=(170+50, 1))
newNeedle.x = 400 # 设置针锚点的x坐标
newNeedle.y = 300 # 设置针锚点的y坐标
for needle in needles:
if newNeedle.colliderect(needle): # 新针和其他针碰撞,游戏失败
print('游戏失败')
rotateSpeed = 0 # 游戏失败,针停止旋转
music.play_once('溜走')
if rotateSpeed > 0: # 如果针还在旋转
score = score + 1 # 得分加1
needles.append(newNeedle) # 把新针加入列表中
pgzrun.go() # 开始执行游戏
其他(感悟、思考等)
收获
当自己的代码运行出了问题除了问老师,还可以上网查询资料,或许可以在网上找到更多精进的方法。在游戏制作结束后,我觉得还能在一些地方进行改进:
1.随着游戏的进行,针的旋转速度越来越快,游戏难度越来越大;
2.尝试在画面中间新增一根针,实现双人版的见缝插针游戏。
感悟
作为一名已经在上个学期接触过python的大一学生,我当时选这门课的时候在犹豫,不知道我能不能在课上学到更多知识,但后来王老师的讲课打消了我的疑虑。
上个学期娄老师已经带我们初步接触了python,但是毕竟是导论课,相关的知识点还不够清晰成系统,所以我面对一些能用python解决的问题的时候,我有大体的思路,但是不能把我的想法最后落地实践。而上了王老师的公选课以后,我学到了很多有用的知识,而且我感觉我的实操能力也更强了。
我除了温习了关于python的相关基本知识点,还学习了爬虫等新的技能。
特别喜欢王老师的公选课,老师有趣幽默,讲课也特别有意思,讲的知识也是很通俗易懂。
一个学期下来,我觉得自己对python的知识掌握得更深了,而且也变得更有耐心了,遇到实验中的问题,先自己仔细想想能不能解决,不可以的话就上网查或者是问问同学,感觉自己不是一遇到问题就退缩的我了哈哈哈。
总之感谢遇见,感谢能和王老师一起度过这学期的公选课,学习有趣的python知识。
参考资料
[《Python游戏趣味编程》](https://www.epubit.com/bookDetails?id=UB72096d97d6149&typeName=搜索)