20192221 实验四 Python综合实践 实验报告

20192221 2019-2020-2 《Python程序设计》实验四报告

课程:《Python程序设计》
班级:1922班
姓名:叶蕊馨
学号:20192221
实验教师:王志强老师
实验日期:2020年6月9日
必修/选修: 公选课

实验内容选择

Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。

1.实验内容

python利用pygame进行简单的游戏开发(打砖块)

2. 实验过程及结果

1.功能划分

1)显现一个屏幕

  • 1.导入所需模块
  • 2.画出屏幕,并添加进主循环内



    (如果点击关闭窗口,即关闭)

2)画一个小球在屏幕上移动

  • 1.画出小球
  • 2.小球的运动参数
  • 3.主循环中小球的运动

3)碰到边缘要能够反弹

  • 边缘碰撞检测

4)挡板绘制和移动

  • 绘制

  • 挡板的移动

5)砖块的绘制

  • 初始化砖块数组
  • 绘制

6)游戏流程和控制逻辑

  • 1.把砖块打破
  • 2.被挡板挡住才返回,落没挡住则要减少一条生命
  • 3.生命用完了则Game Over



7)绘制文字显示游戏信息

完整代码

import pygame,random
import sys
import time
from pygame.locals import *
#界面长度宽度定义
width = 640
hight = 480
#界面颜色定义
backcolor = (230,230,230)
#游戏状态、属性常量定义
state_init = 0
stata_level = 1
state_run = 2
state_gameover = 3
state_shutdown = 4
state_exit = 5
fps = 25
#游戏状态
game_state = state_init
blocks = []
life_left = 1
game_over = False
blocks_hit = 0
#挡板和位置颜色
paddle = {'rect':pygame.Rect(0,0,32,8),
          'color':(128,64,64)}
#挡板的运动控制
paddle_move_left = False
paddle_move_right = False
#小球的位置和速度
ball_x = 0
ball_y = 0
ball_dx = 0
ball_dy = 0
#界面初始化
pygame.init()
mainClock = pygame.time.Clock()
surface = pygame.display.set_mode((width, hight), 0, 32)
pygame.display.set_caption('打砖块')
#初始化砖块数组
def InitBlocks():
    blocks = [[1] * 8] * 6
    return blocks
