前面的各种文字小游戏要求用户必须一字不差输入命令,才能正确执行。
但是我们希望允许用户多样化地输入,比如简写、大小写之类的。
所以最好的开始方式是先搞定如何得到用户输入的单词并且判断出这是干什么的。
我们的游戏语汇
我在游戏里创建了如下单词的语汇表:
- 方向词: north, south, east, west, down, up, left, right, back
- 动词: go, stop, kill, eat
- 修饰词: the, in, of, from, at, it
- 名词: door, bear, princess, cabinet
- 数字: 0到9构成的数字
我们已经有了单词的语汇表,为了分析句子的意思,要找到一种断句的方法。我们对于句子的定义是:空格隔开的单词。
所以有:
stuff = raw_input('> ')
words = stuff.split()
目前就够了,其中 stuff.split() 中的 split() 函数意思是“通过指定分隔符给字符串切片”,这里分隔符就是空格。
语汇元组
一旦我们知道了如何把句子断为单词,剩下的就是逐一检查这些单词,看它们是什么类型的。
这里,我们要用到一种Python的数据结构,叫做“元组”(tuple)。
元组就是一个不能修改的列表。创建它的方法和创建列表差不多,成员之间需要用逗号隔开,不过方括号要换成圆括号 () 。
first_word = ('direction', 'north')
second_word = ('verb', 'go')
sentence = [first_word,second_word]
这样就创建了一个 (TYPE, WORD) 组,让你识别出单词,并且对其执行指令。
简要地说,就是接收用户输入(句子),然后 用 split() 分割成单词,然后分析识别,最后重新组成句子。
扫描输入
现在要写的是扫描器,这里 Zed 没有给出代码,而是要自己写出来。
这个扫描器会将用户输入的字符串当做参数,然后返回由多个 (TOKEN, WORD) 组成的一个列表,这个列表实现类似句子的功能。如果一个单词不在预定的单词语汇表中,那它返回时 WORD 应该还在,但 TOKEN 应该设置成一个专门的错误标记。这个标记告诉用户哪里出错了。
异常和数字
Zed 这里要帮助我做一个数字转换。这里要使用“异常”(exception)来做。“异常”是运行某个函数时候得到的错误。
函数在遇到错误的时候,就会“引发”(raise)一个“异常”,然后你就要去“处理”(handle)这个异常。
例如: