基于python的小游戏毕业设计,pygame小游戏实验报告

本篇文章给大家谈谈关于python小游戏的毕业论文,以及基于python的小游戏毕业设计,希望对各位有所帮助,不要忘了收藏本站喔。

摘要

本次Python语言程序设计主要使用了Python中的Pygame模块创建了一个简单的又充满童年回忆的游戏——贪吃蛇。编写这个游戏用到了一个游戏都具备有的框架,在这个贪吃蛇的游戏中,游戏窗口里会随机生成目标小方块作为贪吃蛇的食物,通过键盘的上下左右的按键控制贪吃蛇的方向去“吃”食物,每“吃”进一个食物就会增加分数,并显示在界面右上方,同时还设置了最高得分,显示在界面的顶端python编程代码看不懂怎么办。当贪吃蛇接触到界面的边缘,游戏结束,弹出“Play Again”的按钮,玩家可以选择重新开始游戏或者退出游戏,重新开始游戏将保持最高分纪录直至打破。

1.引言

    在通过一学期的Python学习之后,我初步的了解到Python的语法以及它在各方面的应用:Web 和 Internet开发、科学计算和统计、人工智能、桌面界面开发、软件开发、后端开发、网络爬虫等。Python相对于其他语言更为简洁易懂,有严格的格式要求,在接触Python时是通过小游戏开始的,所以在本次Python的期末项目中,我使用了Pygame模块编写了一个经典贪吃蛇的游戏。

Pygame是被设计用来写游戏的Python模块集合,Pygame是在优秀的SDL库之上开发的功能性包。使用Python可以导入Pygame来开发具有全部特性的游戏和多媒体软件,Pygame是极度轻便的并且可以运行在几乎所有的平台和操作系统上。Pygame包已经被下载过成千上万次,并且也被访问过成千上万次。可见Pygame是多受人欢迎,虽然使用Python做游戏项目并不是Python的主要作用,但是是初学者用来进一步掌握Python的不错的选择, Python的循环语句,条件语句,以及面向对象编程在一个游戏项目中都需要用到,熟悉掌握这些之后,对以后在其他方面的应用奠定了基础。

本次论文介绍了我编写游戏项目——贪吃蛇的过程,详细介绍了这个项目的架构,各个函数,实现方法,以及编写完成后如何操作和演示结果。

关键字:Python,Pygame,面向对象,贪吃蛇

2.系统结构

2.1 设计框架

每一个项目都拥有它的设计框架,图1为贪吃蛇的设计框架:

图1 贪吃蛇的设计框架

  • 相关设置:里面包含了这个游戏中所需要的固定设置,方便下面的函数调用;
  • 初始化:初始化Pygame这个游戏库;
  • 欢迎信息:运行程序后出现的界面,包含“Play”的按钮,点击能开始游戏;
  • 游戏运行主体:开始游戏后进入的循环;

④-① 蛇、食物的位置初始化:对这些位置进行初始化;

④-② 监听键盘、移动蛇位置:通过对键盘的监听,控制蛇的运动;

④-③ 判断游戏状态:如果触发死亡,则结束游戏,没有则继续游戏;

④-④ 分数更新:蛇的长度增加则分数更新;

④-⑤ 更新画面:蛇每次移动都更新一次画面;

⑤  结束信息:触发死亡游戏结束时出现的界面,包含“Play Again”的按钮,点击重新进入游戏循环。

2.2 程序流程图

        图2所示为贪吃蛇游戏的程序流程图

图2 贪吃蛇游戏的程序流程图

3.实现代码

        代码实现按照设计框架分为五大部分,其中第四部分游戏主体分五小部分介绍。

   3.1 相关设置

        定义颜色的设置和游戏界面的大小

图3

   3.2 初始化

        初始化Pygame游戏库,定义变量控制游戏速度以及最高得分初始化。创建游戏窗口。

图4

   3.3 欢迎信息

        定义一个show_start_info函数,里面包含了“Play”按钮的定义,并使按钮在屏幕中央显示出来,还设置了鼠标监听事件,当按下按钮之后,结束函数,游戏开始。

图5

图6

图7

   3.4 游戏运行主体

3.4.1 蛇、食物的位置初始化

设定蛇和食物在屏幕上的初始化位置,以及蛇的初始化方向。

图8

3.4.2 监听键盘、移动蛇位置

设置一个循环,监听键盘的按键是否按下,通过设定各按键对应的方向,控制蛇头的方向改变。

图9

图10

3.4.3 判断游戏状态

判断蛇头是否与目标方块重合,是则继续游戏,如果蛇头碰触到屏幕边缘,则结束游戏。

图11

图12

3.4.4 分数更新

设定一个draw_score和一个draw_high_score函数表示在屏幕上绘制分数。在main函数中调用此函数。

图13

图14

图15

3.4.4 更新画面

