《Python编程初学者指南》PDF下载

  • 购买积分:13 如何计算积分?
  • 作  者:(美)道森著
  • 出 版 社:北京:人民邮电出版社
  • 出版年份:2014
  • ISBN:9787115361448
  • 页数:392 页
图书介绍:本书是为Python初学者量身打造的一本书,其特色在于通过众多较小的、有趣的游戏编程实例来教授Python编程知识,让学习Python的过程充满了乐趣。本书详细介绍了Python类型、变量、I/O,流程控制,循环,字符串,列表和字典;函数、文件和软件对象;面向对象编程和GUI开发,图形和声音编程等等。

第1章 启程:Game Over程序 1

1.1 剖析Game Over程序 1

1.2 Python 简介 2

1.2.1 Python易于使用 3

1.2.2 Python功能强大 3

1.2.3 Python是面向对象的 3

1.2.4 Python是一种“胶水”语言 4

1.2.5 Python无所不在 4

1.2.6 Python有一个强大的社区 4

1.2.7 Python是免费的、开源的 4

1.3 在Windows上设置Python 4

1.4 在其他操作系统上设置Python 5

1.5 IDLE简介 6

1.5.1 通过交互模式进行编程 6

1.5.2 通过脚本模式进行编程 9

1.6 回到Game Over程序 11

1.6.1 使用注释 12

1.6.2 使用空行 13

1.6.3 打印字符串 13

1.6.4 等待用户 13

1.7 小结 14

第2章 类型、变量以及简单I/O:Useless Trivia程序 15

2.1 Useless Trivia程序简介 15

2.2 使用引号和字符串 16

2.2.1 Game Over 2.0程序简介 16

2.2.2 在字符串内部使用引号 17

2.2.3 打印输出多个值 18

2.2.4 为print指定结束字符串 19

2.2.5 创建三重引号字符串 19

2.3 使用转义序列和字符串 20

2.3.1 FancyCredits程序简介 20

2.3.2 前进一个制表符位 21

2.3.3 打印反斜杠 22

2.3.4 插入换行符 22

2.3.5 插入引号 22

2.3.6 触发系统蜂鸣器 23

2.4 字符串的连接和重复 23

2.4.1 Silly Strings程序简介 24

2.4.2 字符串的连接 25

2.4.3 使用行继续符 25

2.4.4 字符串的重复 25

2.5 使用数字 26

2.5.1 Word Problems程序简介 26

2.5.2 解数值类型 27

2.5.3 使用数学运算符 27

2.6 理解变量 28

2.6.1 Greeter程序简介 29

2.6.2 创建变量 29

2.6.3 使用变量 30

2.6.4 变量命名 30

2.7 获取输入 31

2.7.1 PersonalGreeter程序简介 31

2.7.2 使用input()函数 32

2.8 使用字符串方法 33

2.8.1 Quotation Manipulation程序简介 34

2.8.2 通过字符串方法创建新字符串 35

2.9 使用正确的类型 37

2.9.1 Trust Fund Buddy-Bad程序简介 37

2.9.2 跟踪逻辑错误 38

2.10 转换值的类型 39

2.10.1 TrustFundBuddy-Good程序简介 39

2.10.2 将字符串转换成整数 40

2.10.3 使用复合赋值运算符 41

2.11 回到Useless Trivia程序 42

2.11.1 创建初始注释 42

2.11.2 获取用户输入 43

2.11.3 打印小写和大写形式的name 43

2.11.4 打印name五次 43

2.11.5 计算秒数 44

2.11.6 计算moon_weight和sun_weight 44

2.11.7 等一等用户 44

2.12 小结 44

第3章 条件分支、while循环以及程序策划:Guess My Number游戏 46

3.1 Guess My Number游戏简介 46

3.2 生成随机数 47

3.2.1 Craps Roller程序简介 47

3.2.2 引入random模块 48

3.2.3 使用randint()函数 49

3.2.4 使用randrange()函数 49

3.3 使用if语句 49

3.3.1 Password程序简介 50

3.3.2 观察if语句 51

3.3.3 创建条件 51

3.3.4 理解比较运算符 52

3.3.5 通过缩进创建代码块 53

3.3.6 构建自己的if语句 53

3.4 使用else子句 53

3.4.1 Grated or Denied程序简介 54

3.4.2 观察else子句 55

3.5 使用elif子句 55

