主题:【问题描述】
【问题描述】
人与计算机做猜英文单词的游戏,这种游戏每猜一次叫一局,让你参与多少局由计算机决定。局数为N。在第一局开始之前,由计算机给出一个文件,文件名为dict.txt,该文件中给出的是在下面N局中让你猜的全部可能的英文单词列表(所有的单词都只由26个小写英文字母组成)。计算机选择其中的一个单词让你猜,而你则需要用尽可能少的次数将这个单词猜出来。这个单词在你猜的过程中不会改变。
对于你猜的每一个单词,假如猜测正确,则本局游戏结束;否则,计算机会给出下列两个反馈信息:
1. 被猜的单词中有x个字符包含在你猜的单词中,给出数字x。假如同一个字母在被猜的单词或你猜的单词中出现了不只一次,则按照出现次数较少者计算。举例来说,设被猜的单词为dracula,其中有两个字母a,如果你猜的单词为bag,其中有一个字母a,则返回x=1;如果你猜的单词为abracadabra,其中有5个字母a,则返回x=2。
2. 在上述被猜中的字母中有y (y<=x) 个是处在正确位置上的,给出数字y。
根据上述提示信息,你可以继续你的猜测,直到得出正确的答案为止。此时计算机会记住这一局你猜了多少次才成功,在你N局都猜完后,计算机会给出你累计N局所用的总次数和平均每局猜测的次数。当然,平均次数越少越好。
【编程要求】
现在需要你编写一个程序来做这个游戏。你的程序要和一个库(GuessLib.tpu)进行通讯,交互的进行这个游戏。
GuessLib.tpu提供了以下几个过程和函数供调用:
1) Procedure Initialize;
初始化过程,同时生成词典文件dict.txt。此过程必须在程序开始处首先被调用,而且只能被调用一次。
2) Function GetRoundNum: integer;
返回游戏要进行的局数N,每次调用的返回值都一样。
3) Procedure StartRound;
开始一局游戏,确定被猜测的单词。此过程必须在每一局游戏开始前调用。
4) Procedure Guess(s: string);
给出你的程序所猜测的单词s。
5) Function CorrectNumber: byte;
返回猜测正确的字符个数,在两次调用Guess之间返回值不会改变。
6) Function CorrectPosition: byte;
返回猜测正确的位置个数,在两次调用Guess之间返回值不会改变。
7) Function Correct: boolean;
判断猜测结果是否就是正确答案,返回true就表示最近一次猜测是正确的,在调用StartRound之后,返回值会自动变成false。
8) Procedure Finish;
当全部N局游戏结束之后,必须调用此过程,结束程序,此过程也生成运行结果报告,作为评判你的程序的依据。
【输入输出】
你的程序除了和GuessLib.tpu交互之外,只能读取文件dict.txt,而不能进行任何其他的文件读写操作。
Dict.txt的格式为:第一行是一个正整数w,表示文件dict.txt中所含的单词的数目;以下w行每行包含一个单词,单词的顺序没有规定,任何两行的单词都不相同。
【样例】
设调用Initialize后,生成单词表dict.txt如下:
再调用GetRoundNum得到游戏总的局数N,假设N=2。
第一局,调用StartRound,计算机选中的单词是double。当然,你的程序此时无从获知这个单词。
假如你的程序猜了host,即调用Guess('host'),则有下述的反馈:
1. 调用Correct,返回false。
2. 调用CorrectNumber,返回1;
3. 调用CorrectPosition,返回1;
然后,你的程序可以根据这些反馈信息,进行进一步的猜测,直到得出正确结果为止。
完成第一局后,再次调用StartRound,则进入第二局,仍是如前所述的猜测过程,直至得出第二局的正确结果。
此后,调用Finish给出评测结果,然后结束程序。
【数据说明】
游戏局数N<=20。
Dict.txt中所含的单词数不超过3000,单词的长度最小为1个字母,最大为9个字母。
【评分说明】
程序的运行过程和结果由GuessLib.tpu自动记录。如果一局游戏最终猜测正确,则记录本局的猜测次数;如果未能正确猜出答案,作为惩罚,本局猜测次数以w+1计(w是词典文件中单词的总数)。N局游戏的猜测次数平均值作为最终给分的最主要的依据,平均次数越少,则分数越高。
另外,如果在第N局游戏开始之前程序结束或出现其他非法操作,则该测试点得零分。
人与计算机做猜英文单词的游戏,这种游戏每猜一次叫一局,让你参与多少局由计算机决定。局数为N。在第一局开始之前,由计算机给出一个文件,文件名为dict.txt,该文件中给出的是在下面N局中让你猜的全部可能的英文单词列表(所有的单词都只由26个小写英文字母组成)。计算机选择其中的一个单词让你猜,而你则需要用尽可能少的次数将这个单词猜出来。这个单词在你猜的过程中不会改变。
对于你猜的每一个单词,假如猜测正确,则本局游戏结束;否则,计算机会给出下列两个反馈信息:
1. 被猜的单词中有x个字符包含在你猜的单词中,给出数字x。假如同一个字母在被猜的单词或你猜的单词中出现了不只一次,则按照出现次数较少者计算。举例来说,设被猜的单词为dracula,其中有两个字母a,如果你猜的单词为bag,其中有一个字母a,则返回x=1;如果你猜的单词为abracadabra,其中有5个字母a,则返回x=2。
2. 在上述被猜中的字母中有y (y<=x) 个是处在正确位置上的,给出数字y。
根据上述提示信息,你可以继续你的猜测,直到得出正确的答案为止。此时计算机会记住这一局你猜了多少次才成功,在你N局都猜完后,计算机会给出你累计N局所用的总次数和平均每局猜测的次数。当然,平均次数越少越好。
【编程要求】
现在需要你编写一个程序来做这个游戏。你的程序要和一个库(GuessLib.tpu)进行通讯,交互的进行这个游戏。
GuessLib.tpu提供了以下几个过程和函数供调用:
1) Procedure Initialize;
初始化过程,同时生成词典文件dict.txt。此过程必须在程序开始处首先被调用,而且只能被调用一次。
2) Function GetRoundNum: integer;
返回游戏要进行的局数N,每次调用的返回值都一样。
3) Procedure StartRound;
开始一局游戏,确定被猜测的单词。此过程必须在每一局游戏开始前调用。
4) Procedure Guess(s: string);
给出你的程序所猜测的单词s。
5) Function CorrectNumber: byte;
返回猜测正确的字符个数,在两次调用Guess之间返回值不会改变。
6) Function CorrectPosition: byte;
返回猜测正确的位置个数,在两次调用Guess之间返回值不会改变。
7) Function Correct: boolean;
判断猜测结果是否就是正确答案,返回true就表示最近一次猜测是正确的,在调用StartRound之后,返回值会自动变成false。
8) Procedure Finish;
当全部N局游戏结束之后,必须调用此过程,结束程序,此过程也生成运行结果报告,作为评判你的程序的依据。
【输入输出】
你的程序除了和GuessLib.tpu交互之外,只能读取文件dict.txt,而不能进行任何其他的文件读写操作。
Dict.txt的格式为:第一行是一个正整数w,表示文件dict.txt中所含的单词的数目;以下w行每行包含一个单词,单词的顺序没有规定,任何两行的单词都不相同。
【样例】
设调用Initialize后,生成单词表dict.txt如下:
再调用GetRoundNum得到游戏总的局数N,假设N=2。
第一局,调用StartRound,计算机选中的单词是double。当然,你的程序此时无从获知这个单词。
假如你的程序猜了host,即调用Guess('host'),则有下述的反馈:
1. 调用Correct,返回false。
2. 调用CorrectNumber,返回1;
3. 调用CorrectPosition,返回1;
然后,你的程序可以根据这些反馈信息,进行进一步的猜测,直到得出正确结果为止。
完成第一局后,再次调用StartRound,则进入第二局,仍是如前所述的猜测过程,直至得出第二局的正确结果。
此后,调用Finish给出评测结果,然后结束程序。
【数据说明】
游戏局数N<=20。
Dict.txt中所含的单词数不超过3000,单词的长度最小为1个字母,最大为9个字母。
【评分说明】
程序的运行过程和结果由GuessLib.tpu自动记录。如果一局游戏最终猜测正确,则记录本局的猜测次数;如果未能正确猜出答案,作为惩罚,本局猜测次数以w+1计(w是词典文件中单词的总数)。N局游戏的猜测次数平均值作为最终给分的最主要的依据,平均次数越少,则分数越高。
另外,如果在第N局游戏开始之前程序结束或出现其他非法操作,则该测试点得零分。