图16

   3.4 结束信息

在触发游戏结束的条件后,出现游戏结束的界面。

图17

图18

   3.4 完整代码

# 导入程序所需要的模块

import pygame

import random

import sys

from pygame.locals import *

# 定义颜色的变量

# 目标方块的颜色 红色

redColour = pygame.Color(255, 0, 0)

# 背景颜色 黑色

blackColour = pygame.Color(0, 0, 0)

# 贪吃蛇的颜色 白色

whiteColour = pygame.Color(255, 255, 255)

#游戏界面大小

windows_width = 800

windows_height = 600

# 定义游戏结束的函数

def gameOver():

    pygame.quit()

    sys.exit()

# 主函数

def main():

    # 初始化Pygame这个游戏库

    pygame.init()

    # 定义一个变量控制游戏的速度

    fpsClock = pygame.time.Clock()

    # 创建一个窗口 图形界面

    playSurface = pygame.display.set_mode((windows_width, windows_height))

    pygame.display.set_caption("贪吃蛇")  #游戏名称写在窗口标题

    # 初始化最高分(不可修改)

    high_score = 0

    show_start_info(playSurface)               #打印欢迎信息

    while True:

        # 初始化变量

        # 贪吃蛇起始坐标位置(100,100)

        snakePosition = [100, 100]

        snakeBody = [[100, 100], [80, 100], [60, 100]]

        # 目标方块的起始位置

        targetPosition = [300, 300]

        # 目标方块的标记 目的:用来判断是否吃掉了这个目标方块

        targetflag = 1

        # 初始化方向--> 往右

        direction = 'right'

        # 定义一个方向变量

        changeDirection = direction

        while True:

            for event in pygame.event.get():

                if event.type == QUIT:

                    pygame.quit()

                    sys.exit()

                elif event.type == KEYDOWN:

                    if event.key == K_RIGHT:

                        changeDirection = 'right'

                    if event.key == K_LEFT:

                        changeDirection = 'left'

                    if event.key == K_UP:

                        changeDirection = 'up'

                    if event.key == K_DOWN:

                        changeDirection = 'down'

                        # 对应该键盘上的Esc键

                    if event.key == K_ESCAPE:

                        pygame.event.post(pygame.event.Event(QUIT))

            # 确定方向

            if changeDirection == 'left' and not direction == 'right':

                direction = changeDirection

            if changeDirection == 'right' and not direction == 'left':

                direction = changeDirection

            if changeDirection == 'up' and not direction == 'down':

                direction = changeDirection

            if changeDirection == 'down' and not direction == 'up':

                direction = changeDirection

            # 根据方向移动蛇头坐标

            if direction == 'right':

                snakePosition[0] += 20

            if direction == 'left':

                snakePosition[0] -= 20

            if direction == 'up':

                snakePosition[1] -= 20

            if direction == 'down':

                snakePosition[1] += 20

            # 增加蛇的长度

            snakeBody.insert(0, list(snakePosition))

            # 如果我们贪吃蛇的位置和目标方块的位置重合了 目标方块的标记为0

            if snakePosition[0] == targetPosition[0] and snakePosition[1] == targetPosition[1]:

                targetflag = 0

            else:

                snakeBody.pop()

            if targetflag == 0:

                # 随机生成目标方块

                x = random.randrange(1, 32) 

                y = random.randrange(1, 24)

                targetPosition = [int(x * 20), int(y * 20)]

                targetflag = 1

            playSurface.fill(blackColour)  # 填充背景为黑色

            for position in snakeBody:

                # 在屏幕上创建一条蛇

                pygame.draw.rect(playSurface, whiteColour, Rect(position[0], position[1], 20, 20))

                # 在屏幕上创建目标方块             

                pygame.draw.rect(playSurface, redColour, Rect(targetPosition[0], targetPosition[1], 20, 20))

            pygame.display.flip()

           

            # 显示得分信息

            score = len(snakeBody) * 50 - 150

            draw_score(playSurface, score)

            draw_high_score(playSurface, high_score)

            # 出现更高分数把分数更新

            if score > high_score:

                high_score = score

           

            pygame.display.update()

            

            # 游戏结束

            if snakePosition[0] > 800 or snakePosition[0] < 0:

                break

            elif snakePosition[1] > 600 or snakePosition[1] < 0:

                break

           

            # 控制游戏速度

            fpsClock.tick(8)

       

        # 显示再玩一次按钮   

        show_gameover_info(playSurface)