3.5.1 Mood Computer程序简介 56

3.5.2 观察elif子句 58

3.6 创建while循环 59

3.6.1 Three-Year-OldSimulator程序简介 60

3.6.2 观察while循环 60

3.6.3 初始化哨兵变量 61

3.6.4 检查哨兵变量 61

3.6.5 更新哨兵变量 62

3.7 避免无限循环 62

3.7.1 LosingBattle程序简介 62

3.7.2 跟踪程序 64

3.7.3 创建可以变成False的条件 64

3.8 将值用作条件 65

3.8.1 Maitre D'程序简介 66

3.8.2 把值解释为True或False 67

3.9 故意创建无限循环 67

3.9.1 Finicky Counter程序简介 68

3.9.2 通过break语句退出循环 68

3.9.3 通过continue语句跳回循环的开头 69

3.9.4 理解break和continue的使用场景 69

3.10 使用复合条件 69

3.10.1 Exclusive Network程序简介 70

3.10.2 理解逻辑运算符not 72

3.10.3 理解逻辑运算符and 73

3.10.4 理解逻辑运算符or 74

3.11 规划程序 74

3.11.1 利用伪码编制算法 75

3.11.2 逐步对算法进行提炼 75

3.12 回到Guess My Number游戏 76

3.12.1 程序规划 76

3.12.2 创建初始注释块 77

3.12.3 引入random模块 77

3.12.4 游戏说明 77

3.12.5 设置初始值 77

3.12.6 创建猜测循环 78

3.12.7 向玩家表示祝贺 78

3.12.8 等待玩家退出 78

3.13 小结 78

第4章 for循环、字符串以及元组:Word Jumble游戏 80

4.1 Word Jumble游戏简介 80

4.2 使用for循环 81

4.2.1 Loopy String程序简介 81

4.2.2 理解for循环 82

4.2.3 创建for循环 83

4.3 通过for循环进行计数 83

4.3.1 Counter程序简介 83

4.3.2 前向计数 84

4.3.3 按五为单位进行计数 85

4.3.4 后向计数 85

4.4 对字符串使用序列运算符和函数 86

4.4.1 Message Analyzer程序简介 86

4.4.2 使用len()函数 87

4.4.3 使用in运算符 87

4.5 对字符串进行索引 88

4.5.1 Random Access程序简介 88

4.5.2 使用正的位置编号 89

4.5.3 使用负的位置编号 90

4.5.4 随机访问字符串元素 91

4.6 理解字符串的不变性 92

4.7 构建新字符串 93

4.7.1 No Vowels程序简介 93

4.7.2 创建常量 94

4.7.3 通过已有的字符串创建新字符串 95

4.8 对字符串进行切片操作 96

4.8.1 Pizza Slicer程序简介 96

4.8.2 理解None 97

4.8.3 理解切片 98

4.8.4 创建切片 98

4.8.5 使用切片速记法 99

4.9 创建元组 99

4.9.1 Hero'sInventory程序简介 100

4.9.2 创建空元组 101

4.9.3 把元组当作条件 101

4.9.4 创建带有元素的元组 102

4.9.5 打印元组 102

4.9.6 遍历元组中的元素 102

4.10 使用元组 103

4.10.1 Hero's Inventory 2.0程序简介 103

4.10.2 准备工作 104

4.10.3 对元组使用len()函数 104

4.10.4 对元组使用in运算符 104

4.10.5 对元组进行索引 105

4.10.6 对元组进行切片 105

4.10.7 理解元组的不变性 106

4.10.8 元组的连接操作 106

4.11 回到Word Jumble游戏 107

4.11.1 准备工作 107

4.11.2 对题目的创建部分进行设计 107

4.11.3 创建空的题目字符串 108

4.11.4 设置循环 108

4.11.5 产生word中的随机位置 108

4.11.6 创建新版的jumble 108

4.11.7 创建新版的word 109

4.11.8 欢迎玩家的到来 109

4.11.9 获取玩家的答案 109

4.11.10 向玩家表示恭喜 109

4.11.11 结束游戏 110

4.12 小结 110

第5章 列表和字典:Hangman游戏 111

5.1 Hangman游戏简介 111

5.2 使用列表 113

5.2.1 Hero's Inventory 3.0程序简介 113

5.2.2 创建列表 114

5.2.3 对列表使用len()函数 114

