项目 3:开始上手
Project 3 冒险游戏的上手指引:拷贝项目文件、加载顺序,以及程序三大类 Person、Place、Thing 的快速导览。
开始上手
在这份实验作业中,我们将探索两个核心理念:
- 模拟一个由一组状态变量刻画的对象世界
- 把消息传递用作一种编程技术,把存在对象交互的世界模块化
面向对象编程正变得极其流行,适用于任何涉及计算实体之间交互的应用。
例如:
- 操作系统(进程作为对象)
- 窗口系统(窗口作为对象)
- 游戏(小行星、飞船、大猩猩作为对象)
- 绘图程序(图形作为对象)
项目文件
首先,把项目所需的文件拷贝到你的目录:
cp -r ~cs61as/lib/adventure/ .
| 文件名 | 用途 |
|---|---|
1. obj.scm | 我们面向对象系统的代码。 |
2. adv.scm | 冒险游戏程序。它包含各个对象类的定义。 |
3. tables.scm | 一个抽象数据类型(ADT),做 A5 和 B4 题时要用。 |
4. adv-world.scm | 冒险游戏中对象(即人物、地点和物品)的具体实例。 |
5. small-world.scm | 一个更小的简化世界,可用于调试。 |
要开始本项目,你必须严格按照上表所示的顺序,把这些文件加载进 STk。adv-world.scm 和 small-world.scm 二者只加载其一,不要两个都加载。布置给你的工作针对的是 adv-world.scm;提供 small-world.scm 是备选——如果你想在一个更小的世界里调试某些过程,那里要记的东西更少,加载也更快。
要加载一个 Scheme 文件(例如 obj.scm),就在解释器里输入:
(load "obj.scm")
冒险游戏之所以拆成 adv.scm 和 adv-world.scm 两个文件,是因为:每当你修改 adv.scm里的类定义,可能需要重新加载整个世界,修改才能生效。分成两个文件,你就不必把第一批过程也重新加载一遍。
程序导览
本程序有三个主要的类:Person、Place 和 Thing。
以下是从 adv-world.scm 中节选的例子:
;;; 构建世界中的地点
(define Soda (instantiate place 'Soda))
(define BH-Office (instantiate place 'BH-Office))
(define art-gallery (instantiate place 'art-gallery))
(define Pimentel (instantiate place 'Pimentel))
(define 61A-Lab (instantiate place '61A-Lab))
(define Sproul-Plaza (instantiate place 'Sproul-Plaza))
(define Telegraph-Ave (instantiate place 'Telegraph-Ave))
(define Noahs (instantiate place 'Noahs))
(define Intermezzo (instantiate place 'Intermezzo))
(define s-h (instantiate place 'sproul-hall))
;;; 创建一些物品并放到地点上
(define bagel (instantiate thing 'bagel))
(ask Noahs 'appear bagel)
(define coffee (instantiate thing 'coffee))
(ask Intermezzo 'appear coffee)
;;; 创建一些人物
(define Brian (instantiate person 'Brian BH-Office))
(define hacker (instantiate person 'hacker Pimentel))
;;; 连接世界中的地点
(can-go Soda 'up art-gallery)
(can-go art-gallery 'west BH-Office)
(can-go Soda 'south Pimentel)
世界建好之后,我们就可以通过给对象发消息来和它互动了。下面是个简短的例子:
; 我们从 Pimentel 里的 hacker 开始。
> (ask Pimentel 'exits)
(NORTH SOUTH)
> (ask hacker 'go 'north)
HACKER moved from PIMENTEL to SODA
我们可以把物品放到不同的地点,然后让人物拿走物品:
> (define Jolt (instantiate thing 'Jolt))
JOLT
> (ask Soda 'appear Jolt)
APPEARED
> (ask hacker 'take Jolt)
HACKER took JOLT
TAKEN
你可以从别人那里拿走物品,但后果自负嘛……(可惜这只是个幻想游戏,Soda 里并没有真的卖 Jolt 的自动售货机。)