当前位置 博文首页 > GitChat:Python 实战开发俄罗斯方块游戏

    GitChat:Python 实战开发俄罗斯方块游戏

    作者:[db:作者] 时间:2021-08-08 22:27

    “人生苦短,我用 Python”,这是网络上的一句戏言,却真实反映了 Python 语言的江湖地位。2017年 IEEE Spectrum 杂志发布的编程语言排行榜中,Python 排行榜首。Python 也被视为 AI 时代的头牌语言,是数据科学和机器学习领域使用最多的语言。Python 语言学习曲线平滑,上手容易。然而,新手必须通过项目实战才能显著提高 Python 开发能力。本达人课意在通过俄罗斯方块游戏开发实战,来提高初学者的 Python 编程能力。

    本课程共包含两大部分。

    第一部分(第1篇)主要讲解如何搭建开发环境。课程采用的集成开发环境是Pycharm Community 2017.3。这一部分先讲如何在 Pycharm 内创建项目,接着讲如何安装 Pygame 工具包。

    第二部分(第2-23篇)开启俄罗斯方块游戏开发实战。每一篇对应一个实验步骤,每一个实验步骤实现一个核心功能,从文章标题可窥一二。

    开发实战部分的每篇文章基本遵循这样的撰写思路:文章开头首先展示实验步骤的目标,即程序运行效果,接着分析其背后的具体实现思路和步骤,并给出详尽的代码解读及重难点分析,最后大家可以在 GitHub 上查看对应的源代码。

    作者介绍

    叶常春,原国防科技大学计算机学院副教授。拥有十余年的程序设计教学经验,主讲大学计算机基础、计算机程序设计、数据结构和算法设计与分析等课程,熟悉 Python、Android、C/C++、Java、JavaScript + HTML + CSS、PHP 和 SQL 等语言。热爱教学,热爱编程。践行“做中学”理念,在入门级程序设计课程中指导学生开发出俄罗斯方块、五子棋和推箱子等游戏程序。相信只要给予时间和土壤,任何一名学生都能成长为编程高手。

    课程内容

    导读:功能概览

    引言

    你有玩过俄罗斯方块游戏吗?这是一款规则简单、上手容易,却让人爱不释手的游戏。作为一名程序员,你有没有想过自己写一个俄罗斯方块游戏程序,分享给家人、朋友、还有同学玩一玩呢?我在教大学一年级学生开发这款游戏的时候,就有学生自豪地跟我讲他在高中同学群里分发了游戏程序,高中同学好生羡慕呢。

    除了帮你赢得身边人的掌声,编写俄罗斯方块游戏程序能实实在在地提升你的编程技能。在自己十多年的教学过程中,刚学完编程基础课程的同学经常问我:“老师,我现在编写的程序只有几十行,但现在的软件动辄上万行,我下一步该怎么走?”我的建议是,下一步做到能够熟练编写几百行的程序。进一步,我还会提议去编写小游戏程序。因为我知道,大家都爱玩游戏,编写游戏程序更能够激发同学们的干劲,所需的知识面比编程基础课所覆盖的知识面要更广。编写游戏程序要涉及图形界面编程、事件驱动机制、定时器、音效和图像等等。编程基础课通常没有覆盖到的这些内容。

    编写俄罗斯方块游戏程序,是一种项目实战。我建议你通过一系列项目实战来提升编程技能,同时强烈建议你每一个项目实战的成果和经验教训发布到你的网络空间中。可以发布到博客中,可以发布到 GitHub 或其他类似网站上。这样,你把自己的学习成长轨迹记录下来,一方面会大大加快自己成长的速度,另一方面的好处是,帮助你找到一份好工作。你想呀,你怎么让面试官相信你拥有了足够的技能呢?光靠嘴巴说,是没有信服力的。如果你把自己做过的一个个项目讲出来并公布项目 URL 链接,面试官拿到可靠的证据,不录取你还录取谁呢。

    “人生苦短,我用 Python”,这是网络上的一句戏言,却真实反映了 Python 语言的江湖地位。2018年4月,关注编程语言流行程度的 PYPL 指数指出,Python 的受欢迎程度获得5.2%的巨幅增长,是开发人员中受欢迎程度上升最快的语言。Python 也被视为 AI 时代的头牌语言,是数据科学和机器学习领域使用最多的语言。Python 语言学习曲线平滑,上手容易。然而,新手必须通过项目实战才能显著提高 Python 开发能力。

    本达人课面向拥有 Python 编程基础的入门级程序员,通过俄罗斯游戏开发实战来提高新手的 Python 编程能力。对于编程基础为零的读者,我推荐先学习《Python编程:从入门到实践》一书,以及我本人发布的视频课程。

    功能概览

    本课程共包含两大部分。

    第一部分(第1篇)讲解如何搭建开发环境。课程采用的集成开发环境是 Pycharm Community 2017.3。这一部分先讲如何在 Pycharm 内创建项目,接着讲如何安装 Pygame 工具包。

    第二部分(第2-22篇)开启俄罗斯方块游戏开发实战。每一篇对应一个实验步骤。每一个实验步骤实现一个核心功能。文章标题概括描述了每一篇实现的核心功能。每篇文章会首先指出实验步骤的目标,即所要实现的程序效果。接着,描述实验步骤的实现思路和任务,并逐个任务地讲解具体的做法,即如何在前面开发基础上修改/补充代码,并解析背后的思考过程。最后,分享该实验步骤对应的源代码,我会将其放在 Github 上,供大家浏览、下载。

    全部21个实验步骤的编排遵循“小步走”的策略。我一再提醒自己,每一步骤要小,要有可见的结果。这样,一方面控制了单个实验步骤的难度,另一方面开发者可以清晰地判断开发工作是否达成了目标。比如,第一个步骤是绘制游戏窗口,我只用了7行代码来实现这一小小功能,仅此而已,其他图形绘制工作在本节中并不会涉及。诸如此类,后续每个实验步骤都经过了仔细斟酌,保证每节课只专注一个核心功能,力求步骤小,将其讲清讲透,难度可控。如果你浏览本课程的目录,或多或少能够看出“小步走”的策略。

    整个课程走完后,程序的运行效果是什么样子的呢?

    有两个方法可以看运行效果。第一,大家可以观看我制作的视频。第二,可以访问我上传到 Github 的源码,然后把源码压缩包(.zip)下载到本地,解压后运行它。

    注意,你需要首先安装有 Python 3 以及 Pygame 工具包。如果你不知道怎么从 Github 下载源码压缩包,或者不知道如何安装 Python 3,又或者不知道如何安装 Pygame 工具包,上网搜索做法,保管你找到详尽的说明文档。你也可以访问本人发布的视频课程,课程第一章讲解了如何安装 Python 3。

    知识内容方面,通过本课程你将学到:

    1. 面向对象编程;
    2. 把一个程序分解成多个模块的分析方法;
    3. 使用第三方工具包的 API;
    4. 事件驱动机制,包括键盘按键事件响应和定时事件响应等;
    5. 生成随机数的功能实现;
    6. 表示游戏状态的数据结构;
    7. 图形用户界面(GUI)编程,包括图形、图像和音效。

    如果本课程是你需要的,让我们开始吧。祝好运!

    第01课:Pycharm 中创建项目

    步骤目标

    本文将实现两个目标:

    1. 在 Pycharm Community(以下简称 Pycharm)中创建工程(也叫项目,Project)。
    2. 安装游戏程序依赖的 pygame 包。我们将利用 pygame 第三方工具包来开发俄罗斯方块游戏程序。

    正式开始之前,你需要在自己的电脑中安装 Python 3.x 和 Pycharm Community(叫做社区版,免费,完全够用)。如果没有安装,请参阅以下文档/视频资料完成安装。

    • 观看我发布的视频课程,课程第一章讲解了如何安装 Python 3 和 Pycharm。
    • PyCharm 2017 下载安装入门教程
    • Pycharm 教程:安装和首次使用

    创建工程

    启动 Pycharm。

    第一次启动 Pycharm,看到的界面如图1所示。点击“Create New Project”选项,就进入创建新工程环节。点击“Open”选项,打开已有的工程。

    图1 第一次启动Pycharm

    如果已打开了一个工程,如图2所示,那么选择菜单“File/New Project…”即可创建新工程。

    图2 打开一个工程时的界面

    注意:这里的截屏都取自 Windows 系统上 Pycharm Community 2017.3.4 的运行界面,与 Linux 系统上的 Pycharm 运行界面会有少许差异,但不会构成误解。后面的课程内容同上。

    给工程取名

    在文本输入框内指定工程对应的文件夹,如图3所示。Pycharm 创建工程的主要动作是创建该工程专属的文件夹,开发过程中创建的源码文件和其他隶属于工程的文件都将放在这个文件夹下面。比如,我们在路径“C:\Users\612226\Documents”下创建工程“TetrisGame”,那么将会在上述路径下创建名为“TetrisGame”的文件夹。

    图3 指定工程名称(实质是指定工程文件夹的名称)

    需要指出的是,Windows 系统中文件路径的写法和 Linux 系统中的写法是有差异的。比如,Windows 系统中的文件路径写法类似于“C:\Users\612226\PycharmProjects”,而在 Linux系统中,该路径名的写法类似于“/Users/612226/PycharmProjects”。

    两者的差异主要有两点:

    1. Windows 系统中,盘符(本例的“C:\”)打头。Linux 系统中,斜杠 /(代表根目录)打头。
    2. Windows 系统中,上下级之间用反斜杠“\”分隔。Linux 系统中,上下级之间用斜杠“/”分隔。

    工程创建成功

    点击图3“Create”按钮,将创建工程,进入如图4所示的界面。下一步骤(点击底部的“下一步骤”按钮即可到达)将讲解如何往工程内加入 Python 代码文件。

    图4 工程创建成功

    安装 pygame 包

    本达人课进行的游戏开发依赖于 pygame 包。下面讲解如何安装 pygame 包。

    如果没有安装 pygame 包,运行游戏程序时,将遇到错误,原因在于 import pygame 语句执行失败。

    选择并点击 Pycharm 顶部菜单“File / Settings”(这里,斜杠/用于分隔上下级菜单项。此处意味着,先点击 File,然后在下级菜单点击 Settings。下同。),将弹出 TetrisGame 工程的属性设置窗口,如图5所示。在设置窗口的左上角搜索框内输入 interpreter,将匹配 Project Interpreter 配置项,接着点击右上角绿色加号+。

    图5 属性设置窗口

    在弹出的窗口(见图6)上部的搜索框内输入 pygame,再点击下部的“Install Package”按钮。

    图6 安装 pygame 包

    等待安装完毕。安装完毕后,效果如图7所示。

    图7 pygame 包安装完毕

    关闭窗口,再在如图5所示的窗口内点击“OK”,这样就退出了属性设置操作,回到图4所示的编辑界面。

    小结

    本文首先介绍了如何新建工程(工程也叫作项目)。Pycharm 新建工程的主要动作是创建工程文件夹。接着介绍了如何为工程安装 pygame 包(实际上是在工程附属的虚拟环境内安装 pygame 包)。

    上述两项工作的前提是安装了 Python 3 和 Pycharm。

    第02课:显示游戏窗口

    步骤目标

    本文将达成的目标是:开发完成一个 Python 程序,运行该程序将显示图1所示的俄罗斯方块游戏窗口。

    图1 俄罗斯方块游戏窗口

    完成本目标的前提是,你在自己的电脑中安装了 Python 3 和 Pycharm(用免费的社区版即可),而且你已经针对俄罗斯方块游戏开发创建了工程,并安装了 Pygame 包。如果你没有做到以上前提,请返回到第一篇,那里讲了怎么做。

    显示游戏窗口功能实现的步骤分成两个子步骤:

    1. 创建和编写程序文件 main.py。
    2. 运行 main.py。

    显示游戏窗口功能实现

    上一篇中,我们已经创建了 TetrisGame 工程(工程名字可以换成别的)。下面让我们在该工程下创建第一个 Python 程序文件 main.py。你可以把 main.py 换成其他文件名。我之所以使用 main.py 这个名字,是因为它表明该文件是程序运行开始的地方。

    创建和编写程序文件 main.py

    (1)创建程序文件 main.py。

    图2演示了如何在 TetrisGame 工程内创建 Python 程序文件。做法是鼠标右键点击工程 TetrisGame,然后在弹出的菜单中选择“New/Python File”,在弹出的小窗口内输入程序文件名:main,点击“OK”按钮后将创建 main.py 文件。

    要强调的是,New 菜单的下级菜单中要选择的是处于中部的“Python File”,不是顶部的“File”。

    图2 创建程序文件

    (2)编写main.py的代码。

    将下文展示的代码(最左侧的数字序号是代码行号),敲入 main.py 程序文件内。前面四行是注释,不需要敲进程序文件内。

    运行 main.py

    鼠标右键选中“main.py”,在弹出的菜单中点击“Run ‘Main’”菜单项运行程序。程序运行后,将弹出游戏窗口,见图1。

    下文将对 main.py 中的代码及程序的运行流程做详细解读。

    程序文件 main.py 的说明

    实现显示游戏窗口的代码 main.py,如下

    1.    # @Time    : 2018/4/23 16:442.    # @Author  : freedomyeah3.    # @Email   : iamdouble@163.com4.    # @Copyright:  MIT5.    import sys6.    import pygame7.    8.    def main():9.        #初始化pygame。启用Pygame必不可少的一步,在程序开始阶段执行。10.        pygame.init()11.        #创建屏幕对象(也即窗口对象)12.        screen = pygame.display.set_mode((1200, 900) )  #分辨率是1200*90013.        pygame.display.set_caption("俄罗斯方块")  #窗口标题14.     15.        #屏幕背景色16.        bg_color = (230, 230, 230)17.    18.        #游戏主循环19.        while True:20.            #监视键盘和鼠标事件21.            for event in pygame.event.get():22.                if event.type == pygame.QUIT:  #关闭窗口的事件23.                    sys.exit()   #退出程序24.    25.             #填充屏幕背景色26.            screen.fill(bg_color)27.    28.            #刷新屏幕29.            pygame.display.flip()30.     31.    if __name__ == '__main__':32.        main()

    对于上面的代码,说明如下:

    (1)第5行导入 sys 模块。第23行调用了 sys 模块的 exit() 函数,作用是退出程序。

    (2)第6行导入 pygame 模块。pygame 模块用于绘制图形和显示窗口。

    (3)第8~29行定义了 main() 函数,然后在第32行调用 main()函数。第31行代码的作用是检测本行代码所在的程序文件(此处就是main.py)是否是“直接运行的情形”,如果是就调用 main() 函数;否则不调用 main() 函数。

    • 在 Pycharm 中右键点击 main.py 可直接运行它。此外,在命令行界面上,比如 Windows 终端上,输入“python main.py”,也可直接运行 main.py。
    • 什么时候 main.py 不属于直接运行的情形呢?答案是,别的程序文件(比如 abc.py)导入 main.py(即:import main.py)的时候。

    (4)对于 main() 函数内的代码,解释说明如下。

    • 第10行是调用 pygame 模块的 init 函数进行初始化。使用 pygame 函数之前务必进行初始化。
    • 第12行是调用 display 模块的 set_mode 函数,作用是初始化屏幕对象(也即窗口对象)。此处传入一个参数,即(1200, 900)元组,这使得窗口的分辨率是1200x900。display 模块隶属于 pygame 模块。
    • 第13行代码的作用是设置窗口标题。
    • 第16行代码的作用是把颜色值(230, 230, 230)赋值给 bg_color 变量。第26行代码将把 bg_color 用作窗口背景色,效果如图1所示。颜色值(230, 230, 230)中,三个整数依次是三原色中红色、绿色和蓝色的浓度值。浓度值是一个整数,最大为255,最小为0。
    • 第19~29行代码在下面解释说明。

    (5)第19行~29行构成一个 while 循环。

    • 第19行语句中,循环测试条件是 True,意味着这是一个无穷循环。也就是说,循环会一直执行,直至玩家关闭窗口。
    • 第21行中,pygame.event.get() 的作用是获取事件列表。事件列表内包含0个或多个事件对象。第21行将依次赋值给 event 变量。

    知识点: 玩家每次按键盘,将引发键盘按键事件,接着 pygame 将新建事件对象,然后事件对象将加入到事件列表中。玩家操作鼠标也会引发事件。

    • 第22行代码中,event.type 是事件对象的类型。pygame.QUIT 是 pygame 模块内定义的常量,指的是关闭窗口的事件类型。玩家点击窗口标题栏上的关闭按钮(见图1右上角),将引发 pygame.QUIT 类型的事件。而玩家按下键盘的话,将引发 pygame.KEYDOWN 类型的事件。
    • 第23行代码是在玩家点击窗口标题栏上的关闭按钮时执行的,作用是退出整个程序。
    • 第26行是填充屏幕背景色。第29行是刷新屏幕,以使最近的绘制操作生效。

    根据上面的描述,我们能猜测到玩家是向程序发出命令来控制游戏的。目前只能够识别玩家发出的关闭窗口的命令(具体动作是点击窗口标题栏的关闭按钮)。将来会增加更多代码来识别通过键盘发出的各种命令。

    程序运行流程

    对于程序运行流程,我们需要了然于胸。否则,随着代码增加,有可能理不清头绪。

    程序运行流程的主干是:

    (1)初始化 pygame;

    (2)初始化游戏窗口,并设置窗口标题;

    (3)反复地执行游戏主循环:

    • 遍历事件列表,对每一个事件作出响应处理。响应处理的结构大致是:
     if(是关闭窗口事件)     退出程序 elif(是键盘按键事件)     处理按键事件
    • 绘制窗口内的元素。例如填充背景色。以后会有更多绘制操作。
    • 刷新窗口。

    实现新功能的绝大多数代码,将插入游戏主循环内。当然,我们会把扩充的代码封装成一个个函数。

    小结

    正如开头所说,本文的目标是显示分辨率为1200x900的游戏窗口。如果你达成目标,说明你干得不错。

    在理解各行代码用途的前提下,你可以抄代码,不必要记住它们。然而,你务必吃透程序主循环,以免将来对不断增加的代码失去掌控。

    我已经把源码上传至 GitHub

    你点击网页中的“main.py”(如图3所示),就可以浏览该文件。要下载整个工程文件夹(目前其下只有 main.py 文件),则先点击“Clone or download”,再点击“Download Zip”,你将下载到一份 zip 文件,解压后正是工程文件夹。

    图3 在GitHub上浏览或下载源码
    第03课:绘制游戏区域
    第04课:绘制小方块
    第05课:绘制方块
    第06课:捕捉键盘按键事件
    第07课:移动方块
    第08课:防止方块出界
    第09课:翻转方块
    第10课:随机生成新方块
    第11课:加速落到底部
    第12课:垒墙
    第13课:解决垒墙时方块重叠问题
    第14课:方块自动下落
    第15课:消行计分
    第16课:玩家指示开始游戏
    第17课:玩家暂停游戏
    第18课:游戏结束
    第19课:防止穿墙
    第20课:提示下一方块
    第21课:强制重新开始和界面变样
    第22课:难度级别和使用说明
    第23课:背景音乐和背景图片

    阅读全文: http://gitbook.cn/gitchat/column/5b1a31bc862a01660e35955c

    cs
    下一篇:没有了