5.2.4 对列表使用in运算符 114

5.2.5 对列表进行索引 114

5.2.6 对列表进行切片 115

5.2.7 对列表进行连接 115

5.2.8 理解列表的可变性 115

5.2.9 通过索引对列表元素进行赋值 116

5.2.10 通过切片对列表进行赋值 116

5.2.11 删除列表元素 116

5.2.12 删除列表切片 117

5.3 使用列表方法 117

5.3.1 High Scores程序简介 117

5.3.2 准备工作 118

5.3.3 显示菜单 118

5.3.4 退出程序 119

5.3.5 显示得分记录 119

5.3.6 添加得分记录 119

5.3.7 删除得分记录 120

5.3.8 对得分记录进行排序 120

5.3.9 处理无效选项 121

5.3.10 等一等用户 121

5.4 理解元组和列表的使用场景 122

5.5 使用嵌套序列 122

5.5.1 High Scores 2.0程序简介 122

5.5.2 创建嵌套序列 123

5.5.3 访问嵌套元素 124

5.5.4 序列的解包 125

5.5.5 准备工作 125

5.5.6 访问嵌套的元组并显示得分 126

5.5.7 通过附加嵌套元组的方式添加得分记录 126

5.5.8 处理无效菜单项 126

5.5.9 等一等用户 126

5.6 理解共享引用 127

5.7 使用字典 129

5.7.1 GeekTranslator程序简介 129

5.7.2 创建字典 130

5.7.3 访问字典的值 130

5.7.4 准备工作 132

5.7.5 获取值 133

5.7.6 增加键值对 133

5.7.7 替换键值对 134

5.7.8 删除键值对 134

5.7.9 结束程序 135

5.7.10 理解字典的需求 135

5.8 回到Hangman游戏 136

5.8.1 准备工作 136

5.8.2 创建常量 137

5.8.3 初始化变量 140

5.8.4 创建主循环 140

5.8.5 获取用户的答案 140

5.8.6 判断猜测结果 141

5.8.7 结束程序 141

5.9 小结 142

第6章 函数:Tic-Tac-Toe游戏 143

6.1 Tic-Tac-Toe游戏简介 143

6.2 创建函数 144

6.2.1 Instructions程序简介 145

6.2.2 定义函数 146

6.2.3 编制函数的文档说明 146

6.2.4 调用函数 147

6.2.5 理解抽象 147

6.3 使用参数和返回值 147

6.3.1 Receive and Return程序简介 148

6.3.2 通过参数获取信息 149

6.3.3 通过返回值反馈信息 149

6.3.4 理解封装 150

6.3.5 在同一个函数中接收和返回值 150

6.3.6 理解软件复用 151

6.4 使用关键字参数和默认参数值 152

6.4.1 Birthday Wishes程序简介 152

6.4.2 使用位置形参和位置实参 153

6.4.3 使用位置形参和关键字实参 154

6.4.4 使用默认参数值 154

6.5 使用全局变量和常量 156

6.5.1 理解作用域 156

6.5.2 Global Reach程序简介 157

6.5.3 从函数内部读取全局变量 158

6.5.4 在函数内部屏蔽全局变量 158

6.5.5 从函数内部修改全局变量 159

6.5.6 理解何时使用全局变量和常量 159

6.6 回到Tic-Tac-Toe游戏 160

6.6.1 规划Tic-Tac-Toe游戏 160

6.6.2 准备工作 162

6.6.3 display_instruct()函数 162

6.6.4 ask_yes_no()函数 163

6.6.5 ask number()函数 163

6.6.6 pieces()函数 164

6.6.7 new board()函数 164

6.6.8 display_board()数 164

6.6.9 legal moves()函数 165

6.6.10 winner()函数 165

6.6.11 human_move()函数 166

6.6.12 computer move()函数 167

6.6.13 next_turn()函数 169

6.6.14 congrat winner()函数 169

6.6.15 main()函数 170

6.6.16 启动程序 171

6.7 小结 171

第7章 文件和异常:Trivia Challenge游戏 172

7.1 Trivia Challenge游戏简介 172

7.2 读取文本文件 173

7.2.1 Read It程序简介 173

7.2.2 文件的打开和关闭 175

7.2.3 按字符读取文件 176

7.2.4 按行读取文件 177

7.2.5 将所有行读取为一个列表 178

