[Python项目]使用Pygame开发贪吃蛇小游戏笔记

Pygame 贪吃蛇

Python贪吃蛇

第一次使用 Markdown编辑器 。如果有什么问题请留言。这是学习传智播客博学谷Python项目实战贪吃蛇小游戏时写的笔记,看的时候没有问老师要课件和源码,为了方便记录,自己跟着视频写了一遍,我的程序中间出现了问题,修改了原视频的代码,会和源码不一样。

1. 规则

开始和结束

  1. 贪吃蛇 初始出现在游戏窗口的左上角位置,体长共有 3节
  2. 游戏过程中,一旦 蛇头撞到了 窗口的边缘或者身体的其他部位,游戏结束
  3. 游戏过程中,点击 游戏窗口的关闭按钮,或者按下 ESC键可以 直接退出游戏
  4. 一局游戏结束后, 按下空格键可以重新开启一局新戏

运动和控制

1.贪吃蛇 初始沿屏幕水平方向,向 右侧运动, 每隔0.5秒移动一节身体
2.使用键盘的方向键(↑、↓、←、→)可以改变蛇头的运动方向,不过需要注意:

  • 当蛇头沿 水平方向运动时, 只能使用垂直方向的方向键将蛇头的 运动方向修改为 垂直方向
  • 当蛇头沿 垂直方向运动时, 只能使用水平方向的方向键将蛇头的 运动方向修改为 *水平方向

3.游戏过程中按下 空格键,可以 暂停游戏;再次按下 空格键,可以 继续游戏

食物和得分

1.游戏开始后,会在 游戏窗口任一随机位置出现 食物

  • 注意:食物不会与蛇身体重叠

2.当 蛇头食物相遇时,代表蛇吃到了食物,此时:

  • 被吃掉的食物从 屏幕上消失
  • 蛇的身体会 增加一节
  • 游戏得分 增加10分
  • 游戏窗口其他任—随机位置再次出现 新的食物, *食物同样不会与蛇身体重叠

3.如果 食物出现的 30秒内,贪吃蛇 没有吃到食物,那么:

  • 没有被吃到的食物 从屏幕上消失
  • 游戏窗口其他任一随机位置再次出现 新的食物, *食物同样不会与蛇身体重叠

4.每 吃掉1颗食物,贪吃蛇的 运动速度会加快:

  • 初始 每隔0.5秒移动—节身体
  • 吃掉1颗食物,移动的 时间间隔缩短50ms,也就是:0.45s、0.40s、0.35s等依次类推
  • 最短的移动 *时间间隔是0.1秒

2. 类的设计和模块准备

类的设计

根据游戏规则,要实现贪吃蛇游戏,一共需要 4种对象,分别是: 游戏对象、蛇对象、食物对象和文字标签对象
游戏对象外,其他 3种对象游戏窗口中的展现效果示意图如下:

[Python项目]使用Pygame开发贪吃蛇小游戏笔记
因此我们可以考虑设计4个类,分别承担不同的职责:
  1. 游戏类(Game):负责提供整个游戏流程控制的相关操作,包括:

  2. 创建游戏主窗口和游戏时钟

  3. 创建并显示游戏元素:蛇、食物、得分标签、提示标签。监听用户交互并做出相应处理

  4. 标签类(Label) :负责提供文本提示信息的相关操作

  5. 食物类(Food) :负责提供食物对象的相关操作
  6. 蛇类(Snake) :负责提供蛇对象相关操作

类图如下:

[Python项目]使用Pygame开发贪吃蛇小游戏笔记

; 模块的确定和装备

根据类的设计,我们可以考虑在 贪吃蛇游戏项目中设计 2个模块,分别是:

  1. game.py 游戏主模块,封装Game类并负责启动游戏
  2. game_items.py 游戏元素模块,封装 Label、Food、Snake类,并定义全局变量
新建项目及文件准备

1.使用 PyCharm新建─个项目:

  • 项目名称: 贪吃蛇
  • 解释器: *Python 3.6

2.在项目中依次建立2个模块: game.py 和 game_items.py

3. 游戏框架搭建

pygame 的初始化和退出

pygame是专为开发电子游戏而设计的跨平台的 Python包。而包中又针对不同的开发需求提供有不同的模块,例如:显示模块、字体模块、混音器模块等等。

注意:在这些模块中,有一部分模块是必须要初始化之后,才能够正常使用的,例如:字体模块等。

pygame 为了程序员更加方便地使用包中的模块,提供有两个方法—— init和quit,其中:

  • init 方法可以 一次性初始化 pygame的所有模块,这样在后续开发中,程序员可以直接使用这些模块,而 不必再单独为某一个模块调用对应的初始化方法
  • quit 方法可以 取消初始化之前已经初始化过的模块

提示,由于Python解释器在退出之前会释放所有的模块,所以quit方法不是必须要调用

要实现 pygame的初始化和退出,需要在game.py模块中实现以下代码:

import pygame
from game_items import*

if _name___ -- '_main__':
    pygame.init()

    pygame.quit()

游戏主窗口

贪吃蛇游戏是一款 图形界面游戏,而所谓的图形界面就是指——程序启动时,首先应该呈现一个 图形化的窗口,所有游戏元素(例如:蛇、食物、得分等)都显示在这个窗口的内部。

pygamedisplay模块提供的一系列方法可以用于 创建游戏窗口以及 更新窗口显示内容等操作。常用方法如下:

序号 方法 说明 1 pygame.display.set_mode() 初始化游戏窗口 2 pygame.display.set_caption() 设计窗口 3 pygame.display.update() 更新屏幕显示内容

创建游戏主窗口方法

使用 set_mode方法,可以非常方便地创建一个游戏主窗口,语法格式如下:

set_mode( resolution=(0, 0),flags=0,depth=0) -> Surface

其中:

  • 参数
  • resolution 指定屏幕的宽和高的元组,默认创建的窗口大小和屏幕大小―致
  • flags 参数指定屏幕的附加选项,例如是否全屏等等,默认使用resolution指定的窗口大小
  • depth 参数表示颜色的位数,默认自动匹配
  • 返回
  • Surface 对象
    • 可以把一个 Surface对象被看作是一个油画的画布,我们可以在这个画布上作画,例如:绘制贪吃蛇、绘制食物、绘制分数文字等
    • 所有游戏元素绘制在游戏的主窗口之后,就是用户看到的游戏画面

注意:必须记录 set_mode方法的返回结果! 因为后续其他的游戏元素都需要绘制在游戏主窗口上。

设置窗口标题方法

使用 set_caption方法,可以设置窗口标题,语法格式如下:

set_caption(title,icontitle = None) -> None

其中:

  • 参数
  • title指定显示在标题栏上的窗口标题
  • icontitle在某些操作系统中,可以指定显示在任务栏上的程序标题,默认与title一致

创建游戏主窗口并设置窗口标题,在game.py 中定义Game类,并且实现初始化方法。

游戏循环和游戏时钟

游戏循环

要做到游戏程序启动执行之后,不会立即退出,需要在游戏程序中增加一个 游戏循环。所谓游戏循环就是个 无限循环
要想让贪吃蛇游戏启动执行之后,不会立即退出,可以在Game类中增加 start方法,并且实现如下代码:

def stdrt(self):
"""
    开始贪吃蛇游戏
"""
    while True :
        pass

在game.py的末尾修改代码如:


Game().start()
游戏中的动画实现原理

在一款图形界面的游戏中,通常游戏的画面是不断变化的,也就是我们常说的动画。例如:贪吃蛇的运动、食物的出现与消失以及分数值的变化等等。
那么游戏中的动画效果是怎样实现的呢?跟电影的原理类似,游戏中的动画效果,本质上是快速地在屏幕上绘制图像。

  • 电影是将多张静止的电影胶片连续、快速地播放,产生连贯的视觉效果!

  • —般在电脑上每秒绘制60次,就能够达到非常连续、高品质的动画效果

  • 每次绘制的结果被称为帧Frame

因此,在我们刚刚完成的代码中,无限循环的执行频率(刷新帧率)只要能达到每秒60帧,就能够达到我们预期的动画效果了。

游戏时钟

pygametime模块中专门提供了一个 Clock类,可以非常方便地 设置游戏循环的执行频率——刷新帧率

以60帧秒举例,当循环体代码执行一遍之后,我们让程序休息1/60秒,然后再次执行循环体代码,这样就能够做到循环体内部的代码,每秒只会被执行60次了,同时CPU的负荷也能够大大降低。

设置刷新帧率需要2个步骤:

  1. 在游戏循环的循环体上方创建一个时钟对象
  2. 在游戏循环的循环体的末尾让时钟对象调用tick(帧率)方法来设置刷新帧率

