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!!!

posted @   huiglibn  阅读(71)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示