- 1、本文档共6页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
48:更复杂的用户输入
48 :更复杂的⽤户输⼊
练习48.更复杂的⽤户输⼊
在以前的游戏中,你只是设置⼀些简单的预定义字符串作为⽤户输⼊处理,⽤户输
⼊“run” , 序能正常运⾏,但是你输⼊“run fast” , 序就会运⾏失败。我们需要⼀个
设备,它可以识别⽤户以各种⽅式输⼊的语汇。例如下⾯的机种表述都应该被⽀持才
对:
open door
open the door
go THROUGH the door
punch bear
Punch The Bear in the FACE
也就是说,如果⽤户的输⼊和常⽤英语很接近也应该是可以的,⽽你的游戏要识别出
它们的意思。为了达到这个⽬的,我们将写⼀个模块专门做这件事情。这个模组⾥边
会有若⼲个类,它们互相配合,接受⽤户输⼊,并且将⽤户输⼊转换成你的游戏可以
识别的命令。
英语的简单格式是这个样⼦的:
单词由空格隔开。
句⼦由单词组成。
语法控制句⼦的含义。
以最好的开始⽅式是先搞定如何得到⽤户输⼊的词汇,并判断出它们是什么。
我们的游戏词典
我在游戏⾥创建了下⾯这些语汇:
表⽰⽅向 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()
⽬前做到这样就可以了,不过这招在相当⼀段时间内都不会有问题。
词汇元组
⼀旦我们知道了如何将句⼦转化成词汇列表,剩下的就是逐⼀检查这些词汇,看它们
是什么类型。为了达到这个⽬的,我们将⽤到⼀个⾮常好使的 Python 数据结构,叫
做”元组(tuple)” 。元组其实就是⼀个不能修改的列表。创建它的⽅法和创建列表差不
多,成员之间需要⽤逗号隔开,不过⽅括号要换成圆括号 ():
first_word = (verb, go)
second_word = (direction, north)
third_word = (direction, west)
sentence = [first_word, second_word, third_word]
这样我们就创建了⼀个(TYPE ,WORD)组,让你识别出单词,并且对它执⾏指令。
这只是⼀个例⼦,不过最后做出来的样⼦也差不多。你接受⽤户输⼊,⽤ split将其
分隔成单词列表,然后分析这些单词,识别它们的类型,最后重新组成⼀个句⼦。
扫描输⼊
现在你要写的是词汇扫描器。这个扫描器会将⽤户的输⼊字符串当做参数,然后返回
由多个 (TOKEN , WORD) 组成的⼀个列表,这个列表实现类似句⼦的功能。如果⼀个
单词不在预定的词汇表中,那它返回时 WORD 应该还在,但 TOKEN 应该设置成⼀
个专门的错误标记。这个错误标记将告诉⽤户哪⾥出错了。
有趣的地⽅来了。我不会告诉你这些该怎样做,但我会写⼀个“单元测试(unit test)” ,
⽽你要把扫描器写出来,并保证单元测试能够正常通过。
异常和数字
有⼀件⼩事情我会先帮帮你,那就是数字转换。为了做到这⼀点,我们会作⼀点弊,
使⽤“异常(exceptions)”来做。“异常”指的是你运⾏某个函数时得到的错误。你的函数
在碰到错误时,就会“抛出(raise)”⼀个“异常” ,然后你就要去处理(handle)这个异常。
假如你在Python ⾥写了这些东西:
P thon 2.7.1 (r271:86832, Jun 16 2011, 16:59:05)
[GCC 4 .2.1 (Based on Apple Inc. b
文档评论(0)