提示: tick方法会根据 上次被调用的时间,自动设置 游戏循环中的延时

要想设置 刷新帧率,可以对 start方法的代码调整如下:

def start(self):
"""
    开始贪吃蛇游戏
"""
    clock = pygame.time.clock()
    i = 0
    while True:
        print(i)
        i += 1
        clock.tick(60)

主窗口背景颜色

pygame的颜色定义

pygame 的颜色使用的是 RGB色彩模式,即通过对 红(R )、绿(G)、蓝(B) 三个颜色相互之间的叠加来得到各种各样的颜色。
在pygame中,使用一个 (R, G,B) 格式的 元组来定义一个颜色,其中,红®、绿(G)、蓝(B)的数值是0~ 255之间的一个 整数数值对应颜色的亮级, 数值越大亮级就越大
常用的颜色定义如下:

(255,255,255) #白色
(0, 0, 0) #黑色
(255, 0, 0) #红色
(0,255, 0) #绿色
(0, 0, 255) #蓝色
(255, 255,0) #黄色
(255,128,0) #橘色
(128,128,128) #灰色

定义并绘制窗口背景颜色

首先,在 game_item.py模块中定义一个 主窗口背景颜色全局常量,代码如下:

import pygame

BACKGROUND_COLOR = (232,232,232)
  • Python中 没有变量和常量的区别
  • 所谓常量就是定义之后,只允许访问,但是不允许修改
  • Python中,如果要定义常量,可以使用全大写命名,单词之间使用 _ 分隔

然后,修改Game类的start方法, 填充窗口颜色并更新显示.

填充了主窗口背景颜色之后,务必要使用 pygame.display .update() 方法更新屏幕的内容!

update方法的作用就是将在游戏主窗口中绘制的最终结果—次性显示在屏幕上。

阶段性小结
  • 颜色使用(R,G,B)格式的元组定义
  • 常量命名使用全大写,单词之间使用 _ 分隔
  • self.main_window.fill(背景颜色) 使用 背景颜色填充窗口
  • 要在屏幕上看到最终绘制结果,需要调用 pygame.display. update() 方法

绘制文本

pygame的 font模块中专门提供了一个 SysFont类,可以创建 系统字体对象,从而能够实现 在游戏窗口中绘制文字内容
要想在游戏窗口中绘制文本内容,需要执行以下3个步骤:

  1. 创建字体对象
  2. 用字体渲染指定的文本内容,并生成一张图像(surface对象)
  3. 将生成的图像绘制在游戏主窗口的指定位置

[Python项目]使用Pygame开发贪吃蛇小游戏笔记
创建字体对象

SysFont的初始化方法的语法如下:

SysFont(name, size, bold=False, italic=False) -> Font

其中:

  • 参数
  • name系统字体的名称
    • 可以设置的字体与操作系统有关,通过 pygame.font.get_fonts() 可以获取当前系统的所有可用字体列表
  • size字体大小
  • bold是否粗体,默认为否
  • italic是否斜体,默认为否
  • 返回
  • Font对象

代码实现
观察 备课代码的运行效果,可以发现 贪吃蛇游戏中的文字一共有 2种颜色,分别是:

  1. 分数文字颜色——浅灰色
  2. 游戏暂停和结束时的 提示文字颜色—— 深灰色

为了方便后续代码的编写,我们首先在game_item.py模块的顶部先定义两个字体颜色常量,代码如下:

SCORE_TEXT_COLOR =(192,192,192)
TIP_TEXT_COLOR = (64,64,64)

然后在game_item.py中定义Label类,并且实现初始化方法.

目前代码为:


import pygame
from game_items import *

class Game(object):
    def __init__(self):
        self.main_window = pygame.display.set_mode((640, 480))
        pygame.display.set_caption('贪吃蛇')

    def start(self):
"""
        启动并控制游戏
"""
        clock = pygame.time.Clock()

        while True:

            self.main_window.fill(BACKGROUND_COLOR)

            pygame.display.update()

            clock.tick(60)

if __name__ == '__main__':
    pygame.init()

    Game().start()

    pygame.quit

Original: https://blog.csdn.net/R_Rui_Moon/article/details/112982111
Author: ChenRui+
Title: [Python项目]使用Pygame开发贪吃蛇小游戏笔记

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/781376/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球