zoukankan      html  css  js  c++  java
  • 20192416 实验四《Python程序设计》综合实践报告

    20192416 实验四 《Python程序设计》 综合实践报告

    课程:《Python程序设计》
    班级:1924
    姓名:不愿透露姓名的はんたくさん
    学号:20192416
    实验教师:王志强老师
    实验日期:2020年6月11日
    必修/选修: 公选课

    1.实验分析

    相较之下个人对游戏比较感兴趣,于是选择了趣味性较强且容易上手的pygame作为综合实践的内容。
    通过观看嵩天教授的视频进行自学,在事件处理机制中学会了通过键盘、鼠标进行交互以及时间的计算方法。
    于是想把所学到的结合起来,制作一个可以通过键盘与鼠标操纵、并根据通关时间结算最终得分的小游戏,恰好想起上次考科目三没过,于是以考试线路为地图进行制作。

    2.实验设计

    第一步:设计地图

    这里以科目三考试线路为原型,最终得出了一个1400×900的地图
    将障碍分为横竖两类,分别导入各自的位置上。

    第二步:操纵小飞船

    键盘上通过KEYDOWN、KEYUP事件实现小飞船的加速减速
    鼠标通过MOUSEBUTTONDOWN、MOUSEBUTTONUP以及MOUSEMOTION事件使小飞船能在鼠标按下的时候随鼠标移动
    这是小飞船:

    第三步:判断失败及成功条件

    失败条件判断:既小飞船与障碍重合时,可以通过循环分别判断各个障碍是否与小飞船有重合部分
    成功条件判断:当小飞船完全进入右下方区域时成功
    位置判断用.left .right 等属性进行分析

    第四步:结果

    成功与失败都有各自的图片出现在屏幕中央,点击图片退出游戏,退出前打印游戏结果
    图片的点击利用MOUSEBUTTONDOWN事件的.button属性判断左键的按下。
    .pos[]返回的鼠标位置在图片范围内来确定游戏的退出。
    循环中递增的num值计算当前时间以计算得分。

    3.实验内容

    • 爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
    • 我选择用pygame制作了一个飞船小游戏

    4. 实验过程及结果

    功能

    • 飞船小游戏
    • 能通过键盘和鼠标操控飞船
    • 碰到障碍则失败,弹出失败图片,点击图片退出游戏
    • 到达右下角的终点则成功,弹出成功图片,点击图片退出游戏
    • 根据通关的时间决定分数

    代码

    import pygame,sys                              #将pygame库导入到python程序中
    from pygame.locals import *                #然后需要引入pygame中的所有常量
    pygame.init()                              #初始化
    size = width,height = 1400,900
    screen = pygame.display.set_mode(size)      #定义窗口大小
    pygame.display.set_caption("我的第一个pygame")     #设置窗口标题
    speed = [0,0]                              #初始速度
    nspeed = [0,5]
    WHITE = 255,255,255
    num = 0
    n = 0
    n1 = 33                                    #障碍数
    n2 = 39
    still = False                               #以上均为对各变量的初始定义
    
    car = pygame.image.load(r'D:/abiancheng/. python/tu/car.jpg')
    lose = pygame.image.load(r'D:/abiancheng/. python/tu/lose.jpg')
    win = pygame.image.load(r'D:/abiancheng/. python/tu/win.gif')
    mod = {}                                                                 #导入障碍物的图像
    mod[0] = pygame.image.load(r'D:/abiancheng/. python/tu/横障碍.png')       #横障碍物
    mod[1] = pygame.image.load(r'D:/abiancheng/. python/tu/竖障碍.png')       #竖障碍物
    
    carrect = car.get_rect()                  #返回矩形图像
    carrect = carrect.move(10,420)
    loserect = lose.get_rect()
    loserect = loserect.move(1000,1000)
    winrect = win.get_rect()
    winrect = winrect.move(1000,1000)                    
    fps = 50
    fclock = pygame.time.Clock()
    HENG = {}
    i=0
    while i<=n1:
        HENG[i] = mod[0].get_rect()
        i+=1
    SHU = {}
    i=0
    while i<=n2:
        SHU[i] = mod[1].get_rect()
        i+=1
    i = 0
    while i<=8:
        HENG[i] = HENG[i].move((i+1)*100,0)             
        i+=1
    while i<=13:
        HENG[i] = HENG[i].move((i-6)*100,100)
        i+=1
    while i<=18:
        HENG[i] = HENG[i].move((i-11)*100,200)
        i+=1
    HENG[19] = HENG[19].move(0,400)
    HENG[20] = HENG[20].move(0,500)
    i = 21
    while i<=24:
        HENG[i] = HENG[i].move((i-11)*100,700)
        i+=1
    while i<=30:
        HENG[i] = HENG[i].move((i-17)*100,895)
        i+=1
    while i<=33:
        HENG[i] = HENG[i].move((i-21)*100,800)
        i+=1
    i=0
    while i<=3:
        SHU[i] = SHU[i].move(100,i*100)
        i+=1
    while i<=7:
        SHU[i] = SHU[i].move(100,(i+1)*100)
        i+=1
    while i<=13:
        SHU[i] = SHU[i].move(200,(i-6)*100)
        i+=1
    while i<=20:
        SHU[i] = SHU[i].move(300,(i-12)*100)
        i+=1
    while i<=27:
        SHU[i] = SHU[i].move(800,(i-19)*100)
        i+=1
    while i<=32:
        SHU[i] = SHU[i].move(900,(i-26)*100)
        i+=1
    while i<=39:
        SHU[i] = SHU[i].move(1000,(i-33)*100)
        i+=1
                                                #以上均为各单位的初始位置设置
    while True:                                 #无限循环,直到游戏结束时退出
        for event in pygame.event.get():        #从pygame的事件队列中取出事件,并从队列中删除该事件
            if event.type == pygame.QUIT:       #pygame.QUIT是pygame中定义的事件常量
                sys.exit()                      #用于退出结束游戏并退出
            elif event.type == pygame.KEYDOWN:  #键盘的松放进行对应方向速度的增加
                if event.key == pygame.K_LEFT:
                    speed[0] = speed[0] - 1
                elif event.key == pygame.K_RIGHT:
                    speed[0] = speed[0] + 1 
                elif event.key == pygame.K_UP:
                    speed[1] = speed[1] - 1 
                elif event.key == pygame.K_DOWN:
                    speed[1] = speed[1] + 1
            elif event.type == pygame.KEYUP:
                if event.key == pygame.K_LEFT:
                    speed[0] = speed[0] - 1
                elif event.key == pygame.K_RIGHT:
                    speed[0] = speed[0] + 1 
                elif event.key == pygame.K_UP:
                    speed[1] = speed[1] - 1 
                elif event.key == pygame.K_DOWN:
                    speed[1] = speed[1] + 1
            elif event.type == pygame.MOUSEBUTTONDOWN:      #鼠标控制小飞船移动
                if event.button == 1:
                    still = True
            elif event.type == pygame.MOUSEBUTTONUP:
                still = False
                if event.button == 1:
                    carrect = carrect.move(event.pos[0] - carrect.left - 20,event.pos[1] - carrect.top - 20)
            elif event.type == pygame.MOUSEMOTION:
                if event.buttons[0] == 1:
                    carrect = carrect.move(event.pos[0] - carrect.left - 20,event.pos[1] - carrect.top - 20)
        num +=1
        i = 0
        while i <= n2:                                      #判断是否碰到障碍
            if carrect.left<SHU[i].left and carrect.right>SHU[i].right and ((carrect.top>SHU[i].top and carrect.top<SHU[i].bottom) or (carrect.bottom>SHU[i].top and carrect.bottom<SHU[i].bottom)):
                speed[0]=speed[1]=0
                loserect = lose.get_rect()
                loserect = loserect.move(500,250)
                screen.blit(lose,loserect)
                if event.type == pygame.MOUSEBUTTONDOWN:
                    if event.button == 1:
                        if event.pos[0] > loserect.left and event.pos[0] < loserect.right  and event.pos[1] > loserect.top  and event.pos[1] < loserect.bottom:
                            print("lose")
                            sys.exit()
            i +=1
        i = 0
        while i <= n1:
            if carrect.top<HENG[i].top and carrect.bottom>HENG[i].bottom and ((carrect.right>HENG[i].left and carrect.right<HENG[i].right) or (carrect.left>SHU[i].left and carrect.left<SHU[i].right)):
                speed[0]=speed[1]=0
                loserect = lose.get_rect()                 
                loserect = loserect.move(500,250)
                screen.blit(lose,loserect)
                if event.type == pygame.MOUSEBUTTONDOWN:
                    if event.button == 1:
                        if event.pos[0] > loserect.left and event.pos[0] < loserect.right  and event.pos[1] > loserect.top  and event.pos[1] < loserect.bottom:
                            print("you lose")
                            sys.exit()
            i +=1
        if carrect.left>1300 and carrect.right<1400 and carrect.top>700 and carrect.bottom<900:         #判断是否进入目标区域
            speed[0]=speed[1]=0
            winrect = win.get_rect()                  
            winrect = winrect.move(600,350)
            screen.blit(win,winrect)
            if event.type == pygame.MOUSEBUTTONDOWN:
                if event.button == 1:
                    if event.pos[0] > winrect.left and event.pos[0] < winrect.right  and event.pos[1] > winrect.top  and event.pos[1] < winrect.bottom:
                        print("you win")
                        if num>1000:
                            print("score:0/1000")
                        else:
                            print("score:",1000-num,"/1000")
                        sys.exit()
        carrect = carrect.move(speed[0],speed[1])                  #车的惯性移动
        if carrect.left < 0 or carrect.right >               #车的碰壁反弹
            speed[0]=-speed[0] 
        if carrect.top < 0 or carrect.bottom > height:
            speed[1]=-speed[1] 
        screen.fill(WHITE)                                         #屏幕刷新
        screen.blit(car,carrect)
        screen.blit(lose,loserect)
        screen.blit(win,winrect)
        i=0
        while i<=n1:
            screen.blit(mod[0],HENG[i])
            i+=1
        i=0
        while i<=n2:
            screen.blit(mod[1],SHU[i])
            i+=1
        pygame.display.update()             #刷新显示窗口
        fclock.tick(fps)
    

    实验结果截图

    以及

    3. 实验过程中遇到的问题和解决过程

    • 问题1:边界判定比较复杂
    • 问题1解决方案:冷静分析
    • 问题2:导入图片失败
    • 问题2解决方案:通过上网查找以及视频弹幕得知pygame.image.load()括号中填r+"绝对路径"
    • 问题3:成功及失败时,最后的图片没有显示出来
    • 问题3解决方案:经过数次尝试,发现要及时刷新屏幕,不然图片是无法出现的。屏幕的刷新是pygame的核心部分。

    课程感想体会

    上了王老师的课的第一感受就是王老师的教学水平很高,总是能将复杂晦涩抽象的东西简单化,让我们对其有更加深入的理解。此外,王老师也总是和学生们打成一片,和学生对发表情包的老师又有谁不爱呢?至于我自身的学习方面,因为大一上学期的自学python让我有了一定基础,在课程前期的学习中比较轻松。但随着学习内容的深入,我开始渐渐有些难以跟上老师教学的步伐了。由于基础不够扎实,总是会遇到各种各样的问题,虽然云班课中的教学资源非常充足,但过多的视频学习资源同时让人生畏,难以提起学习积极性来。在上课时,我总觉得有些知识点还没弄透就学到了下一章节,对于基础不好的同学不够友好。所以我建议老师开设单双学期的课程,单学期教授基础课程,双学期教授提高课程,让萌新与大佬分隔开来,各取所需。即便如此学习的路程磕磕绊绊,我依然还是随着老师的脚步,对python各个方面的内容都进行了一定方面的学习,尤其是网络编程技术与网络爬虫,给我打开了新世界的大门,感谢王老师的辛勤付出及一个学期的陪伴。

  • 相关阅读:
    JSON Web令牌(JWT)
    CSRF跨站点请求伪造(Cross—Site Request Forgery)
    logging模块
    Django中使用Celery
    第一坑 先引入jQuery ./引入
    CSS 入门
    超大型文件传输方案 + socket + subprocess popen 远程执行系统命令
    MYSQL的执行计划 事务处理 和 跑路
    mysql 存储过程
    Django中CBV View的as_view()源码解析
  • 原文地址:https://www.cnblogs.com/hantaku/p/13096288.html
Copyright © 2011-2022 走看看