《通过游戏编程实战教新手学C++编程》是2011年清华大学出版社出版的图书,作者是Michael Dawson。
基本介绍
- 书名:通过游戏编程实战教新手学C++编程
- 作者:(美) Michael Dawson
- 译者:万千
- ISBN:9787302271956
- 出版社:清华大学出版社
- 出版时间:2011 年11月
- 开本:16
- 丛书名:游戏开发经典丛书
作译者
本书提供作译者介绍
Michael Dawson是一位游戏编程图书的作者。他为UCLA Extension、The Digital Media Academy和The Los Angeles Film School开设并执教游戏编程课程,指导学生游戏编程的艺术与科学。另外,他的多部着作已成为国内多所大学的必读书目。
Mike以游戏製作人和设计师的身份进入游戏行业,同时还在一个玩家冒险游戏中担任主角——玩家控制的角色的名字就叫Mike Dawson。在游戏中,Dawson的大脑中被植入了外星人的胚胎,玩家要指挥数位化形象的Dawson在胚胎诞生之前阻止外星人的入侵。
Mike的着作
目录
《通过游戏编程实战教新手学c++编程》
第1章 类型、变数与标準
i/o:lost fortune 1
1.1 c++简介 1
1.1.1 使用c++编写游戏 1
1.1.2 生成执行档 2
1.1.3 错误处理 3
1.1.4 理解iso标準 3
1.2 编写第一个c++程式 4
1.2.1 game over程式简介 4
1.2.2 注释 5
1.2.3 使用空白字元 5
1.2.4 包含其他档案 5
1.2.5 定义main()函式 6
1.2.6 通过标準输出显示文本 6
1.2.7 语句的终止 7
1.2.8 从main()函式返回值 7
1.3 使用std名称空间 8
1.3.1 game over 2.0程式简介 8
1.3.2 使用using指令 8
.1.3.3 game over 3.0程式简介 8
1.3.4 使用using声明 9
1.3.5 使用using的时机 9
1.4 使用算术运算符 9
1.4.1 expensive calculator
程式简介 10
1.4.2 加法、减法与乘法 11
1.4.3 理解整型与浮点型除法 11
1.4.4 使用取模运算符 11
1.4.5 运算符的优先权 11
1.5 声明和初始化变数 12
1.5.1 game stats程式简介 12
1.5.2 基本类型 13
1.5.3 类型修饰符 13
1.5.4 变数声明 14
1.5.5 变数命名 15
1.5.6 变数的赋值 15
1.5.7 变数初始化 16
1.5.8 显示变数值 16
1.5.9 获取用户输入 17
1.5.10 为类型定义新名称 17
1.5.11 类型的选择 17
1.6 使用变数进行算术运算 18
1.6.1 game stats 2.0程式简介 18
1.6.2 修改变数值 19
1.6.3 使用组合赋值运算符 19
1.6.4 递增运算符与递减
运算符 20
1.6.5 整数的溢出处理 21
1.7 使用常量 21
1.7.1 game stats 3.0程式简介 21
1.7.2 使用常量 22
1.7.3 使用枚举类型 23
1.8 lost fortune简介 23
1.8.1 创建程式 24
1.8.2 从玩家获取信息 24
1.8.3 讲故事 25
1.9 本章小结 26
1.10 问与答 26
1.11 问题讨论 27
1.12 习题 27
第2章 真值、分支与游戏循环:
guess my number 29
2.1 理解真值 29
2.2 使用if语句 30
2.2.1 score rater程式简介 30
2.2.2 验证真与假 32
2.2.3 值的真与假 33
2.2.4 使用关係运算符 33
2.2.5 if语句的嵌套 34
2.3 使用else子句 34
2.3.1 score rater 2.0程式简介 34
2.3.2 创建分支 36
2.4 使用带else子句的if语句
序列 36
2.4.1 score rater 3.0程式简介 36
2.4.2 创建带else子句的if
语句序列 38
2.5 使用switch语句 38
2.5.1 menu chooser程式简介 39
2.5.2 创建多路分支 40
2.6 使用while循环 40
2.6.1 play again游戏简介 41
2.6.2 使用while循环 42
2.7 使用do循环 42
2.7.1 play again 2.0程式简介 42
2.7.2 使用do循环 43
2.8 使用break和continue
语句 44
2.8.1 finicky counter程式
简介 44
2.8.2 创建while(true)循环 45
2.8.3 使用break语句退出
循环 45
2.8.4 使用continue语句
跳转到循环开始 45
2.8.5 使用break和continue
的时机 46
2.9 使用逻辑运算符 46
2.9.1 designers network
程式简介 46
2.9.2 使用逻辑与运算符 48
2.9.3 使用逻辑或运算符 49
2.9.4 使用逻辑非运算符 49
2.9.5 运算符的优先权 50
2.10 随机数的生成 50
2.10.1 die roller程式简介 51
2.10.2 调用rand()函式 51
2.10.3 为随机数生成器
确定种子 52
2.10.4 在一定範围内计算 52
2.11 理解游戏主循环 53
2.12 guess my number
游戏简介 54
2.12.1 採用游戏主循环 54
2.12.2 初始化游戏 55
2.12.3 创建游戏主循环 56
2.12.4 游戏结束 56
2.13 本章小结 56
2.14 问与答 57
2.15 问题讨论 58
2.16 习题 59
第3章 for循环、字元串与数组:
word jumble 61
3.1 使用for循环 61
3.1.1 counter程式简介 62
3.1.2 使用for循环计数 63
3.1.3 在for循环中使用空
语句 64
3.1.4 for循环的嵌套 64
3.2 理解对象 65
3.3 使用string对象 66
3.3.1 string tester程式简介 67
3.3.2 创建string对象 68
3.3.3 string对象的连线 68
3.3.4 使用size()成员函式 69
3.3.5 索引string对象 69
3.3.6 循环访问string对象 70
3.3.7 使用find()成员函式 70
3.3.8 使用erase()成员函式 71
3.3.9 使用empty()成员函式 71
3.4 使用数组 72
3.4.1 hero's inventory程式
简介 72
3.4.2 创建数组 73
3.4.3 数组的索引 74
3.4.4 使用数组元素的成员
函式 75
3.4.5 数组边界 75
3.5 理解c风格字元串 76
3.6 使用多维数组 77
3.6.1 tic-tac-toe board
程式简介 77
3.6.2 创建多维数组 78
3.6.3 多维数组的索引 79
3.7 word jumble程式简介 79
3.7.1 创建程式 80
3.7.2 选择单词 80
3.7.3 单词乱序 81
3.7.4 欢迎界面 81
3.7.5 进入游戏主循环 82
3.7.6 游戏结束 82
3.8 本章小结 82
3.9 问与答 83
3.10 问题讨论 84
3.11 习题 85
第4章 标準模板库:hangman 87
4.1 标準模板库简介 87
4.2 使用vector 88
4.2.1 hero's inventory 2.0
程式简介 88
4.2.2 使用向量的準备工作 90
4.2.3 向量的声明 90
4.2.4 使用push_back()成员
函式 91
4.2.5 使用size()成员函式 91
4.2.6 向量的索引 91
4.2.7 调用元素的成员函式 92
4.2.8 使用pop_back()成员
函式 92
4.2.9 使用clear()成员函式 92
4.2.10 使用empty()成员函式 92
4.3 使用叠代器 93
4.3.1 hero's inventory 3.0
程式简介 93
4.3.2 叠代器的声明 94
4.3.3 循环访问向量 95
4.3.4 修改向量元素的值 97
4.3.5 访问向量元素的成员
函式 97
4.3.6 使用向量的成员函式
insert() 98
4.3.7 使用向量的成员函式
erase() 98
4.4 使用算法 99
4.4.1 high scores程式简介 99
4.4.2 使用算法的準备工作 101
4.4.3 使用find()算法 101
4.4.4 使用random_shuffle()
算法 101
4.4.5 使用sort()算法 102
4.5 理解向量的性能 102
4.5.1 向量的增长 103
4.5.2 元素的插入与删除 104
4.6 其他stl容器 104
4.7 对程式进行规划 105
4.7.1 使用伪代码 105
4.7.2 逐步细化 106
4.8 hangman简介 106
4.8.1 游戏规划 107
4.8.2 创建程式 107
4.8.3 变数与常量的初始化 108
4.8.4 进入游戏主循环 108
4.8.5 获取玩家的猜测 108
4.8.6 游戏结束 109
4.9 本章小结 110
4.10 问与答 110
4.11 问题讨论 111
4.12 习题 111
第5章 函式:mad lib 113
5.1 创建函式 113
5.1.1 instructions程式简介 113
5.1.2 函式声明 114
5.1.3 函式定义 115
5.1.4 函式调用 115
5.1.5 理解抽象 115
5.2 使用形参和返回值 116
5.2.1 yes or no程式简介 116
5.2.2 返回值 117
5.2.3 传递参数值 118
5.2.4 理解封装 119
5.3 理解软体重用 120
5.4 使用作用域 120
5.4.1 scoping程式简介 120
5.4.2 使用独立的作用域 122
5.4.3 使用嵌套作用域 123
5.5 使用全局变数 124
5.5.1 global reach程式简介 124
5.5.2 声明全局变数 125
5.5.3 访问全局变数 125
5.5.4 隐藏全局变数 125
5.5.5 修改全局变数 126
5.5.6 儘量少使用全局变数 126
5.6 使用全局常量 126
5.7 使用默认参数 127
5.7.1 give me a number
程式简介 127
5.7.2 指定默认参数 128
5.7.3 为形参设定默认参数 129
5.7.4 重写默认参数 129
5.8 函式重载 130
5.8.1 triple程式简介 130
5.8.2 创建重载函式 131
5.8.3 调用重载函式 131
5.9 内联函式 132
5.9.1 taking damage
程式简介 132
5.9.2 函式内联的指定 133
5.9.3 调用内联函式 133
5.10 mad lib游戏简介 134
5.10.1 创建程式 134
5.10.2 main()函式 135
5.10.3 asktext()函式 135
5.10.4 asknumber()函式 135
5.10.5 tellstory()函式 136
5.11 本章小结 136
5.12 问与答 137
5.13 问题讨论 138
5.14 习题 138
第6章 引用:tic-tac-toe 139
6.1 使用引用 139
6.1.1 referencing程式简介 139
6.1.2 创建引用 140
6.1.3 访问被引用的值 141
6.1.4 修改被引用的值 141
6.2 通过传递引用改变实参 142
6.2.1 swap程式简介 142
6.2.2 按值传递参数 144
6.2.3 按引用传递参数 144
6.3 传递引用以提高效率 145
6.3.1 inventory displayer
程式简介 145
6.3.2 引用传递的陷阱 146
6.3.3 以常量引用声明参数 146
6.3.4 传递常量引用 147
6.4 如何传递实参 147
6.5 返回引用 148
6.5.1 inventory referencer
程式简介 148
6.5.2 返回一个引用 149
6.5.3 显示返回的引用的值 150
6.5.4 将返回的引用赋值给
引用 150
6.5.5 将返回的引用赋值给
变数 150
6.5.6 通过返回的引用修改
对象 150
6.6 tic-tac-toe游戏简介 151
6.6.1 游戏规划 151
6.6.2 创建程式 153
6.6.3 main()函式 154
6.6.4 instructions()函式 155
6.6.5 askyesno()函式 155
6.6.6 asknumber()函式 156
6.6.7 humanpiece()函式 156
6.6.8 opponent()函式 156
6.6.9 displayboard()函式 157
6.6.10 winner()函式 157
6.6.11 islegal()函式 158
6.6.12 humanmove()函式 159
6.6.13 computermove()函式 159
6.6.14 announcewinner()函式 161
6.7 本章小结 162
6.8 问与答 162
6.9 问题讨论 164
6.10 习题 164
第7章 指针:tic-tac-toe 2.0 165
7.1 指针基础 165
7.1.1 pointing程式简介 166
7.1.2 指针的声明 167
7.1.3 指针的初始化 168
7.1.4 将地址赋值给指针 168
7.1.5 指针的解引用 169
7.1.6 指针的重新赋值 169
7.1.7 使用对象的指针 170
7.2 指针和常量 171
7.2.1 使用常量指针 171
7.2.2 使用指向常量的指针 172
7.2.3 使用指向常量的常量
指针 172
7.2.4 常量与指针小结 173
7.3 传递指针 173
7.3.1 swap pointer version
程式简介 173
7.3.2 值传递 175
7.3.3 传递常量指针 175
7.4 返回指针 176
7.4.1 inventory pointer
程式简介 176
7.4.2 返回指针 178
7.4.3 使用返回的指针显示值 179
7.4.4 将返回的指针赋值给
指针 179
7.4.5 将返回的指针指向的值
赋值给变数 179
7.4.6 通过返回的指针修改
对象 180
7.5 理解指针与数组的关係 181
7.5.1 array passer程式简介 181
7.5.2 将数组名用作常量指针 182
7.5.3 数组的传递与返回 182
7.6 tic-tac-toe 2.0程式简介 183
7.7 本章小结 184
7.8 问与答 185
7.9 问题讨论 186
7.10 习题 186
第8章 类:critter caretaker 187
8.1 定义新类型 187
8.1.1 simple critter程式简介 187
8.1.2 类的定义 189
8.1.3 成员函式的定义 189
8.1.4 对象的实例化 190
8.1.5 数据成员的访问 190
8.1.6 成员函式的调用 190
8.2 使用构造函式 191
8.2.1 constructor critter
程式简介 191
8.2.2 构造函式的声明与定义 192
8.2.3 构造函式的自动调用 193
8.3 设定成员访问级别 193
8.3.1 private critter程式简介 193
8.3.2 指定公有与私有访问
级别 195
8.3.3 定义访问器成员函式 196
8.3.4 定义常量成员函式 197
8.4 使用静态数据成员与
静态成员函式 197
8.4.1 static critter程式简介 197
8.4.2 声明与初始化静态
数据成员 199
8.4.3 访问静态数据成员 199
8.4.4 声明与定义静态成员
函式 200
8.4.5 调用静态成员函式 200
8.5 critter caretaker游戏简介 201
8.5.1 游戏规划 201
8.5.2 规划伪代码 202
8.5.3 critter类 202
8.5.4 main()函式 205
8.6 本章小结 206
8.7 问与答 207
8.8 问题讨论 208
8.9 习题 208
第9章 高级类与动态记忆体:
game lobby 211
9.1 使用聚合体 211
9.1.1 critter farm程式简介 212
9.1.2 使用对象数据成员 213
9.1.3 使用容器数据成员 214
9.2 使用友元函式与运算符
重载 215
9.2.1 friend critter程式简介 215
9.2.2 创建友元函式 217
9.2.3 运算符重载 217
9.3 动态分配记忆体 218
9.3.1 heap程式简介 218
9.3.2 使用new运算符 220
9.3.3 使用delete运算符 221
9.3.4 避免记忆体泄漏 221
9.4 使用数据成员与堆 223
9.4.1 heap data member
程式简介 223
9.4.2 声明指向堆中值的
指针数据成员 225
9.4.3 声明与定义析构函式 226
9.4.4 声明与定义拷贝
构造函式 227
9.4.5 赋值运算符的重载 229
9.5 game lobby程式简介 231
9.5.1 player类 232
9.5.2 lobby类 233
9.5.3 lobby::addplayer()
成员函式 234
9.5.4 lobby::removeplayer()
成员函式 236
9.5.5 lobby::clear()成员函式 237
9.5.6 operator[[()成员函式 237
9.5.7 main()函式 237
9.6 本章小结 238
9.7 问与答 239
9.8 问题讨论 240
9.9 习题 240
第10章 继承与多态:blackjack 241
10.1 继承简介 241
10.1.1 simple boss程式
简介 242
10.1.2 从基类派生 244
10.1.3 从派生类实例化
对象 245
10.1.4 使用继承成员 245
10.2 继承访问权的控制 246
10.2.1 simple boss 2.0
程式简介 246
10.2.2 对类成员使用访问
修饰符 247
10.2.3 使用访问修饰符
修饰派生类 247
10.3 调用与重写基类成员
函式 248
10.3.1 overriding boss
程式简介 248
10.3.2 调用基类构造函式 250
10.3.3 声明虚基类成员函式 250
10.3.4 重写虚基类成员函式 251
10.3.5 调用基类成员函式 251
10.4 在派生类中使用重载赋值
运算符与拷贝构造函式 252
10.5 多态简介 253
10.5.1 polymorphic bad guy
程式简介 253
10.5.2 使用基类指针指向
派生类对象 255
10.5.3 定义虚析构函式 256
10.6 使用抽象类 257
10.6.1 abstract creature
程式简介 257
10.6.2 声明纯虚函式 258
10.6.3 从抽象类派生类 259
10.7 blackjack游戏简介 259
10.7.1 类的设计 260
10.7.2 规划游戏的逻辑 263
10.7.3 card类 264
10.7.4 hand类 265
10.7.5 genericplayer类 267
10.7.6 player类 268
10.7.7 house类 269
10.7.8 deck类 270
10.7.9 game类 272
10.7.10 main()函式 275
10.8 本章小结 277
10.9 问与答 277
10.10 问题讨论 278
10.11 习题 279
附录a 创建第一个c++程式 281
附录b 运算符优先权 285
附录c 关键字 287
附录d ascii字元表 289
附录e 转义序列 295
前言
好莱坞能带来最好视觉效果、声乐效果以及纯粹的兴奋,顶级的计算机游戏也完全可以与其媲美。但是游戏这种娱乐方式与其他方式不同,它们能让玩家一连好几个小时守在萤幕跟前。能让游戏如此与众不同并且引人入胜的原因在于互动性。在计算机游戏中,我们不是坐下来观看主人公如何与怪物搏斗,而是自己担任主角。
实现这种互动性的关键在于编程。编程让外星生物、外星人进攻中队或整支敌人军队在不同情况下对玩家做出不同的反应。编程让游戏的故事情节能够以新的方式展开。实际上,作为编程的结果,游戏可能以编写者想像不到的方式与玩家进行互动。
儘管有数以千计的计算机程式语言,但是C++是游戏行业的标準语言。如果去您最喜爱的商场的PC游戏区逛逛,并随手拿起一款游戏,它主要或完全用C++编写的可能性非常大。如果想要更加专业地编写计算机游戏,就必须了解C++。
本书的目的在于从游戏编程的角度介绍C++语言。儘管没有哪本书可以让人同时掌握C++与游戏编程这两门高深的主题,但是本书可以作为这两个主题的入门。
本书读者对象
本书适合任何想编写游戏的读者,主要针对初学者,并假设读者之前没有任何编程经验。如果您可以熟练使用计算机,则马上可以开始您的游戏编程之旅。虽然本书是写给初学者的,但并不代表学习C++与游戏编程很简单。您必须阅读本书,并在实验中实践。读完本书,您将为掌握C++这门游戏程式语言打下坚实的基础。
本书组织方式
本书从C++与游戏编程的基础开始,假设读者对两者都没有经验。随着章节的推进,本书将在已学内容的基础上介绍更高级的内容。
本书的每一章介绍一个或几个相关主题。在介绍概念的同时会给出长度较短并且与游戏相关的程式来进行演示。每章的结尾会在一个游戏项目中将一些最重要的概念组合起来。本书最后一章以一个最具雄心的项目来结束,它涵盖了本书介绍过的所有主要概念。
除了介绍C++与游戏编程之外,本书还介绍如何组织编程工作,如何将问题分解为可管理的子问题块,以及如何精炼代码。您有时会遇到一些困难,但总是可以克服。总体而言,学习过程是充满乐趣的。在学习过程中,您将创建一些极妙的计算机游戏,并理解一些游戏编程的技巧。
第1章:类型、变数与标準I/O:Lost Fortune。本章将介绍游戏行业标準语言C++的基础,以及如何在控制台视窗显示输出、执行算术计算、使用变数以及从键盘获取用户输入。
第2章:真值、分支与游戏循环:Guess My Number。通过编程让程式根据某种条件执行、跳转以及重複执行代码块,您将创建一些更加有趣的游戏。本章将介绍如何生成随机数来增加游戏的不可预测性,还将介绍游戏循环——组织游戏不断运行的基本方式。
第3章:for循环、字元串与数组:Word Jumble。本章将介绍序列与字元串(非常适合单词游戏的字元序列),以及软体对象(用于表示游戏中对象的实体,譬如外星飞行器、生命药水甚至玩家自身)。
第4章:标準模板库:Hangman。本章将介绍一个功能强大的库(游戏程式设计师甚至非游戏程式设计师依赖它来存储对象的集合,譬如玩家物品栏中的物品),还有协助程式设计师规划更大型游戏程式的技术。
第5章:函式:Mad Lib。本章将介绍如何将游戏程式分解为更小的、可管理的代码块。分解方法是使用游戏程式中的基本逻辑单元:函式。
第6章:引用:Tic-Tac-Toe。本章将介绍如何在程式的不同部分使用高效与清晰的方式共享信息,一个简单的AI(人工智慧)例子,以及为计算机对手赋予一些人格的方法。
第7章:指针:Tic-Tac-Toe 2.0。本章将介绍C++的一些最底层与最强大的特徵,如直接对计算机记忆体进行定址与操作的方法。
第8章:类:Critter Caretaker。本章将介绍如何创建自定义类型的对象,以及如何通过面向对象编程来定义对象之间的互动方式。在学习过程中,您将创建要照顾的自己的动物。
第9章:高级类与动态记忆体:Game Lobby。本章将介绍如何扩展与计算机之间直接的连线,以及按照游戏程式需求获取与释放记忆体的方法,还有使用“动态”记忆体的隐患与避免方法。
第10章:继承与多态:Blackjack。本章将介绍根据其他对象来定义新对象的方法,随后将所有学过的知识融汇到一个大型游戏中。通过创建经典的赌博游戏Blackjack,我们将介绍大型项目的设计与实现方法。