20213426 朱诗瑶 2022-2022-2《python程序设计》实验四报告
课程:《Python程序设计》
班级: 2134
姓名: 朱诗瑶
学号:20213426
实验教师:王志强
实验日期:2022年5月30日
必修/选修: 公选课
一、实验内容
Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。在华为ECS服务器(OpenOuler系统)和物理机(Windows/Linux系统)上使用VIM、PDB、IDLE、Pycharm等工具编程实现。
实验思路:使用python自带的海龟库写一个经典的推箱子小游戏(能重玩本关、可以选择关卡、有背景音乐)。
二、实验过程及结果
1.创建游戏窗口
2.画出游戏地图
3.使人物,箱子可以移动起来
4.判断游戏是否通关
5.在此基础上增加关卡,并且可以自主选择关卡
6.完善游戏,添加背景音乐,与引导文字
7.完整代码
# -*- coding: UTF-8 -*- import turtle import level import pygame pygame.init() pygame.mixer.init() pygame.mixer.music.load('C:\\Users\\Dell\\Desktop\\tuixiangzi\\bgmusic.mp3') # 加背景音乐 pygame.mixer.music.play(-1,0.0) # 从0秒开始循环播放 ms = turtle.Screen() # 游戏面板 ms.setup(900, 650, 200, 0) # 面板大小 ms.register_shape('bc1.gif') # 引入第一关背景图片 ms.register_shape('bc2.gif') # 引入第二关背景图片 ms.register_shape('bc3.gif') # 引入第三关背景图片 ms.register_shape('bc4.gif') # 引入第四关背景图片 ms.register_shape('bc5.gif') # 引入第五关背景图片 ms.bgpic('bc1.gif') ms.title('一个普普通通的推箱子小游戏') # 游戏名称 面板左上角显示 ms.register_shape('wall.gif') # 引入素材 ms.register_shape('o.gif') # 目标 ms.register_shape('p.gif') # 人物 ms.register_shape('box.gif') # 箱子 ms.register_shape('boxc.gif') # 正确位置的箱子(变红) ms.tracer(0) # 加快游戏显示 levels = level.level_list() # 关卡难度 class Pen(turtle.Turtle): def __init__(self, pic): # 初始化 super().__init__() # 继承海龟 self.shape(pic) self.penup() def move(self, x, y, px, py): gox, goy = x+px, y+py if (gox, goy) in go_space: # 人物只能去空白的地方 self.goto(gox, goy) if (gox+px, goy+py) in go_space and (gox, goy) in box_space: # 人物推着箱子 for i in box_list: if i.pos() == (gox, goy): go_space.append(i.pos()) box_space.remove(i.pos()) i.goto(gox+px, goy+py) self.goto(gox, goy) go_space.remove(i.pos()) box_space.append(i.pos()) if i.pos() in correct_box_space: # 如果箱子被放到了正确的地方,则箱子变红 i.shape('boxc.gif') else: i.shape('box.gif') if set(box_space) == set(correct_box_space): text.show_win() # 人物的上下左右移动 def go_up(self): self.move(self.xcor(), self.ycor(), 0, 50) def go_down(self): self.move(self.xcor(), self.ycor(), 0, -50) def go_left(self): self.move(self.xcor(), self.ycor(), -50, 0) def go_right(self): self.move(self.xcor(), self.ycor(), 50, 0) class Game(): # 地图要重复用到,所以定义为类 def paint(self): # 画地图 i_date = len(levels[num-1]) j_date = len(levels[num-1][0]) for i in range(i_date): for j in range(j_date): x = -j_date*25+25+j*50 + sister_x y = i_date*25-25-i*50 if levels[num-1][i][j] == 'O': correct_box.goto(x, y) correct_box.stamp() go_space.append((x, y)) correct_box_space.append((x, y)) for i in range(i_date): for j in range(j_date): x = -j_date*25+25+j*50 + sister_x y = i_date*25-25-i*50 if levels[num-1][i][j] == ' ': go_space.append((x, y)) if levels[num-1][i][j] == 'X': # X是墙 wall.goto(x, y) wall.stamp() if levels[num-1][i][j] == 'P': # P是人物 player.goto(x, y) go_space.append((x, y)) if levels[num-1][i][j] == 'B': # B是箱子 box = Pen('box.gif') box.goto(x, y) box_list.append(box) box_space.append((x, y)) class ShowMessage(turtle.Turtle): # 设置游戏中的文字类 def __init__(self): super().__init__() self.penup() self.pencolor('white') # 文字颜色 self.ht() # 游戏上方显示的文字 def message(self): self.goto(0+sister_x, 290) self.write(f'第{num}关',align='center', font=('宋体', 20, 'bold')) self.goto(0+sister_x, 270) self.write('重新开始本关请按回车键',align='center', font=('宋体', 15, 'bold')) self.goto(0+sister_x, 250) self.write('选择关卡请按Q',align='center', font=('宋体', 15, 'bold')) def show_win(self): global num if num == len(levels): # 全部通关后显示的文字 num = 1 self.goto(0, 0) self.write('恭喜你,你已全部过关!', align='center', font=('宋体', 30, 'bold')) self.goto(0, -50) self.write('若想返回第一关 请按空格键', align='center', font=('宋体', 30, 'bold')) else: # 每通一关显示的文字 num = num+1 self.goto(0, 0) self.write('恭喜过关', align='center', font=('宋体', 30, 'bold')) self.goto(0, -50) self.write('进入下一关请按空格键', align='center', font=('宋体', 30, 'bold')) def init(): text.clear() wall.clear() correct_box.clear() for i in box_list: i.ht() del(i) box_list.clear() box_space.clear() go_space.clear() correct_box_space.clear() game.paint() text.message() ms.bgpic(f'bc{num}.gif') def choose(): # 选择关卡 global num a = ms.numinput('选择关卡', '你的选择(请输入1-5)', 1) if a is None: a = num num = int(a) init() ms.listen() sister_x = 225 num = 1 correct_box_space = [] box_list = [] box_space = [] go_space = [] # 人物可以去的位置(空白位置) wall = Pen('wall.gif') correct_box = Pen('o.gif') player = Pen('p.gif') game = Game() # game类 game.paint() # 方法 text = ShowMessage() text.message() ms.listen() # 屏幕监听 ms.onkey(player.go_up, 'Up') # 键盘控制 人物向上走 ms.onkey(player.go_down, 'Down') # 人物向下走 ms.onkey(player.go_left, 'Left') # 人物向左走 ms.onkey(player.go_right, 'Right') # 人物向右走 ms.onkey(init, 'Return') # 重玩本关 ms.onkey(init, 'space') # 空格键通往下一关卡 ms.onkey(choose, 'Q') # 按大写字母Q选择关卡 while True: # 加循环,使屏幕一直更新 ms.update() ms.mainloop() # 保持游戏窗口一直都存在
# -*- coding:UTF-8 -*- # 地图代码 def level_list(): level_1 = [ 'CCXXXCCC', 'CCXOXCCC', 'CCX XXXX', 'XXXB BOX', 'XO BPXXX', 'XXXXBXCC', 'CCCXOXCC', 'CCCXXXCC'] level_2 = [ 'CXXXXCCC', 'CX OXXXX', 'XXO X', 'XOO XX X', 'X B B X', 'XX BBXXX', 'CXP XCC', 'CXXXXXCC'] level_3 = [ 'CCXXXXXXCC', 'CCX XXX', 'CCX B X', 'XXX B XX X', 'XOOO B X', 'XOOOBXB XX', 'XXXX X B X', 'CCCX P X', 'CCCXXXXXXX'] level_4 = [ 'CCCXXXXXX', 'XXXXO PX', 'X BBB X', 'XOXXOXXOX', 'X B X', 'X BOX XX', 'XXXX XC', 'CCCXXXXXC'] level_5 = [ 'CCXXXXXX', 'CCX X', 'XXXBBB X', 'X BOO X', 'XPBOOOXX', 'XXXX XC', 'CCCXXXXC'] levels = [] levels.append(level_1) levels.append(level_2) levels.append(level_3) levels.append(level_4) levels.append(level_5) return(levels)
8.实验结果
(具体运行结果在视频中展示)
9.华为云ECS运行
三、实验过程中遇到的问题及解决过程
问题1:SyntaxError: Non-ASCII character '\xe5' in file。
问题1解决方案:原因是python的默认编码文件是用的ASCII码,而python文件中使用了中文等非英语字符。
解决办法:在Python源文件的最开始一行加入一句:# coding=UTF-8或者# -*- coding:UTF-8 -*-
问题2:在华为云中运行turtle时会产生窗口,但是如果没有可用的屏幕,就会产生错误。
问题2解决方案:为putty配置Xming,具体我参考了(1条消息) Putty + Xming实现远程登陆Linux显示图形化界面_拨开迷雾丶见云天的博客-CSDN博客_putty 图形化界面 (1条消息) Xming + PuTTY 在Windows下远程Linux主机使用图形界面的程序_mkhgg的博客-CSDN博客
问题3:在putty中运行所写代码,但是显示“SyntaxError: invalid syntax”,找到原因是因为华为云中默认的python是2.7版本的,而我们大多用的是3.x版本,会存在语法不兼容的情况。
问题3解决方案:在华为云服务器上安装python3.6.2版本,并安装了第三方库。
四、全课总结、感想及课程建议
1.对全课的总结、感想及体会
因为之前有了解过python是现在世界上较为流行而且简便的计算机语言,所以我在上学期期末选修课中看到有《python程序设计》之后,便怀揣着期待而忐忑的心情选修了python。忐忑主要是因为之前没有怎么接触过编程语言,而且这学期还要学习C语言,我害怕自己会把二者搞混,导致哪一门语言都学不好,但是,我还是想挑战一下自己,并且锻炼自己的学习能力与编程水平,便毅然选择了python。现在看来,当初的选择是对的,我很开心能够选修这门课程。
经过王老师一个学期由浅入深的指导教学,我学会了变量赋值、运算符及其优先级、基本数据类型、循环语句、列表、元组、字典、集合、字符串与正则表达、数据加密与传输、Python爬虫、封装、继承,也知道了CSDN,学会了Markdown编辑器的使用方法等很多有趣的东西,也在实践中体会到了python的优点,那就是十分简便。C语言十几行的代码,python一两行就可以解决,极大地提高了我们学习工作的效率。刚开始上课时,我还能游刃有余的跟上老师的节奏,但是似乎自从正则表达式开始到后面的封装、继承,我就有些吃力了,可能主要还是课后没有及时练习,没能将知识融会贯通,导致后面一些部分知识模块我掌握的还是不是很牢固。
俗话说,“师傅领进门,修行在个人。”王老师带领我们走进了python的大门,让我领略到了Python语言的魅力,后面的python学习之路还是要开我们自己去开拓。对于运用python来说,我还只是一个小白,我相信自己还有很大的提升空间,所以虽然选修课结课了,但是学习Python之路永不停止。在以后的学习生涯中,我会更加努力的学习python,同时巩固所学知识,争取能在这条路上越走越远,不辜负王老师这一学期的辛勤教学ヾ(*>∀<*)(ノ∀`●)⊃!
2.本次实验体会
这次综合实验我做了一个经典的推箱子小游戏。最开始的时候我一点思路都没有,这时候就体现出了画思维导图,写流程图的重要性,把自己的想法分解成各个模块,由简到繁一点一点的去实现。在这次实验中,我真切体会到了做出一个小游戏、一个有完整代码能运行的程序的不易,期间遇到了许多小问题,在这里就不一一赘述了(我觉得实验难度对我来说不亚于上一次套接字实验)。但是当你的程序能够成功运行时,一切的烦恼都随风而散,只剩下了喜悦与开心。并且在综合实验中,我也复习并学会了很多新的知识,比如,加入pygame库,加入背景音乐,使用python自带的海龟库画图,用键盘控制人物移动,选择关卡等。
这个推箱子小游戏还有许多可以改进的地方,比如,重返上一步,计算走动的步数,所用的时间,在小游戏中加一个排行榜,根据玩家喜好来选择人物以及背景等。由于本人能力有限,更高级的功能暂时还没有实现 (*/ω\*)。所以我准备这个暑假继续我的实验四,把它做成一个高级版的推箱子小游戏,并且推荐给我的同学朋友们来试玩,并根据他们的意见来不断改进,学习就是这样,不断遇到bug,不断解决bug,取长补短,这样才能走的远。 get!٩( 'ω' )و
3.课程建议
这次实验需要用到华为云服务器,但是在之前的实验中都没有用到,第一次上手的我遇到了很多从未设想过的问题,解决起来也感觉很麻烦(这次实验中遇到的问题基本上都是关于华为云服务器的)。希望老师在之前的几次实验中就让我们使用华为云虚拟机进行实验,这样在最后一次实验中就不会过于突兀,我们也能提高实验的效率。
感觉最后几次课程老师讲的进度好快,没太能跟上进度(捂脸),希望老师速度能稍微买一些,可以给我们布置一些课后小练习之类的,让我们能够融会贯通,更好理解所学知识。
王老师讲课超有自己的风格,特别幽默有趣,课堂气氛也十分活跃,很受同学们的欢迎,当然也很认真负责,我问老师的一些比较简单的问题,老师都会耐心作答。如果下学期还有老师开的选修课,我也还会继续选修的。最后感谢老师这一学期带领我们学习了python,我收获颇丰 Thanks♪(・ω・)ノ!
愿此行山高路远,未来还能与君相见!ᕦ(・ㅂ・)ᕤ
五、参考资料
(1条消息) Putty + Xming实现远程登陆Linux显示图形化界面_拨开迷雾丶见云天的博客-CSDN博客_putty 图形化界面
(1条消息) Xming + PuTTY 在Windows下远程Linux主机使用图形界面的程序_mkhgg的博客-CSDN博客
(1条消息) python问题 Traceback (most recent call last)_叶片儿的博客-CSDN博客
(1条消息) 【python】错误SyntaxError: invalid syntax的解决方法总结_Heaphaestus,RC的博客-CSDN博客_invalid syntax
(1条消息) Python“Non-ASCII character 'xe5' in file”报错问题_zhihua_bupt的博客-CSDN博客
(1条消息) 华为鲲鹏云服务器上安装Python-3.6.2并安装第三方库详细步骤_半树海棠的博客-CSDN博客_华为云安装python
(1条消息) Pygame入门(3)播放背景音乐与音效_weixin_42416449的博客-CSDN博客_pygame背景音乐
p.s. CSDN是真的好用!
p.p.s. 人生苦短,我用python!!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!