7.2.6 对文件进行循环遍历 178

7.3 写入文本文件 179

7.3.1 Write It程序简介 179

7.3.2 将字符串写入到文件 180

7.3.3 将字符串列表写入到文件 180

7.4 在文件中存储复杂数据 182

7.4.1 Pickle It程序简介 182

7.4.2 对数据进行Pickle处理并写入文件 182

7.4.3 读取文件中的数据并进行反Pickle处理 184

7.4.4 通过shelf保存序列化对象 185

7.4.5 通过shelf获取序列化对象 186

7.5 处理异常 187

7.5.1 Handle It程序简介 187

7.5.2 使用try语句及except子句 188

7.5.3 指定异常类型 188

7.5.4 处理多种异常 190

7.5.5 获取异常的参数 191

7.5.6 力上一个else子句 191

7.6 回到Trivia Challenge游戏 192

7.6.1 理解数据文件结构 192

7.6.2 open_file()函数 193

7.6.3 next_line()函数 194

7.6.4 next_block()函数 194

7.6.5 welcome()函数 195

7.6.6 游戏初始化设置 195

7.6.7 提出问题 195

7.6.8 获取答案 196

7.6.9 判断答案 196

7.6.10 获取下一个问题 196

7.6.11 结束游戏 196

7.6.12 启动main()函数 197

7.7 小结 197

第8章 软件对象:Critter Caretaker程序 198

8.1 Critter Caretaker程序简介 198

8.2 理解面向对象基础知识 200

8.3 创建类、方法和对象 200

8.3.1 Simple Critter程序简介 201

8.3.2 定义类 202

8.3.3 定义方法 202

8.3.4 实例化对象 203

8.3.5 调用方法 203

8.4 使用构造器 203

8.4.1 Constructor Critter程序简介 203

8.4.2 创建构造器 204

8.4.3 创建多个对象 205

8.5 使用特性 205

8.5.1 Attribute Critter程序简介 205

8.5.2 初始化特性 207

8.5.3 访问特性 208

8.5.4 打印对象 208

8.6 使用类特性和静态方法 209

8.6.1 Classy Critter程序简介 209

8.6.2 创建类特性 211

8.6.3 访问类特性 211

8.6.4 创建静态方法 212

8.6.5 调用静态方法 212

8.7 理解对象封装 213

8.8 使用私有特性和私有方法 213

8.8.1 Private Critter程序简介 214

8.8.2 创建私有特性 214

8.8.3 访问私有特性 215

8.8.4 创建私有方法 216

8.8.5 访问私有方法 216

8.8.6 尊重对象的隐私 217

8.8.7 理解何时该实现私有策略 217

8.9 控制对特性的访问 218

8.9.1 PropertyCritter程序简介 218

8.9.2 创建属性 219

8.9.3 访问属性 220

8.10 回到Critter Caretaker程序 221

8.10.1 Critter类 222

8.10.2 创建Critter 224

8.10.3 创建菜单系统 224

8.10.4 启动程序 225

8.11 小结 225

第9章 面向对象编程:Blackjack游戏 227

9.1 Blackjack游戏简介 227

9.2 发送和接收消息 228

9.2.1 Alien Blaster程序简介 228

9.2.2 发送消息 230

9.2.3 接收消息 231

9.3 组合多个对象 231

9.3.1 Playing Cards程序简介 231

9.3.2 创建Card类 232

9.3.3 创建Hand类 232

9.3.4 使用Card对象 233

9.3.5 通过Hand对象将多个Card对象组合起来 234

9.4 通过继承创建新类 235

9.5 通过继承扩展类 235

9.5.1 Playing Cards 2.0程序简介 235

9.5.2 创建一个基类 236

9.5.3 继承基类 237

9.5.4 扩展派生类 238

9.5.5 使用派生类 239

9.6 改变继承方法的行为 241

9.6.1 Playing Cards 3.0程序简介 241

9.6.2 创建基类 242

9.6.3 重写基类方法 242

9.6.4 调用基类方法 243

9.6.5 使用派生类 244

9.7 理解多态 245

9.8 创建模块 245

9.8.1 Simple Game程序简介 246

9.8.2 编写模块 246

9.8.3 引入模块 248

9.8.4 使用引入的函数和类 248

9.9 回到Blackjack游戏 249

9.9.1 cards模块 249

9.9.2 对类进行设计 251

