产品特色
编辑推荐
本书作者在国外发布英文版后,受到普遍欢迎和很好的评价。
本书通过详细分析11款示例游戏的源代码,介绍Pygame库的用法。寓教于乐,轻松有趣。
本书所涉及的11款示例游戏,是诸如Nibbles、Tetris、Simon、Bejeweled、Othello、Connect Four、Flood It等经典游戏的翻版。
本书的Web站点http://inventwithpython.com/pygame,提供源代码下载等更多资源。
内容简介
Python语言和Pygame都是开发图形化的计算机游戏的得力工具。Pygame使得开发2D图形程序变得很容易,而且它可以免费下载和安装使用。
本书是一本中级编程图书。本书教你如何用Python语言和Pygame库,来编写图形化的计算机游戏。本书共包括10章。本书首先从Python和Pygame基础知识开始,简短地介绍了Pygame库是如何工作的,以及它提供了哪些功能。然后,结合7款不同的游戏实例的开发过程,详细介绍了应用的技能和技巧。本书针对一些真实的游戏给出了完整的源代码,并且详细说明了这些代码如何工作,以便你能够理解真正的游戏是如何使用Pygame的。
本书适合有一定Python基础知识的读者阅读和学习,进而掌握基本的游戏开发知识和技能,对于Python初学者来说,本书也可以作为通过游戏学习Python开发的实践教程。
作者简介
Al Sweigart是加利福尼亚州旧金山的一名软件开发者。他很喜欢骑自行车、当志愿者、泡咖啡吧以及制作有用的软件。《Making Games with Python & Pygame》是他编写的第二本书。他的另一本书是《Invent Your Own Computer Games with Python》。他生于德克萨斯的休斯顿。他在德克萨斯大学Austin分校读完了计算机科学学位。
目录
第1章 安装Python和Pygame 1
1.1 预备知识 1
1.2 下载和安装Python 1
1.3 Windows下的安装说明 1
1.4 Mac OS X上的安装说明 2
1.5 Ubuntu和Linux上的安装
说明 2
1.6 启动Python 2
1.7 安装Pygame 3
1.8 如何阅读本书 4
1.9 特色的程序 4
1.10 下载图形文件和声音文件 4
1.11 行号和空格 4
1.12 图书中的文本折行 5
1.13 在线检查代码 5
1.14 配套网站上的更多信息 6
第2章 Pygame基础知识 7
2.1 GUI vs. CLI 7
2.2 使用Pygame的Hello World程序
源代码 7
2.3 建立一个Pygame程序 8
2.4 游戏循环和游戏状态 10
2.5 pygame.event.Event对象 11
2.6 QUIT事件和pygame.quit()
函数 12
2.7 像素坐标 13
2.8 关于函数、方法、构造函数和
模块中的函数(及其差别)的
一些提示 13
2.9 Surface对象和窗口 14
2.10 颜色 15
2.11 颜色的透明度 16
2.12 pygame.Color对象 17
2.13 Rect对象 17
2.14 基本的绘制函数 19
2.15 pygame.PixelArray对象 22
2.16 pygame.display.update()函数 22
2.17 动画 22
2.18 帧速率和pygame.time.Clock
对象 25
2.19 用pygame.image.load()和blit()
绘制图像 26
2.20 字体 26
2.21 抗锯齿 28
2.22 播放声音 28
2.23 本章小结 29
第3章 Memory Puzzle游戏 31
3.1 如何玩Memory Puzzle游戏 31
3.2 嵌套的for循环 31
3.3 Memory Puzzle的源代码 33
3.4 声明和导入 40
3.5 幻数很糟糕 40
3.6 使用assert语句全面检查 41
3.7 判断一个数字是偶数还是奇数 42
3.8 较早崩溃和经常崩溃 42
3.9 让源代码更好看一些 43
3.10 使用常量变量而不是字符串 44
3.11 确保有足够的图标 44
3.12 元组vs.列表,不可变vs.可变 45
3.13 单项元组需要一个结尾的逗号 46
3.14 在列表和元组之间转换 46
3.15 global语句以及为什么全局变量
是罪恶的 47
3.16 数据结构和2D列表 48
3.17 “开始游戏”动画 49
3.18 游戏循环 50
3.19 事件处理循环 50
3.20 检查鼠标光标在哪一个方块
之上 51
3.21 处理第一次点击的方块 52
3.22 处理不一致的一对图标 53
3.23 处理玩家获胜 53
3.24 将游戏状态绘制到屏幕 54
3.25 创建“揭开的方块”数据结构 55
3.26 创建游戏板数据结构:第1步—获取所有可能的图标 55
3.27 第2步—打乱并截取所有图标
的列表 56
3.28 第3步—将图标放置到游戏
板上 56
3.29 将一个列表分割为列表的
列表 57
3.30 不同的坐标系 58
3.31 从像素坐标转换为方块坐标 59
3.32 绘制图标以及语法糖 59
3.33 获取游戏板控件的图标的形状和
颜色的语法糖 61
3.34 绘制盖住的方块 61
3.35 处理揭开和覆盖动画 62
3.36 绘制整个游戏板 63
3.37 绘制高亮边框 63
3.38 “开始游戏”动画 64
3.39 揭开和盖住成组的方块 64
3.40 “游戏获胜”动画 65
3.41 判断玩家是否已经获胜 65
3.42 为何要那么麻烦地使用main()
函数 66
3.43 为什么要为可读性操心 67
3.44 本章小结 71
第4章 Slide Puzzle 72
4.1 如何玩Slide Puzzle 72
4.2 Slide Puzzle的源代码 72
4.3 第二款游戏和第一款相同 80
4.4 设置按钮 81
4.5 使用愚笨的代码变聪明 83
4.6 主游戏循环 83
4.7 点击按钮 84
4.8 用鼠标滑动贴片 85
4.9 用键盘滑动贴片 85
4.10 使用in操作符实现“等于其中
之一”的技巧 86
4.11 WASD和箭头按键 86
4.12 实际执行贴片滑动 87
4.13 IDLE和终止Pygame程序 87
4.14 检查特定的事件并且将事件添加
到Pygame的事件队列 88
4.15 创建游戏板数据结构 89
4.16 不记录空白的位置 89
4.17 通过更新游戏板数据结构来
移动 90
4.18 何时不使用断言 90
4.19 获取一次并不是那么随机的
移动 91
4.20 将贴片坐标转换为像素坐标 92
4.21 将像素坐标转换为游戏板坐标 92
4.22 绘制一个贴片 93
4.23 让文本显示在屏幕上 93
4.24 绘制游戏板 94
4.25 绘制游戏板的边框 94
4.26 绘制按钮 95
4.27 实现贴片滑动动画 95
4.28 Surface的copy()方法 96
4.29 创建新的谜题 98
4.30 实现游戏板重置动画 99
4.31 时间vs.内存的权衡 100
4.32 没人在乎几个字节 101
4.33 没人在乎几百万个纳秒 101
4.34 本章小结 101
第5章 Simulate 102
5.1 如何玩Simulate游戏 102
5.2 Simulate的源代码 102
5.3 常用初始内容 108
5.4 设置按钮 109
5.5 main()函数 110
5.6 程序中用到的一些局部变量 110
5.7 绘制游戏板并处理输入 111
5.8 检查鼠标点击 112
5.9 检查键盘按下 112
5.10 游戏循环的两种状态 113
5.11 搞清楚玩家是否按下了正确的
按钮 113
5.12 新纪元时间 115
5.13 将游戏板绘制到屏幕 116
5.14 相同的旧的terminate()函数 116
5.15 复用常量变量 117
5.16 实现按钮闪烁动画 117
5.17 绘制按钮 120
5.18 实现背景颜色改变的动画 120
5.19 游戏结束动画 121
5.20 将像素坐标转换为按钮 122
5.21 显式比隐式好 123
第6章 Wormy 125
6.1 Wormy游戏的玩法 125
6.2 Wormy的源代码 125
6.3 栅格 131
6.4 设置代码 131
6.5 main()函数 132
6.6 单独的runGame()函数 133
6.7 事件处理循环 134
6.8 碰撞检测 134
6.9 检测和苹果的碰撞 135
6.10 移动虫子 136
6.11 insert()列表方法 136
6.12 绘制屏幕 137
6.13 在屏幕上绘制“Press a key”
文本 137
6.14 checkForKeyPress()函数 137
6.15 初始屏幕 138
6.16 旋转初始屏幕文本 139
6.17 旋转并不完美 140
6.18 决定苹果出现在哪里 141
6.19 游戏结束屏幕 141
6.20 绘制函数 142
6.21 不要复用变量名 144
第7章 Tetromino 146
7.1 一些Tetromino术语 146
7.2 Tetromino的源代码 147
7.3 常用设置代码 159
7.4 设置按下键的定时常量 159
7.5 更多的设置代码 160
7.6 设置砖块模式 161
7.7 将“一行代码”分隔到多行 164
7.8 main()函数 165
7.9 开始新的游戏 166
7.10 游戏循环 167
7.11 事件处理循环 167
7.12 暂停游戏 167
7.13 使用移动变量来处理用户输入 168
7.14 检查移动或旋转是否有效 168
7.15 找到底部 171
7.16 通过按下按键来移动 172
7.17 让砖块“自然”落下 174
7.18 将所有内容绘制到屏幕上 175
7.19 制作文本的快捷函数
makeTextObjs() 176
7.20 相同的旧的terminate()函数 176
7.21 使用checkForKeyPress()函数等
待按键事件 176
7.22 通用文本屏幕函数
showTextScreen() 177
7.23 checkForQuit()函数 178
7.24 calculateLevelAndFallFreq()
函数 178
7.25 用函数getNewPiece()产生新的
砖块 180
7.26 给游戏板数据结构添加砖块 181
7.27 创建一个新的游戏板数据
结构 181
7.28 isOnBoard()和isValidPosition()
函数 182
7.29 检查、删除和填满一行 184
7.30 将游戏板坐标转换为像素坐标 186
7.31 在游戏板上或屏幕上的其他位置
绘制方块 187
7.32 将所有内容绘制到屏幕上 187
7.33 绘制得分和关卡文本 188
7.34 在游戏板上或屏幕的其他位置
绘制一个砖块 188
7.35 绘制“Next”砖块 189
7.36 本章小结 189
第8章 Squirrel Eat Squirrel 191
8.1 如何玩Squirrel Eat Squirrel 191
8.2 Squirrel Eat Squirrel的设计 191
8.3 Squirrel Eat Squirrel的源代码 192
8.4 常用设置代码 202
8.5 描述数据结构 203
8.6 main()函数 204
8.7 pygame.transform.flip()函数 205
8.8 更为详细的游戏状态 205
8.9 常用的文本创建代码 206
8.10 相机 206
8.11 “活动区域” 208
8.12 记录游戏世界中的物体的位置 208
8.13 从一些草开始 209
8.14 游戏循环 209
8.15 检查去掉保护状态 209
8.16 移动敌人松鼠 210
8.17 删除较远的草对象和松鼠
对象 211
8.18 当从列表中删除项的时候,
反向遍历列表 211
8.19 添加新的草对象和松鼠对象 213
8.20 相机延迟以及移动相机视图 213
8.21 绘制背景、草、松鼠和生命值
指示 214
8.22 事件处理循环 216
8.23 移动玩家并考虑跳动 218
8.24 碰撞检测:吃或被吃 219
8.25 游戏结束屏幕 221
8.26 获胜 221
8.27 绘制图形化的生命值指标 221
8.28 相同的旧的terminate()函数 222
8.29 正弦函数 222
8.30 对Python 2的向后兼容 225
8.31 getRandomVelocity()函数 226
8.32 找到一个地方添加新的松鼠
和草 226
8.33 创建敌人松鼠数据结构 228
8.34 翻转松鼠图像 228
8.35 创建草数据结构 229
8.36 检查是否在活动区域之外 229
8.37 本章小结 230
第9章 Star Pusher 231
9.1 如何玩Star Pusher 231
9.2 Star Pusher的源代码 232
9.3 初始化设置 245
9.4 Star Pusher中的数据结构 259
9.5 读取和写入文本文件 260
9.6 递归函数 268
9.7 栈溢出 269
9.8 使用基本条件防止栈溢出 271
9.9 漫水填充算法 271
9.10 绘制地图 273
9.11 检查关卡是否完成 275
9.12 本章小结 276
第10章 4款其他游戏 277
10.1 Flippy,Othello的翻版 277
10.2 Flippy的源代码 279
10.3 Ink Spill,Flood It游戏的
翻版 291
10.4 Ink Spill的源代码 292
10.5 Four-In-A-Row,Connect Four
的翻版 303
10.6 Four-In-A-Row的源代码 304
10.7 Gemgem,Bejeweled的翻版 312
10.8 Gemgem的源代码 313
10.9 本章小结 326
术语表 328
前言/序言
踏上代码的奇幻之旅:用Python和Pygame构建你的游戏世界 你是否曾经梦想过创造属于自己的游戏?那些令人着迷的角色,充满挑战的关卡,以及引人入胜的故事,是否在你心中挥之不去?如果答案是肯定的,那么,欢迎来到一个充满无限可能的世界。这本书将为你铺就一条通往游戏开发梦想的道路,让你掌握强大的工具——Python语言和Pygame库,一步步将脑海中的奇思妙想转化为触手可及的数字世界。 游戏开发,一个充满魔力和创造力的领域,它不仅仅是编写代码,更是将逻辑、艺术、音乐与互动性完美融合的艺术。对于初学者而言,游戏开发的门槛似乎很高,但事实上,借助Python这门易学易用的编程语言,以及功能强大且社区活跃的Pygame库,这个过程将变得前所未有的顺畅和有趣。本书正是为你量身打造的入门指南,它将带你从零开始,逐步深入游戏开发的各个环节,让你体会到从想法到实现的完整乐趣。 为何选择Python和Pygame? 在众多游戏开发工具中,Python和Pygame组合脱颖而出,成为许多独立开发者和初学者的首选,原因如下: Python的易学性: Python以其简洁的语法、清晰的结构和丰富的文档而闻名,即使你从未接触过编程,也能快速上手。它的“读起来像英语”的特点,让你能更专注于游戏逻辑的思考,而非被复杂的语法束缚。 Pygame的强大功能: Pygame是一个基于SDL(Simple DirectMedia Layer)库的Python模块集合,它提供了创建2D游戏所需的一切功能,包括图形渲染、音频播放、事件处理、输入管理(键盘、鼠标、手柄)等等。这意味着你无需从头开始编写底层图形绘制代码,而是可以专注于游戏的玩法设计和内容创作。 活跃的社区支持: Python和Pygame都拥有庞大且活跃的开发者社区。这意味着当你遇到问题时,总能找到大量的教程、论坛讨论、代码示例以及乐于助人的开发者。这种支持对于学习者来说是无价的。 跨平台兼容性: Pygame编写的游戏可以在多种操作系统上运行,包括Windows、macOS和Linux,让你无需担心目标平台的限制。 从简单到复杂: Pygame的设计理念是循序渐进,你可以从制作最简单的“Hello, World!”图形应用开始,逐步过渡到复杂的平台跳跃游戏、射击游戏、解谜游戏,甚至是策略游戏。 本书的旅程:从基础到进阶 本书的编排旨在让你在轻松愉快的氛围中,稳步提升你的游戏开发技能。我们将从最基础的概念讲起,一步一个脚印地带领你走进游戏开发的世界。 第一部分:Python基础与Pygame入门 在开始构建游戏之前,扎实的Python基础是必不可少的。这一部分将快速回顾Python的核心概念,让你对变量、数据类型、控制流(if语句、for循环、while循环)、函数、类和对象有清晰的认识。即使你是Python新手,也能在这里找到前进的动力。 紧接着,我们将正式介绍Pygame。你会了解如何安装Pygame,如何初始化Pygame模块,以及如何创建一个基本的Pygame窗口。我们还将深入讲解Pygame的核心概念: 游戏循环 (Game Loop): 这是任何游戏的核心。你将学会如何构建一个永不停歇的游戏循环,它负责不断地更新游戏状态、处理用户输入,并重新绘制屏幕。 事件处理 (Event Handling): 游戏之所以具有交互性,全赖于对用户输入的响应。我们将学习如何捕获键盘按键、鼠标点击、窗口关闭等各种事件,并根据这些事件做出相应的游戏逻辑反应。 绘制与显示 (Drawing and Displaying): 如何在屏幕上绘制各种图形?从简单的矩形、圆形,到复杂的图像,我们将学习如何使用Pygame的绘图函数,以及如何加载和显示图片资源。 颜色与坐标 (Colors and Coordinates): 理解Pygame中的颜色表示(RGB值)和坐标系(以左上角为原点)是进行图形绘制的基础。 第二部分:构建游戏的核心要素 有了基础的Pygame知识,我们就可以开始构建游戏的具体元素了。这一部分将带领你掌握开发动态游戏所需的关键技术: 精灵与动画 (Sprites and Animation): 精灵是游戏中可移动的、具有图形表示的对象,例如角色、敌人、道具等。你将学习如何创建和管理精灵,如何使用精灵表(Sprite Sheets)来制作流畅的动画效果,让你的游戏角色“活”起来。 碰撞检测 (Collision Detection): 游戏中的互动往往涉及到对象之间的碰撞。我们将探讨不同的碰撞检测方法,例如矩形碰撞、圆形碰撞,以及如何根据碰撞事件触发相应的游戏逻辑,比如玩家碰到敌人受伤,或者拾取到道具。 游戏状态管理 (Game State Management): 随着游戏变得复杂,管理不同的游戏状态(如主菜单、游戏进行中、游戏结束、暂停等)变得至关重要。你将学习如何组织你的代码,以便有效地切换和管理这些状态。 音频集成 (Audio Integration): 声音是游戏体验的重要组成部分。我们将学习如何加载和播放背景音乐,如何触发音效(如跳跃声、射击声、爆炸声),为你的游戏增添生动感。 文本渲染 (Text Rendering): 显示分数、生命值、游戏标题以及对话框都需要文本渲染。你将学习如何使用Pygame加载字体,并在屏幕上绘制文本。 第三部分:实践与进阶项目 理论结合实践是学习的关键。在掌握了核心概念后,我们将通过一系列精心设计的示例项目,将所学知识融会贯通。这些项目将涵盖不同类型的游戏,让你在实战中不断巩固和提升: 简单的打砖块游戏: 学习如何管理多个可变对象(球、挡板、砖块),以及实现基本的碰撞和得分系统。 经典的平台跳跃游戏: 挑战更复杂的角色控制,包括重力、跳跃、移动平台,以及关卡设计。 简易的射击游戏: 学习如何处理子弹发射、敌人生成、以及分数统计。 有趣的益智类游戏: 探索如何设计谜题逻辑,以及如何创建需要玩家思考的游戏玩法。 在完成这些项目的同时,你还将接触到一些进阶概念,例如: 面向对象编程 (Object-Oriented Programming, OOP) 在游戏开发中的应用: 如何使用类来抽象游戏中的各种元素,提高代码的可读性和可维护性。 游戏性能优化: 了解一些基本的性能优化技巧,让你的游戏运行得更流畅。 代码组织与模块化: 如何将大型项目分解成更小的、易于管理的模块,提高开发效率。 简单的AI(人工智能)概念: 为你的敌人添加一些基本的行为模式。 谁适合阅读这本书? 零基础的编程爱好者: 如果你对编程充满好奇,希望从一个有趣的项目开始你的编程之旅,那么这本书将是你的绝佳起点。 渴望创造自己游戏的玩家: 如果你是一位热衷于游戏的玩家,并且一直梦想着能亲手打造属于自己的游戏世界,那么本书将为你打开一扇新的大门。 想要学习2D游戏开发的Python开发者: 如果你已经掌握了Python,并希望将其应用到游戏开发领域,Pygame将是你快速入门的理想选择。 教育工作者和学生: 本书可以作为教授编程和游戏开发概念的优秀教材。 不仅仅是编码,更是创造的乐趣 通过阅读本书,你不仅能学习到Python和Pygame的编程技巧,更能培养你的逻辑思维能力、解决问题的能力以及创造力。你会发现,将一个抽象的想法变成一个能够与之互动的虚拟世界,是多么令人兴奋和有成就感的过程。 本书的每一章都设计有清晰的讲解、易于理解的代码示例,以及引导性的练习。我们鼓励你动手实践,在每一次尝试和调试中,你都会学到更多。不要害怕犯错,错误是学习过程中不可避免的一部分,它们是通往成功的垫脚石。 准备好踏上这场激动人心的代码奇幻之旅了吗?让我们一起用Python和Pygame,点亮你心中的游戏之火,创造出属于你的独一无二的游戏世界!