编辑推荐
本书教你如何使用流行的Python编程语言来编写计算机游戏,即便你之前没有任何编程经验。
首先,本书带领读者猜数字和Tic Tac Toe这样的经典游戏,然后开始学习更加高级的游戏的开发,例如基于文本的Sonar Treasure Hunt游戏以及带有音效和动画的Dodger游戏。在此过程中, 我们还会学习关键的编程和数学概念,这些将使得你的游戏开发技能达到更高的层级。
通过本书,你将学习:
使用组合循环、变量和流程控制语句;
选择合适的数据结构来完成任务,例如列表、字典和元组;
使用pygame模块,为游戏添加图形和动画;
处理键盘和鼠标输入;
编写简单的人工智能程序,从而能够和计算机玩游戏;
使用加密技术把文本信息转换为密码;
调试程序并找出常见错误。
随着你编写每一个游戏,你将打下牢固的Python编程基础,并且能够更好地理解计算机科学的基础知识。
内容简介
Python是一种高级程序设计语言,因其简洁、易读及可扩展性日渐成为程序设计领域备受推崇的语言。
本书通过编写一个个小巧、有趣的游戏来教授Python编程,并且采用直接展示游戏的源代码并通过实例来解释编程的原理的方式。全书共21章,12个游戏程序和示例贯穿其中,介绍了Python基础知识、数据类型、函数、流程控制、程序调试、流程图设计、字符串操作、列表和字典、笛卡尔坐标系、密码学基础、游戏AI模拟、动画图形、碰撞检测、声音和图像等方方面面的程序设计知识。本书可以帮助读者在轻松有趣的过程中,掌握Python游戏编程的基本技能。
本书适合不同年龄和层次的Python编程初学者阅读。
作者简介
Al Sweigart是一名教授孩子和成人编程的软件开发者。通过http://inventwithpython.com/可以访问他编写的编程教程。他是畅销书《Python编程快速上手——让繁琐工作自动化》的作者。
目录
- 第1章 交互式Shellt1
- 1.1 一些简单的数学知识t1
- 1.1.1 整数和浮点数t2
- 1.1.2 表达式t2
- 1.2 计算表达式t3
- 1.3 语法错误t4
- 1.4 在变量中存储值t4
- 1.5 小结t8
- 第2章 编写程序t9
- 2.1 字符串值t10
- 2.2 连接字符串t10
- 2.3 在IDLE的文件编辑器中
- 编写程序t11
- 2.3.1 创建Hello World程序t11
- 2.3.2 保存程序t12
- 2.3.3 运行程序t13
- 2.4 Hello World程序如何工作t14
- 2.4.1 注释t15
- 2.4.2 函数:程序中的小程序t15
- 2.4.3 终止程序t16
- 2.5 命名变量t16
- 2.6 小结t17
- 第3章 “猜数字”游戏t19
- 3.1 “猜数字”的运行示例t20
- 3.2 “猜数字”程序的源代码t20
- 3.3 导入random模块t21
- 3.4 用random.randint()函数
- 生成随机数t22
- 3.5 欢迎玩家t23
- 3.6 流程控制语句t23
- 3.6.1 使用循环来重复代码t23
- 3.6.2 组织语句块t24
- 3.6.3 for循环语句t25
- 3.7 玩家的猜测t26
- 3.8 使用int()函数、float()函数、str()
- 函数和bool()函数来转换值t26
- 3.9 布尔数据类型t28
- 3.9.1 比较操作符t28
- 3.9.2 用条件检查True或
- Falset29
- 3.9.3 体验布尔值、比较操作符
- 和条件t29
- 3.9.4 =和==的区别t30
- 3.10 if语句t30
- 3.11 用break语句提早离开循环t31
- 3.12 判断玩家是否赢了t31
- 3.13 判断玩家是否输了t32
- 3.14 小结t32
- 第4章 一个讲笑话程序t35
- 4.1 Jokes游戏的运行示例t35
- 4.2 Jokes游戏的源代码t36
- 4.3 代码如何工作t36
- 4.4 转义字符t37
- 4.5 单引号和双引号t38
- 4.6 print()的end关键字形参t39
- 4.7 小结t39
- 第5章 DragoRealmt41
- 5.1 如何玩DragoRealmt41
- 5.2 DragoRealm的运行示例t42
- 5.3 DragoRealm的流程图t42
- 5.4 DragoRealm的源代码t43
- 5.5 导入random和time模块t44
- 5.6 DragoRealm中的函数t44
- 5.6.1 def语句t45
- 5.6.2 调用函数t45
- 5.6.3 把函数定义放在哪里t45
- 5.7 多行字符串t46
- 5.8 while语句实现循环t46
- 5.9 布尔操作符t47
- 5.9.1 and操作符t47
- 5.9.2 or操作符t48
- 5.9.3 not操作符t49
- 5.9.4 布尔操作符的运算t49
- 5.10 返回值t50
- 5.11 全局作用域和局部作用域t51
- 5.12 函数形参t52
- 5.13 显示游戏结果t53
- 5.14 决定哪个山洞有友善的龙t53
- 5.15 游戏循环t54
- 5.15.1 在程序中调用函数t55
- 5.15.2 询问玩家要不要再玩
- 一局t55
- 5.16 小结t56
- 第6章 使用调试器t57
- 6.1 Bug的类型t57
- 6.2 调试器t58
- 6.2.1 启动调试器t59
- 6.2.2 用调试器单步执行程序t60
- 6.3 查找Bugt63
- 6.4 设置断点t65
- 6.5 使用断点t66
- 6.6 小结t68
- 第7章 用流程图设计Hangmant69
- 7.1 如何玩Hangmant69
- 7.2 Hangman的运行示例t70
- 7.3 ASCII字符图t71
- 7.4 用流程图来设计一个程序t71
- 7.4.1 生成流程图t72
- 7.4.2 流程图的分支t73
- 7.4.3 结束或者重新开始游戏t74
- 7.4.4 再猜一次t75
- 7.4.5 为玩家提供反馈t77
- 7.5 小结t78
- 第8章 编写Hangman的代码t79
- 8.1 Hangman的源代码t79
- 8.2 导入random模块t82
- 8.3 常量t82
- 8.4 列表数据类型t83
- 8.4.1 用索引访问元素t83
- 8.4.2 列表连接t84
- 8.4.3 in操作符t85
- 8.5 调用方法t85
- 8.5.1 列表方法reverse()和
- append()t86
- 8.5.2 字符串方法split()t86
- 8.6 从单词列表中获取一个神秘
- 单词t87
- 8.7 向玩家显示游戏板t87
- 8.7.1 list()函数和range()函数t88
- 8.7.2 列表和字符串分片t89
- 8.7.3 用空格表示神秘单词t90
- 8.8 获取玩家的猜测t91
- 8.8.1 字符串方法lower()和
- upper()t92
- 8.8.2 离开while循环t93
- 8.9 elif语句t93
- 8.10 确保玩家输入一个有效的
- 猜测t94
- 8.11 询问玩家是否想再玩一局t94
- 8.12 回顾Hangman中的函数t95
- 8.13 游戏循环t96
- 8.13.1 调用displayBoard()函数t96
- 8.13.2 让玩家输入他们的猜测t96
- 8.13.3 判断字母是否在这个
- 神秘单词中t97
- 8.13.4 判断玩家是否获胜t97
- 8.13.5 当玩家猜错时t97
- 8.13.6 检查玩家是否输了t98
- 8.13.7 结束并重新设置游戏t98
- 8.14 小结t99
- 第9章 Hangman扩展t101
- 9.1 添加更多的猜测机会t101
- 9.2 字典数据类型t102
- 9.2.1 用len()函数获取字典的
- 大小t103
- 9.2.2 字典和列表的区别t103
- 9.2.3 字典方法keys()和
- values()t104
- 9.2.4 在Hangman中使用单词的
- 字典t104
- 9.3 从一个列表中随机选取t105
- 9.4 从列表中删除项t106
- 9.5 多变量赋值t107
- 9.6 向玩家显示单词的分类t108
- 9.7 小结t109
- 第10章 Tic Tac Toet111
- 10.1 Tic Tac Toe的运行示例t112
- 10.2 Tic Tac Toe的源代码t113
- 10.3 设计程序t116
- 10.3.1 用数据表示游戏板t117
- 10.3.2 游戏AIt117
- 10.4 导入random模块t119
- 10.5 在屏幕上打印游戏板t119
- 10.6 让玩家来选择X或Ot120
- 10.7 决定谁先走t121
- 10.8 在游戏板上放置一个标记t121
- 10.8.1 列表引用t121
- 10.8.2 在makeMove()中使用
- 列表引用t124
- 10.9 判断玩家是否获胜t125
- 10.10 复制游戏板的数据t126
- 10.11 判断游戏板上的格子是否
- 为空t127
- 10.12 让玩家输入他们的落子t127
- 10.13 短路求值t128
- 10.14 从落子列表中选择一个
- 落子t130
- 10.15 None值t130
- 10.16 创建计算机的AIt131
- 10.16.1 计算机判断自己能否
- 落子即获胜t132
- 10.16.2 计算机判断玩家是否
- 可以落子即获胜t132
- 10.16.3 依次判断角、中心
- 和边t133
- 10.16.4 判断游戏板是否满了t133
- 10.17 游戏循环t134
- 10.17.1 决定玩家的符号和
- 谁先走t134
- 10.17.2 运行玩家的轮次t134
- 10.17.3 运行计算机的轮次t135
- 10.17.4 询问玩家是否再玩
- 一次t136
- 10.18 小结t136
- 第11章 推理游戏Bagelst137
- 11.1 Bagels的运行示例t138
- 11.2 Bagels的源代码t138
- 11.3 Bagels的流程图t140
- 11.4 导入random并定义
- getSecretNum()t140
- 11.5 打乱一组唯一数的顺序t141
- 11.5.1 用random.shuffle()函数改变
- 列表项的顺序t141
- 11.5.2 从打乱次序的数中获取神秘
- 数字t142
- 11.6 复合赋值操作符t142
- 11.7 计算要给出的线索t143
- 11.8 列表方法sort()t144
- 11.9 字符串方法join()t145
- 11.10 检查字符串中是否只包含
- 数字t145
- 11.11 游戏的开始t146
- 11.12 字符串插值t146
- 11.13 游戏循环t147
- 11.13.1 获取玩家的猜测t147
- 11.13.2 根据玩家的猜测给出
- 线索t148
- 11.13.3 判断玩家的输赢t148
- 11.13.4 询问玩家是否再玩
- 一局t148
- 11.14 小结t149
- 第12章 笛卡尔坐标t151
- 12.1 网格和笛卡尔坐标t151
- 12.2 负数t153
- 12.3 计算机屏幕的坐标系t154
- 12.4 数学技巧t155
- 12.4.1 技巧1:减号吃掉它左边
- 的加号t155
- 12.4.2 技巧2:两个减号合并为
- 一个加号t155
- 12.4.3 技巧3:加法的可
- 交换性t156
- 12.5 绝对值和abs()函数t156
- 12.6 小结t157
- 第13章 Sonar Treasure Hunt游戏t159
- 13.1 Sonar Treasure Hunt的运行
- 示例t160
- 13.2 Sonar Treasure Hunt的源
- 代码t162
- 13.3 设计程序t167
- 13.4 导入random、sys和math
- 模块t167
- 13.5 创建一个新的游戏板t167
- 13.6 绘制游戏板t168
- 13.6.1 在顶部绘制X轴t169
- 13.6.2 绘制海洋t170
- 13.6.3 打印出海洋中的行t170
- 13.6.4 在游戏板底部绘制X轴
- 坐标t171
- 13.7 创建随机的藏宝箱t171
- 13.8 判断一次移动是否有效t172
- 13.9 在游戏板上进行一次移动t172
- 13.9.1 找到最近的藏宝箱的
- 算法t172
- 13.9.2 使用列表方法remove()
- 删除值t175
- 13.9.3 获取玩家的移动t176
- 13.10 为玩家打印出游戏说明t177
- 13.11 游戏循环t177
- 13.11.1 为玩家显示游戏的
- 状态t179
- 13.11.2 处理玩家的移动t179
- 13.11.3 找到一个沉没的
- 藏宝箱t179
- 13.11.4 判断玩家是否赢了t180
- 13.11.5 判断玩家是否输了t180
- 13.11.6 用sys.exit()函数终止
- 程序t181
- 13.12 小结t181
- 第14章 凯撒密码t183
- 14.1 密码学和加密t184
- 14.2 凯撒密码简介t184
- 14.3 凯撒密码的运行示例t185
- 14.4 凯撒密码程序的源代码t186
- 14.5 设置最大键长度t187
- 14.6 决定加密还是解密t187
- 14.7 从玩家处得到消息t188
- 14.8 从玩家处得到密钥t188
- 14.9 加密或解密消息t188
- 14.9.1 使用字符串方法find()
- 找到所传递的字符串t189
- 14.9.2 加密或解密每个字母t190
- 14.10 程序开始t191
- 14.11 暴力破解t191
- 14.12 添加暴力破解模式t192
- 14.13 小结t193
- 第15章 Reversegam游戏t195
- 15.1 如何玩Reversegamt195
- 15.2 Reversegam的运行示例t198
- 15.3 Reversegam的源代码t200
- 15.4 导入模块和设置常量t205
- 15.5 游戏板数据结构t205
- 15.5.1 在屏幕上绘制游戏板数据
- 结构t205
- 15.5.2 创建一个新的游戏板数据
- 结构t206
- 15.6 判断一次落子是否有效t207
- 15.6.1 查看8个方向中的每一个
- 方向t208
- 15.6.2 发现是否有可以反转的
- 棋子t209
- 15.7 判断有效的坐标t210
- 15.7.1 得到所有有效移动的一个
- 列表t210
- 15.7.2 调用bool()函数t211
- 15.8 计算游戏板的得分t212
- 15.9 获取玩家的棋子选择t212
- 15.10 决定谁先走t213
- 15.11 在游戏板上落下一个棋子t213
- 15.12 复制游戏板数据结构t214
- 15.13 判断一个格子是否在
- 角落上t214
- 15.14 获取玩家的移动t214
- 15.15 获取计算机的移动t216
- 15.15.1 角落移动策略t216
- 15.15.2 获取最高得分的移动的
- 列表t217
- 15.16 在屏幕上打印分数t218
- 15.17 游戏开始t218
- 15.17.1 检查僵局t218
- 15.17.2 运行玩家的轮次t219
- 15.17.3 运行计算机的轮次t220
- 15.18 游戏循环t221
- 15.19 询问玩家是否再玩一局t222
- 15.20 小结t222
- 第16章 Reversegam AI模拟t223
- 16.1 让计算机和自己下棋t224
- 16.1.1 模拟程序1的运行
- 示例t224
- 16.1.2 模拟程序1的源代码t225
- 16.1.3 删除玩家提示并添加一个
- 计算机玩家t226
- 16.2 让计算机自己多玩几次t227
- 16.2.1 模拟程序2的运行
- 示例t227
- 16.2.2 模拟程序2的源代码t227
- 16.2.3 记录多次游戏t228
- 16.2.4 注释掉print()函数
- 调用t229
- 16.2.5 使用百分数评级AIt229
- 16.3 比较不同的AI算法t231
- 16.3.1 模拟程序3的源代码t231
- 16.3.2 模拟程序3的AI是
- 如何工作的t232
- 16.3.3 比较AIt235
- 16.4 小结t237
- 第17章 创建图形t239
- 17.1 安装pygamet240
- 17.2 pygame中的Hello Worldt240
- 17.3 运行pygame Hello World程序的
- 示例t240
- 17.4 pygame Hello World的
- 源代码t241
- 17.5 导入pygame模块t242
- 17.6 初始化pygamet243
- 17.7 设置pygame窗口t243
- 17.7.1 元组t243
- 17.7.2 Surface对象t244
- 17.8 设置颜色变量t244
- 17.9 将文本写到pygame窗口上t245
- 17.9.1 使用字体来样式化
- 文本t245
- 17.9.2 渲染一个Font对象t246
- 17.9.3 使用Rect属性设置文本
- 位置t247
- 17.10 用一种颜色填充一个Surface
- 对象t248
- 17.11 pygame的绘制函数t249
- 17.11.1 绘制一个多边形t249
- 17.11.2 绘制直线t250
- 17.11.3 绘制圆形t250
- 17.11.4 绘制椭圆形t251
- 17.11.5 绘制矩形t251
- 17.11.6 给像素着色t252
- 17.12 Surface对象的blit()方法t252
- 17.13 将Surface对象绘制到
- 屏幕上t253
- 17.14 事件和游戏循环t253
- 17.14.1 获取事件对象t253
- 17.14.2 退出程序t254
- 17.15 小结t254
- 第18章 动画图形t255
- 18.1 Animation程序的运行示例t255
- 18.2 Animation程序的源代码t256
- 18.3 让积木移动和弹回t258
- 18.4 设置常量变量t258
- 18.4.1 用于方向的常量变量t259
- 18.4.2 用于颜色的常量变量t260
- 18.5 设置积木数据结构t260
- 18.6 游戏循环t260
- 18.6.1 处理玩家退出的情况t261
- 18.6.2 移动每一个积木t261
- 18.6.3 弹跳一个积木t262
- 18.6.4 将积木绘制到窗口中
- 新的位置t263
- 18.6.5 在屏幕上绘制窗口t264
- 18.7 小结t264
- 第19章 碰撞检测t265
- 19.1 碰撞检测程序的运行示例t266
- 19.2 CollisioDetection程序的
- 源代码t266
- 19.3 导入模块t268
- 19.4 使用一个时钟来同步程序t268
- 19.5 创建窗口和数据结构t269
- 19.6 设置变量以记录移动t270
- 19.7 处理事件t270
- 19.7.1 处理KEYDOWN事件t271
- 19.7.2 处理KEYUP事件t273
- 19.8 转移玩家t274
- 19.9 添加新的食物方块t274
- 19.10 在屏幕上移动玩家t275
- 19.10.1 将玩家绘制到屏幕上t275
- 19.10.2 检查碰撞t276
- 19.11 在窗口上绘制食物方块t276
- 19.12 小结t277
- 第20章 声音和图像t279
- 20.1 使用精灵添加图像t279
- 20.2 声音文件和图像文件t280
- 20.3 Sprites and Sounds程序的
- 运行示例t281
- 20.4 Sprites and Sounds程序的
- 源代码t281
- 20.5 创建窗口和数据结构t284
- 20.5.1 添加一个精灵t284
- 20.5.2 改变一个精灵的大小t284
- 20.6 创建音乐和声音t285
- 20.6.1 添加声音文件t285
- 20.6.2 切换和关闭声音t285
- 20.7 把玩家绘制到窗口上t286
- 20.8 检查碰撞t286
- 20.9 在窗口中绘制樱桃t287
- 20.10 小结t287
- 第21章 带有声音和图像的Dodgert289
- 21.1 回顾pygame的基本数据
- 类型t289
- 21.2 Dodger的运行示例t290
- 21.3 Dodger的源代码t291
- 21.4 导入模块t295
- 21.5 创建常量t295
- 21.6 定义函数t296
- 21.6.1 终止和暂停游戏t296
- 21.6.2 记录和敌人的碰撞t297
- 21.6.3 将文本绘制到窗口t297
- 21.7 初始化pygame并设置窗口t298
- 21.8 设置Font、Sound和Image
- 对象t299
- 21.9 显示开始界面t300
- 21.10 开始游戏t300
- 21.11 游戏循环t302
- 21.11.1 处理键盘事件t302
- 21.11.2 处理鼠标移动t303
- 21.12 增加新的敌人t303
- 21.13 移动玩家角色和敌人t305
- 21.14 实现作弊模式t306
- 21.15 删除敌人t306
- 21.16 绘制窗口t307
- 21.16.1 绘制玩家的得分t307
- 21.16.2 绘制玩家角色和敌人t307
- 21.17 碰撞检测t308
- 21.18 游戏结束屏幕t308
- 21.19 修改Dodger游戏t309
- 21.20 小结t310