def show_start_info(playSurface):

    #设置按钮的尺寸和其他属性

    width, height = 200,50

    button_color = pygame.Color(0, 255, 0)

    text_color = pygame.Color(255, 255, 255)

    font = pygame.font.SysFont(None, 48)

   

    #创建按钮的rect对象,并使其居中

    rect = pygame.Rect(0, 0, width, height)

    playSurface_rect = playSurface.get_rect()

    rect.center = playSurface_rect.center

    '''将msg渲染为图像,并使其在按钮上居中'''

    msg = "Play"

    msg_image = font.render(msg, True, text_color, button_color)

    msg_image_rect = msg_image.get_rect()

    msg_image_rect.center = rect.center

     #绘制一个用颜色填充的按钮,再绘制文本

    playSurface.fill(button_color, rect)

    playSurface.blit(msg_image, msg_image_rect)

    pygame.display.update()

    while True:  #鼠标监听事件

        for event in pygame.event.get():  # event handling loop

            if event.type == pygame.QUIT:

                gameOver()     #终止程序

            elif event.type == pygame.MOUSEBUTTONDOWN:

                mouse_x, mouse_y = pygame.mouse.get_pos()

                return #结束此函数, 开始游戏

def show_gameover_info(playSurface):

    #设置按钮的尺寸和其他属性

    width, height = 200,50

    button_color = pygame.Color(0, 255, 0)

    text_color = pygame.Color(255, 255, 255)

    font = pygame.font.SysFont(None, 48)

   

    #创建按钮的rect对象,并使其居中

    rect = pygame.Rect(0, 0, width, height)

    playSurface_rect = playSurface.get_rect()

    rect.center = playSurface_rect.center

    '''将msg渲染为图像,并使其在按钮上居中'''

    msg = "Play Again"

    msg_image = font.render(msg, True, text_color, button_color)

    msg_image_rect = msg_image.get_rect()

    msg_image_rect.center = rect.center

     #绘制一个用颜色填充的按钮,再绘制文本

    playSurface.fill(button_color, rect)

    playSurface.blit(msg_image, msg_image_rect)

    pygame.display.update()

    while True:  #键盘监听事件

        for event in pygame.event.get():  # event handling loop

            if event.type == pygame.QUIT:

                gameOver()     #终止程序

            elif event.type == pygame.MOUSEBUTTONDOWN:

                mouse_x, mouse_y = pygame.mouse.get_pos()

                return #结束此函数, 开始游戏

   

def draw_score(playSurface, score):

    #显示得分信息时使用的字体设置

    text_color = pygame.Color(255, 255, 255)

    font = pygame.font.SysFont(None, 48)

    '''将得分转换为一幅渲染的图像'''

    rounded_score = int(round(score, -1))

    score_str = "{:,}".format(rounded_score)

    score_image = font.render(score_str, True, text_color, (0, 0, 0))

    #将得分放在屏幕右上角

    score_rect = score_image.get_rect()

    playSurface_rect = playSurface.get_rect()

    score_rect.right = playSurface_rect.right -20

    score_rect.top = 20

    playSurface.blit(score_image, score_rect)

def draw_high_score(playSurface, high_score):

    #显示得分信息时使用的字体设置

    text_color = pygame.Color(255, 255, 255)

    font = pygame.font.SysFont(None, 48)

    '''将得分转换为一幅渲染的图像'''

    rounded_high_score = int(round(high_score, -1))

    high_score_str = "{:,}".format(rounded_high_score)

    high_score_image = font.render(high_score_str, True, text_color, (0, 0, 0))

    #将得分放在屏幕顶端

    high_score_rect = high_score_image.get_rect()

    playSurface_rect = playSurface.get_rect()

    high_score_rect.right = playSurface_rect.centerx

    high_score_rect.top = high_score_rect.top

    playSurface.blit(high_score_image, high_score_rect)

#  启动程序

if __name__ == '__main__':

    main()

4.实验

运行程序,首先进入开始信息界面:

图19

点击“Play”按钮进入游戏

图20

通过键盘↑↓←→键控制蛇的方向,每次触碰到目标方块,蛇的长度增加1,原来的目标方块消失,并随机再在屏幕上生成,分数加50分。

图21

当蛇头触碰到屏幕边缘,游戏停止,显示游戏结束信息

图22

点击”PlayAgain”重新开始游戏,最高得分不会重置

图23

5.总结和展望

本次使用Python中的Pygame模块设计了经典的贪吃蛇小游戏,实现了这个游戏的基本功能,操作蛇也比较灵敏,目标方块也及时在原来的消失之后随机再出现,能够看到分数也能够刷新最高得分,具有一定的可玩性。但游戏的功能还可以进一步完善,比如增加音效和更多选项改变蛇和食物的外观等,使游戏更加美观,更加有吸引力和趣味性,在以后的学习中希望能对这个游戏进行完善。

Python的应用范围很广,做游戏也只是它其中小小的用途,在今后对Python的继续深入学习之后,应该拓展学习它在其他方面的应用,使用Python做更多的有用的项目,为科技发展出一份力。

参考文献:

[1]《Python编程:从入门到实践》 作者:[美] Eric Matthes 译者:袁国忠

[2]《中文版Python3教程》

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值