9.9.3 为游戏循环编写伪码 252

9.9.4 引入cards和games模块 253

9.9.5 BJ_Card类 253

9.9.6 BJ_Deck类 254

9.9.7 BJ_Hantd类 254

9.9.8 BJ_Player类 256

9.9.9 BJ_Dealer类 256

9.9.10 BJ_Game类 257

9.9.11 main()函数 259

9.10 小结 260

第10章 GUI开发:Mad Lib程序 262

10.1 Mad Lib程序简介 262

10.2 详解GUI 264

10.3 理解事件驱动编程 265

10.4 使用根窗体 266

10.4.1 Simple GUI程序简介 266

10.4.2 引入tkinter 模块 268

10.4.3 创建根窗体 268

10.4.4 修整根窗体 268

10.4.5 进入根窗体的事件循环 269

10.5 使用标签 269

10.5.1 Labeler程序简介 269

10.5.2 准备工作 269

10.5.3 创建框架 270

10.5.4 创建标签 270

10.5.5 进入根窗体的事件循环 271

10.6 使用按钮 271

10.6.1 LazyButtons程序简介 271

10.6.2 准备工作 271

10.6.3 创建按钮 272

10.6.4 进入根窗体的事件循环 273

10.7 利用类创建GUI 273

10.7.1 LazyButtons 2程序简介 273

10.7.2 引入tkinter模块 273

10.7.3 定义Application类 273

10.7.4 定义构造器方法 274

10.7.5 定义一个用于创建小部件的方法 274

10.7.6 创建Application对象 275

10.8 将小部件与事件处理器绑定起来 275

10.8.1 Click Counter程序简介 275

10.8.2 准备工作 275

10.8.3 绑定事件处理器 276

10.8.4 创建事件处理器 276

10.8.5 程序收尾工作 277

10.9 使用Text和Entry小部件以及Grid布局管理器 277

10.9.1 Longevity程序简介 277

10.9.2 准备工作 278

10.9.3 利用Grid布局管理器放置小部件 278

10.9.4 创建Entry小部件 279

10.9.5 创建Text小部件 280

10.9.6 利用文本型小部件获取和插入文本 280

10.9.7 收尾工作 281

10.10 使用复选框 282

10.10.1 Movie Chooser程序简介 282

10.10.2 准备工作 282

10.10.3 使小部件的容器成为其唯一的引用 283

10.10.4 创建复选框 283

10.10.5 获取复选框的状态 285

10.10.6 收尾工作 285

10.11 使用单选框 286

10.11.1 MovieChooser2程序简介 286

10.11.2 准备工作 286

10.11.3 创建单选框 287

10.11.4 从一组单选框中获取选定值 288

10.11.5 收尾工作 289

10.12 回到Mad Lib程序 289

10.12.1 引入tkinter模块 289

10.12.2 Application类的构造器方法 289

10.12.3 Application类的create_widgets()方法 290

10.12.4 Application类的tell_story()方法 292

10.12.5 程序的主体部分 293

10.13 小结 293

第11章 图形图像:Plzza Panic游戏 294

11.1 Pizza Panic游戏简介 294

11.2 pygame和livewires简介 296

11.3 创建图形窗口 296

11.3.1 New Graphics Window程序简介 297

11.3.2 引入games模块 297

11.3.3 初始化图形屏幕 298

11.3.4 启动主循环 298

11.4 设置背景图片 299

11.4.1 Background Image程序简介 299

11.4.2 加载图片 300

11.4.3 设置背景 301

11.5 理解图形坐标系统 301

11.6 显示sprite 302

11.6.1 Pizza Sprite程序简介 303

11.6.2 为sprite加载图片 304

11.6.3 创建sprite 305

11.6.4 把sprite放到屏幕上面去 305

11.7 显示文本 307

11.7.1 Big Score程序简介 307

11.7.2 引入color模块 308

11.7.3 创建Text对象 308

11.7.4 向屏幕添加Text对象 309

11.8 显示消息 309

11.8.1 YouWon程序简介 309

11.8.2 引入color模块 311

11.8.3 创建Message对象 311

11.8.4 使用屏幕的高度和宽度 312

11.8.5 把Message对象放到屏幕上面去 312

11.9 移动sprite 312

11.9.1 Moving Pizza程序简介 312

11.9.2 设置sprite的速度值 314

11.10 处理屏幕边界 314

