1PYTHON程序设计大作业1
1Python程序设计大作业
本次作业可以独立完成,也可以组队完成,每支队伍的人数不超过5人。
作业分成若干部分:
1.设计文档——使用流程图、伪代码、框图、图片、文本等手段,描述
•代码的整体思路,
•分多少个模块,各个模块的功能及相互联系,
•重要变量的结构和功能描述,
•各个函数和类输入、输出和功能(算法思路和表达能力是评分的重要依据);
2.程序源代码——彩色显示,配以重要的注释,需要有行号,如果分成
若干个代码文件,则各个代码文件的内容要独立显示(代码风格是评分的依据之一);
3.实验和测试报告——包括问题描述、任务要求、实验配置(计算机软
硬件条件)、实验步骤、各个步骤的截图、实验结论和分析(学术性是评分的依据之一);
4.10分钟小组展示用的演示文稿(讲演的水平是评分的依据之一)。
其中,前面3个部分通过学习通提交(要求在每一个部分提交的文档中,列出全部组员的姓名和学号),只需任意一人提交;最后一部分在小组展示中呈现。
猜词
在这次作业中,你们需要开发一个程序。
这个程序通过改变游戏规则来试图击败人类。
以防你们不了解猜词(Word Guessing)游戏,下面介绍规则:
1.玩家A选择一个秘密的单词secrete_word,然后写出若干个连线‘−’,
连线的数目与单词所含字母的个数相等。
例如玩家A的秘密单词为“bicycle”,那么他就要写出“−−−−−−−”(一共7个连线)。
1PYTHON程序设计大作业2
2.玩家B开始猜字母。
每次他猜中的时候,玩家A要把该字母在秘密单
词secrete_word中的所有出现都显示出来。
例如玩家A的秘密单词为“bicycle”,如果玩家B猜c,那么,玩家A就要把字母c都显示出来,也就是要显示“−−c−c−−”。
3.如果秘密单词中所有字母都显示出来了,或者玩家B用完了所有猜词
的机会,游戏就结束了。
这个游戏的根本点在于,玩家A确切地选择了一个单词secrete_word。
这样,当玩家B猜字母的时候,玩家A确切地判断B猜的字母是否在secrete_word中。
现在的问题是,如果玩家A不这么做呢?设想你是玩家A,并且现在,你要选择一个长度为4的单词。
这一次,你并没有确切地选择一个秘密单词secrete_word,而是手头有全部4个字母组成的英文单词。
为了简便,我们假设英语只有如下这些4字母单词:
ally beta cool deal else flew good hope ibex
现在,设想你的对手猜字母“e”。
你需要告诉你的对手,你“所选的”单词中的哪些字母是“e”。
当然,实际上你并没有选一个单词,所以你有很多种可选的方式来显示单词中的每个字母“e”。
下面我们把上面单词中的“e”给加以强调:
ally beta cool deal else flew good hope ibex
这张表中的各个单词落入以下的5个单词类别之一:
•“−−−−”,包含单词ally,cool和good
•“−e−−”,包含beta和deal
•“−−e−”,包含flew和ibex
•“e−−e”,包含else
•“−−−e”,包含hope
因为你所显示的字母必须对应到单词表中的某个单词,你可以选择上述五种类别中的任何一种来显示。
1PYTHON程序设计大作业3
例如,在这个例子中,如果秘密单词显示为“−−−−”,那么当前符合游戏要求的单词数目就是3;如果秘密单词显示为“−e−−”,那么当前符合游戏要求的单词数目就是2。
有很多办法可以用来选出具体要显示哪一类,也许你会想引导你的对手到一个包含更多奇怪单词的小类别,又或者引导他到一个很大的类别,以此来维持你的“秘密单词”的开放性。
如果你采取了大类别的思路,并且总是使得进行选择后得到的单词范围最大,那么你会选择“−−−−”。
这会使符合游戏要求的单词表退化为ally,cool和good,而且,因为你不显示任何字母,你要告诉你的对手说他猜错了。
你的程序需要完成如下任务:
1.读取文件dictionary.txt,它包含官方的拼字游戏玩家的字典(第二
版)(Official Scrabble Player’s Dictionary,Second Edition)的全部内容。
这个单词列表有超过120,000个单词,这完全足够达到实验我们的任务了。
2.请求用户输入秘密单词的长度,如果用户的输入不合理,那么重新请
求直到字典中至少有一个单词符合这个长度为止。
就是说,如果用户想要猜长度为−41或者137的单词,你需要请求用户重新输入单词的长度,因为不存在一个单词是这个长度的。
提示:
(a)即使是一个小于137的长度,也可能找不到符合要求的单词;
(b)设单词的最大长度为MAX_L,那么存在不止一个大于零且小于
MAX_L的长度,我们找不到符合要求的单词。
3.请求用户输入被允许的猜测次数,这必须是一个正整数。
不用担心这
个次数太大,因为26次猜测足够猜出单词了。
4.询问用户是否需要输出当前符合游戏要求的单词的数目。
这一步使玩
家发现,电脑在作弊,这不是平常的猜词游戏,但是它对于程序测试非常有用。
5.按照如下描述来进行游戏:
(a)构建符合输入长度要求的英文单词的列表
(b)输出用户还剩下多少次猜测的机会,用户猜过的字母,以及目前
的秘密单词的显示形式(一个带有或者不带有“−”的英文单词)
1PYTHON程序设计大作业4
(c)请求用户猜测一次,如果用户的输入不合理,就重复请求,直到
用户输入一个从未猜过的字母为止。
需要确保用户输入的仅仅是
一个字符,并且它是字母表中的一员。
(d)每一次用户猜测字母之后,都要把当前符合游戏要求的单词划分
成若干个单词类别(注意上面的例子)。
(e)选择一个单词类别作为新的符合游戏要求的单词类别,并把这个
单词类别之外的所有单词移除,然后把用户猜对的字母的位置显
示出来。
例如,在上面的例子中,把字母“c”显示出来,得到
“−−c−c−−”。
注意,还剩的允许猜测的次数要减去1。
(f)如果玩家用完所有的猜测,就从符合游戏要求的单词中挑出一个
并显示出来,把这个单词作为计算机最初“选择”的单词。
(g)如果玩家猜对了单词,就恭喜他。
(h)询问玩家是否需要继续进行游戏,如果玩家需要继续,就进行循
环。
6.程序应该人性化,也应该具有健壮性——即使用户的输入比较荒唐,程
序也不应该崩溃,而且还要提示用户如何输入,使程序顺畅运行。
7.上述要求的解释权归范懿所有。