#检测小球与挡板是否碰撞
def ProcessBall(blocks, ball_x, ball_y, paddle):
    if (ball_y > hight//2):
        if (ball_x+4 >= paddle['rect'].left and \
            ball_x-4 <= paddle['rect'].left+32 and \
            ball_y+4 >= paddle['rect'].top and \
            ball_y-4 <= paddle['rect'].top+8):
            return None
#显示文字
def DrawText(text, font, surface, x, y):
    text_obj = font.render(text, 1, (255, 255, 255))
    text_rect = text_obj.get_rect()
    text_rect.topleft = (x, y)
    surface.blit(text_obj, text_rect)
#退出游戏
def Terminate():
    pygame.quit()
    sys.exit()
#等待用户输入
def WaitForPlayerToPressKey():
    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                Terminate()
            if event.type == KEYDOWN:
                if event.key == K_ESCAPE:
                    Terminate()
                return
game_start_font = pygame.font.SysFont(None, 48)
game_over_font  = pygame.font.SysFont(None, 48)
text_font       = pygame.font.SysFont(None, 20)
pygame.display.update()
WaitForPlayerToPressKey()

while True:
    #界面设置
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            exit()
    #事件监听
        if event.key == K_LEFT:
            paddle_move_left = True
        if event.key == K_RIGHT:
            paddle_move_right = True
        if event.type == KEYUP:
            if event.key == K_LEFT:
                paddle_move_left = False
            if event.key == K_RIGHT:
                paddle_move_right = False
    #游戏控制流程
    if game_state == state_init:
        # 初始化游戏
        ball_x = random.randint(8, width - 8)
        ball_y = (hight//2)
        ball_dx = random.randint(-3, 4)
        ball_dy = random.randint(5, 8)

        paddle['rect'].left = (width/2 - 16)
        paddle['rect'].top = (hight - 32)

        paddle_move_left = False
        paddle_move_right = False
        #life_left = TOTAL_LIFE
        game_over = False
        blocks_hit = 0
        level = 1
        game_state = stata_level
        #新的一关

    elif game_state == stata_level:
        blocks = InitBlocks()
        game_state = state_run

    elif game_state == state_run:
        # 游戏运行

        # 球的运动
        ball_x += ball_dx;
        ball_y += ball_dy;

        if ball_x > (width - 4) or ball_x < 4:
            ball_dx = -ball_dx
            ball_x += ball_dx;
        elif ball_y < 4:
            ball_dy = -ball_dy
            ball_y += ball_dy
        elif ball_y > hight - 4:
            if life_left == 0:
                game_state = state_gameover
            else:
                life_left -= 1
                # 初始化游戏
                ball_x = paddle['rect'].left + 32 // 2
                ball_y = (hight//2)
                ball_dx = random.randint(-4, 5)
                ball_dy = random.randint(6, 9)
        #检测球与挡板是否碰撞
        if ball_y > hight // 2:
            if (ball_x + 4 >= paddle['rect'].left and \
                    ball_x - 4 <= paddle['rect'].left + 32 and \
                    ball_y + 4 >= paddle['rect'].top and \
                    ball_y - 4 <= paddle['rect'].top + 8):
                ball_dy = - ball_dy
                ball_y += ball_dy
                if paddle_move_left:
                    ball_dx -= random.randint(0, 3)
                elif paddle_move_right:
                    ball_dx += random.randint(0, 3)
                else:
                    ball_dx += random.randint(-1, 2)
        #检测球与砖块是否碰撞
        cur_x = 8
        cur_y = 8
        for row in range(6):
            cur_x = 8
            for col in range(8):
                if blocks[row][col] != 0:
                    if (ball_x + 4 >= cur_x and \
                            ball_x - 4 <= cur_x + 64 and \
                            ball_y + 4 >= cur_y and \
                            ball_y - 4 <= cur_y + 16):
                        blocks[row][col] = 0
                        blocks_hit += 1
                        ball_dy = -ball_dy
                        ball_dx += random.randint(-1, 2)
                        #score += 5 * (level + abs(ball_dx))
                cur_x += 80
            cur_y += 32
        if blocks_hit == 6 * 8:
            level += 1
            blocks_hit = 0
            game_state = stata_level
        #挡板的运动
        if paddle_move_left:
            paddle['rect'].left -= 8
            if paddle['rect'].left < 0:
                paddle['rect'].left = 0
        if paddle_move_right:
            paddle['rect'].left += 8
            if paddle['rect'].left > width - 32:
                paddle['rect'].left = width - 32
        #绘制背景
        surface.fill(backcolor)
        #绘制挡板
        pygame.draw.rect(surface, paddle['color'], paddle['rect'])
        #绘制小球
        pygame.draw.circle(surface,(0,0,255), (ball_x, ball_y), 4, 0)
        #绘制砖块
        cur_x = 8
        cur_y = 8
        for row in range(6):
            cur_x = 8
            for col in range(8):
                if blocks[row][col] != 0:
                    pygame.draw.rect(surface, (255,128,0),(cur_x, cur_y, 64, 16))
                cur_x += 80
            cur_y += 32
        #文字信息绘制
        message = '    Life: ' + str(life_left)
        DrawText(message, text_font, surface, 8, (hight - 16))
    elif game_state == state_gameover:
        DrawText('GAME OVER', game_over_font, surface,
                 (width / 3), (hight / 3))
        DrawText('Press any key to play again.', game_over_font, surface,
                 (width / 3) - 80, (hight / 3) + 150)
        pygame.display.update()

        pygame.mixer.music.stop()

        WaitForPlayerToPressKey()
        game_state = state_init

    elif game_state == state_shutdown:
        game_state = state_exit
    pygame.display.update()
    mainClock.tick(30)

2.运行

[运行视频](https://www.bilibili.com/video/BV1YA411v7xV) ###3.git代码 [点击跳转至码云](https://gitee.com/ye_ruixin/python2020/blob/%E4%BD%9C%E4%B8%9A/%E6%B8%B8%E6%88%8F%E5%BC%80%E5%8F%91.py) ## 3. 实验过程中遇到的问题和解决过程 - 问题1:小球、挡板、砖块等绘制的参数不太确定 - 问题1解决方案: 找到pygame官网,根据基础数值反复尝试,找到适合在打砖块游戏里显示的大小数值 - 问题2:打到砖块后砖块消失的判断方式纠结 - 问题2解决方案: 最后还是使用一组砖块碰撞消失的方式,检测小球与砖块是否碰撞

其他(感悟、思考等)

*1.课程总结
这次的python学习包含序列、文件操作、网络编程、GUI、模块、爬虫以及其它基础知识点,对我c语言的学习也有很大的帮助,通过python的学习,了解到一些编程语言的思想,尤其是因为这学期的特殊情况,这门课比c语言先开一周,于是先一步了解编程方面的知识,对我后续c语言的学习先行掀开一角,会更加轻松。王志强老师也尽心尽责,出现问题先自己尝试解决的方法也让我获益匪浅。(要善用搜索引擎)

  • 2.课程感想体会
    经过这一特殊学期的学习,掌握了不少python编程技巧,从最开始对编程一窍不通(因为初高中完全没有接触过这一类的学习),到现在的综合实践都能成功写出一个简单的小游戏
    ,都是这一学期积累的知识点,从hello world一步步的学习中,踩入计算机的大门;从不知道怎么解决问题,到善于自己网上查找答案。我相信这对于我后续的学习也会有很大的帮助。刚选课的时候学长学姐们都很推荐王志强老师的课,选上后也觉得不虚此行。而对于我这个计算机专业的来说,多学一门语言相信以后对我的帮助会很大。
  • 3.意见和建议
    因为是网上授课的缘故最开始老师采用的方式是自己找时间看视频,但后来直接上直播课对我来说可能效果会更好。
    建议:
    希望如果有多余时间可以课上拓宽一下,讲一些比较复杂一点的例子。
posted @ 2020-06-09 16:00  Jxxxco  阅读(628)  评论(1编辑  收藏