项目 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 的自动售货机。)