滚雪球学 Python 番外篇之游戏世界,游戏也有 Hello World

357 阅读5分钟

「这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战

本系列专栏将通过不断编写游戏的方式,带你夯实 Python 知识。

本专栏核心用到的模块是 pygame,一个能写小游戏的第三方库,官方网址 www.pygame.org

用 pygame 做商业游戏不太现实,但是用来夯实 Python 技术,在合适不过了。

在橡皮擦写这套专栏的时候,pygame 已经更新到最新的 2.0 版本了。

滚雪球学 Python 番外篇之游戏世界,游戏也有 Hello World

本专栏需要的前置能力

需要一定的 Python 基础,完全零基础不太容易看懂这套课程; 需要初中数学水平,勾股定理,圆的周长,面积要能计算。

本系列专栏是滚学球系列的番外篇,建议在学习之前,先把滚雪球学 Python 第一轮、第二轮 30 篇博客过一遍。

在正式学习之前,你首先要做的就是把 pygame 模块安装到你的 Python 环境中,安装方法采用正常的 pip install 模块名 即可实现,安装完毕,你可查阅库版本。

通过 pip 报错查看到豆瓣源版本比较丰富。

pip install pygame==
Looking in indexes: http://pypi.douban.com/simple/
ERROR: Could not find a version that satisfies the requirement pygame== (from versions: 1.9.2rc1, 1.9.2, 1.9.3, 1.9.4.dev0, 1.9.4rc1, 1.9.4, 1.9.5rc1, 1.9.5rc2, 1.9.5, 1.9.6rc1, 1.9.6rc2,
 1.9.6, 2.0.0.dev1, 2.0.0.dev2, 2.0.0.dev3, 2.0.0.dev4, 2.0.0.dev6, 2.0.0.dev8, 2.0.0.dev10, 2.0.0.dev12, 2.0.0.dev14, 2.0.0.dev16, 2.0.0.dev18, 2.0.0.dev20, 2.0.0.dev22, 2.0.0.dev24, 2.0
.0, 2.0.1.dev1, 2.0.1)
ERROR: No matching distribution found for pygame==

查看 pygame 包安装详情,可以采用 pip show pygame 进行查阅,下述数据表示橡皮擦本地 pygame 版本为 2.0.1。

D:\game_come_on\312>pip show pygame
Name: pygame
Version: 2.0.1
Summary: Python Game Development
Home-page: https://www.pygame.org
Author: A community project.
Author-email: pygame@pygame.org
License: LGPL
Location: c:\...\lib\site-packages
Requires:
Required-by:

GUI 和 CLI

在命令行(黑窗口)中展示的程序,叫做命令行界面程序(COMMAND LINE INTERFACE,CLI),这样的程序是没有办法满足我们游戏编写的需求的。

在正式编写游戏之前,需要先转换思想,从 CLI 命令行程序调整到 GUI 程序,GUI 全称为图形化用户界面(GRAPHICAL USER INTERFACE,GUI),采用这样的窗口可以显示图像与颜色,不再面对一个黑色背景,白色文字的界面了。

游戏的 Hello World 直接走起

学习编程最快速的办法,就是每天敲上几千行代码。本专栏都是先来代码,在分析为什么。

import pygame
import sys
from pygame.locals import *

# 模块初始化
pygame.init()

# 设置游戏界面的宽度和高度
screen = pygame.display.set_mode((500, 300))

# 游戏窗口标题
pygame.display.set_caption("Hello Wrold")

while True:  # while 1 也可以
    # 监听事件
    for event in pygame.event.get():
        # 事件类型为退出
        if event.type == QUIT:
            # 游戏退出
            pygame.quit()
            # 程序退出
            sys.exit()
    # 更新游戏窗口
    pygame.display.update()

跑一下代码,得到如下效果,一个黑窗口,左上角一条蛇,一行文字,写着 Hello World,这就是 pygame 给我们渲染出来的 GUI 界面。

滚雪球学 Python 番外篇之游戏世界,游戏也有 Hello World

模块导入 开头代码 import pygame 就是导入 pygame 模块,后续咱们的游戏都要借助模块中的各个函数,这里面包括图形处理、声音处理等其它功能,专栏后续都会涉及。

常量导入 通过 from pygame.locals 导入了该模块中的几个常量变量,方便后面使用。

pygame.init() 先不需要了解这个函数内部的实现,记住在 pygame 编写游戏之前,必须先初始化它,否则在使用某些特定方法的时候,会出现初始化错误。

pygame.display.set_mode((500,300)) 创建一个 pygame.Surface 对象,函数的参数是一个元组,目的是设置游戏窗口的宽度和高度。 参数也可以设置为列表类型,但是不要写下面的代码:

pygame.display.set_mode(500, 300)

该代码会导致 TypeError: argument 1 must be 2-item sequence, not int 错误的出现。

本部分第一次出现了 Surface 对象,后面的专栏文章也会单独进行说明。

pygame.display.set_caption("Hello Wrold") 设置窗口标题文字,在这里直接设置中文是可以展示的,如果你在设置中文的时候,出现了问题,直接通过搜索引擎即可解决。

游戏循环和游戏状态 下述代码是一个 while 循环语句,该语句当碰到退出事件,才会退出,在 pygame 中一定会存在一个这样的 while True 循环,它叫做游戏主循环(main loop) 。

while True:  # while 1 也可以
    # 监听事件
    for event in pygame.event.get():
        # 事件类型为退出
        if event.type == QUIT:
            # 游戏退出
            pygame.quit()
            # 程序退出
            sys.exit()
    # 更新游戏窗口
    pygame.display.update()

主循环中一般处理如下事情:

  1. 处理各种鼠标键盘事件;
  2. 更新游戏状态;
  3. 在屏幕上绘制游戏状态。

游戏状态(game state)是一个新名字,玩游戏过程中的保存游戏,就是存储游戏状态,它会记录玩家的生命值,坐标,游戏角色的生命值,坐标,你的得分,游戏进展等各种各样与游戏相关的信息。

Event 对象 pygame 中会通过 pygame.event.Event 对象记录用户的操作,常见的操作有鼠标操作,键盘操作,这个操作或者叫做动作就是事件,通过 pygame.event.get() 可以获取事件具体内容。

pygame.event.get() 获取事件的过程中,是按照顺序进行记录的,即先来先得,当用户点击鼠标并按下键盘按键之后,那获取的事件顺序为,鼠标点击、键盘按键。

Event 对象的 type 属性 获取到 Event 对象之后,可以通过 type 获取何种事件,由于在代码开始导入了 pygame.locals 中的常量变量,所以可以直接使用 QUIT,否则必须使用 pygame.locals.QUIT 才可以获取退出事件。

当然在使用之前,需要先使用 import pygame.locals 导入 pygame.locals 模块。

pygame.quit() 该函数与本文开头的 pygame.init() 成对出现,目的是让 pygame 停止运行。 在调用 sys.exit() 之前,需要先调用 pygame.quit()

本系列专栏属于番外篇,希望你能学到新知识。 有任何疑问,都可以联系橡皮擦进行解决,一起做游戏吧 本专栏每天的练习量大概在 1 小时左右,整篇博客节奏会比较快,毕竟咱们是有基础的人。