作譯者
本書提供作譯者介紹
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,我們將介紹大型項目的設計與實現方法。