11.10.1 Bouncing Pizza程序简介 314

11.10.2 准备工作 315

11.10.3 从Sprite派生出…个新类 315

11.10.4 重写update()方法 316

11.10.5 收尾工作 316

11.11 处理鼠标输入 317

11.11.1 MovingPan程序简介 317

11.11.2 准备工作 318

11.11.3 读取鼠标的x和y坐标 318

11.11.4 设置鼠标光标的可见性 319

11.11.5 捕获图形屏幕中的输入 319

11.11.6 收尾工作 320

11.12 碰撞检测 320

11.12.1 Slippery Pizza程序简介 320

11.12.2 准备工作 322

11.12.3 碰撞检测 322

11.12.4 碰撞处理 322

11.12.5 收尾工作 323

11.13 回到Pizza Panic游戏 324

11.13.1 准备工作 324

11.13.2 Pan类 324

11.13.3 Pizza类 326

11.13.4 Chef类 328

11.13.5 main()函数 329

11.14 小结 330

第12章 声音、动画以及程序开发:Astrocrash游戏 332

12.1 Astrocrash游戏简介 332

12.2 读取键盘 334

12.2.1 Read Key程序简介 334

12.2.2 准备工作 334

12.2.3 按键判断 335

12.2.4 收尾工作 336

12.3 旋转sprite 336

12.3.1 Rotate Sprite程序简介 336

12.3.2 使用Sprite的angle属性 338

12.4 创建动画 339

12.4.1 Explosion程序简介 339

12.4.2 爆炸图片说明 339

12.4.3 准备工作 340

12.4.4 创建图片文件列表 340

12.4.5 创建Animation对象 341

12.5 播放声音和音乐 342

12.5.1 Sound and Music程序简介 342

12.5.2 操作声音 342

12.5.3 操作音乐 345

12.5.4 收尾工作 346

12.6 规划Astroorash游戏 346

12.6.1 游戏的功能 347

12.6.2 游戏的类 347

12.6.3 游戏的资源 348

12.7 创建小行星 348

12.7.1 Astrocrash01程序简介 348

12.7.2 准备工作 349

12.7.3 Asteroid类 349

12.7.4 main()函数 351

12.8 旋转飞船 351

12.8.1 Astrocrash02程序简介 351

12.8.2 Ship类 352

12.8.3 实例化Ship对象 353

12.9 移动飞船 353

12.9.1 Astrocrash03程序简介 353

12.9.2 引入math模块 354

12.9.3 为Ship类添加类变量和常量 354

12.9.4 修改Ship的update()方法 354

12.10 发射导弹 355

12.10.1 Astrocrash04程序简介 356

12.10.2 修改Ship的update()方法 356

12.10.3 Missile类 357

12.11 控制导弹发射的频率 359

12.11.1 Astrocrash05程序简介 359

12.11.2 为Ship类添加一个类常量 360

12.11.3 为Ship类创建构造器方法 360

12.11.4 修改Ship类的update()方法 360

12.12 处理碰撞 361

12.12.1 Astrocrash06程序简介 361

12.12.2 修改Missile类的update()方法 362

12.12.3 为Missile类添加die()方法 362

12.12.4 修改Ship类的update()方法 362

12.12.5 为Ship类添加die()方法 362

12.12.6 为Asteroid类添加一个类常量 363

12.12.7 为Asteroid类添加die()方法 363

12.13 添加爆炸效果 363

12.13.1 Astrocrash07程序简介 363

12.13.2 Wrapper类 364

12.13.3 Collider类 365

12.13.4 修改Asteroid类 366

12.13.5 修改Ship类 366

12.13.6 修改Missile类 367

12.13.7 Explosion类 367

12.14 添加难度级别、得分记录以及背景音乐 368

12.14.1 Astrocrash08程序简介 368

12.14.2 引入color模块 369

12.14.3 Game类 369

12.14.4 为Asteroid类添加类变量和类常量 373

12.14.5 修改Asteroid类的构造器方法 373

12.14.6 修改Asteroid类的die()方法 374

12.14.7 为Ship类添加类常量 374

12.14.8 修改Ship类的构造器方法 375

12.14.9 修改Ship类的update()方法 375

12.14.10 为Ship类添加die()方法 375

12.14.11 main()函数 375

12.15 小结 376

附录A 配套网站 377

附录B livewires参考 379