实验作业4B:著名
目标和目的
在这项作业中,你将实施一个小猜谜游戏,电脑试图猜出你在想哪个名人。观看此短片(没有音频)来了解游戏应该如何工作。
游戏保留了一些关于名人的知识(以决策树的形式)。当电脑猜不出你在想哪个著名的人物时,它会问你一些可以用来提高知识水平的信息。积累的知识存储在一个文件中,这样即使你停止游戏并重新开始,它也会被保留下来。
虽然这是一个相当小且简单的游戏,但它将教您如何使用IO以及递归数据类型。而且,与之前的作业不同,这次你自己编写完整的程序,没有现成的模块供你下载,也没有关于如何构建程序的逐步说明,这与之前的任务不同。
截止日期
必须在之前提交10月25日星期五午夜(2019).
这个提交说明与实验室4A的相似。
要求和建议
在本次任务中,我们没有列出需要按给定顺序完成的子任务,而是为您提供了一些实现游戏的总体要求、建议和提示。在开始编写任何代码之前,请阅读所有内容。
“问题回答”决策树
您需要有一个数据类型(称为质量保证
)代表“问答”决策树如下所示:
最小的树就是一个人的名字。更大的树是由一个问题和两个子树组成的,一个子树用于回答肯定的问题,另一个子树则用于回答否定的问题。你可以假设所有的问题都是是-否,所以你不需要明确地表示“是”和“否”。
添加派生(显示、读取)
; 这个显示
当您将决策树存储到文件中时,将使用该函数。这个阅读
类将为您提供一个函数读取::字符串->QA
这将有助于您构建从该文件读回决策树的指令。
使用上图中的决策树表示作为默认树,在没有文件时使用(著名的.qa
).
进行一轮游戏
一旦我们有了一个决策树(来自文件或使用默认树),我们就开始沿着树往下走,边走边问问题。一旦你找到一个人,那么猜测就已经决定了。
因此,假设我们按如下方式播放默认决策树:她是欧洲人吗?是的她是科学家吗?不我猜:是伊丽莎白女王二世吗?不好吧,这次你赢了。
此时游戏将继续(粗体文本由玩家键入):只是好奇:你的名人是谁?特蕾莎·梅给我一个问题,“Theresa May”的答案是“是”而“伊丽莎白二世女王”的答案是“不”。她是政治家吗?
此时,游戏应该构建一个扩展的决策树,如下图所示:
我们建议使用递归函数实现此过程
播放:: 质量保证 -> IO(输入输出) 质量保证
一次玩
返回新的决策树(如果计算机猜对了答案,则该树将保持不变),然后可以将其存储回文件中。
关于IO
如果我们使用readFile::FileName->IO字符串
如果文件不存在,则会出现错误,程序将崩溃。这不是我们想要的!这里你应该用
tryIO错误:: IO(输入输出)一-> IO(输入输出)(要么 IO错误a)
来自标准模块系统。IO.错误
使用tryIO错误(readFile…)
,我们将可能生成错误的IO指令转换为从不生成任何错误的IO指示,而是返回一个值,该值告诉我们是否存在错误。有关更多信息,请参阅数据类型“要么”和“IOError”的文档。
关于缓冲输出
当程序要求时,大多数操作系统都不会直接在屏幕上写东西。相反,它们会等到一整行打印到屏幕上,然后实际打印出来。当屏幕上打印出一个问题时,这可能会很麻烦,用户必须在同一行上键入答案(就像我们在这个游戏中希望的那样)。为了避免问题不在屏幕上打印,我们告诉操作系统“刷新”程序的输出,即打印屏幕上我们想打印在屏幕上的所有内容,而不是等待当前行结束。haskell指令hFlush标准输出
将为我们完成此操作,因此请在使用后使用putStr。。。
确保立即打印。您需要包括模块系统。IO(输入输出)
为了这个。
程序结构
这个程序的大部分都是IO指令,但这并不意味着你不应该考虑定义有用的函数,这些函数可以在多个地方重用,并且有助于给你的程序提供良好的结构。
作为提示,请考虑定义函数
它询问一个问题并返回用户键入的答案。使用此选项,您可以定义
它会询问是非问题(如果需要,可以重复),直到得到“是”或“否”的答案,然后返回真的
当答案是肯定的时候False(错误)
当答案是否定的时候。这可以在你的程序中的几个地方使用。
主要功能
整个游戏应该定义为
然后您可以通过键入以下命令从终端运行游戏runhaskell著名
(这与将文件加载到全球温室气体排放指数
和键入主要的
). 你也可以编译程序到一个独立的可执行文件中。
提交说明
您必须以3人一组的形式提交使用消防系统的申请。
您只应提交:您的版本著名.hs
。不要上传任何其他文件。
在提交代码之前,花点时间清理您的代码;让它更简单,移除不必要的东西等。如果你的解决方案不干净,我们将拒绝接受。清洁代码:
- 没有长行(<78个字符)
- 具有一致的布局(避免在代码中使用TAB字符)
- 具有所有顶级函数的类型签名你被要求写
- 有很好的评论
- 没有垃圾(垃圾是未使用的代码、已注释的代码、不必要的注释)
- 没有过于复杂的函数定义
- 不包含任何重复代码(复制和粘贴编程)
请随意使用hlint公司程序来帮助解决这些问题和其他haskell风格的问题。如果hlint的建议看起来像是假设对事物有所了解我们在课堂上还没有讲到,你可以忽略它(或者可能将其包含在代码的注释中)。
至消防系统
祝你好运!
更改日志
- 2019-09-12 2019年小修(托马斯·哈格伦)
- 2018-10-18第一版(Dave Sands)