目录
一、HANGMAN游戏
-这是一个经典单词游戏Hangman的变形设计。如果你对游戏规则不熟悉,可以点击链接:
link.此处第二玩家始终是计算机,它会随机选择一个单词(即下文经常用到的secretWord)
1.1 游戏规则
1、计算机从单词表中随机地选取一个单词,实现这一点的代码已经提供在文件中。
2、游戏是交互式的,游戏的流程如下:
• 刚开始时,让用户知道单词的长度(即secretWord的长度)
• 每一轮让用户猜一次(一个字母)
• 用户能得到立即反馈,所猜字母是否是secret单词的字母
• 每一轮,需要显示已经猜中的部分,以及用户没有猜过的字母
3. 游戏的额外规则:
• 用户可以猜8次. 每一轮猜测后提醒他剩余多少次可猜。假设用户总是每次输入一个字母 (A-Z)。
• 当用户错误猜测时,猜测次数减少1次。
• 如果用户重复猜了已经猜过的字母,猜测次数不减,提醒他这个字母已经猜过了,并继续猜测。
• 如果用户猜过的字母拼出了那个单词,游戏结束。如果用户用完猜测次数(未猜中单词),游戏结束并揭示秘密单词。
1.2 游戏样例
Loading word list from file…
55900 words loaded.
Welcome to the game, Hangman!
I am thinking of a word that is 4 letters long.
-------------
You have 8 guesses left.
Available letters: abcdefghijklmnopqrstuvwxyz
Please guess a letter: a
Good guess: _ a_ _
------------
You have 8 guesses left.
Available letters: bcdefghijklmnopqrstuvwxyz
Please guess a letter: a
Oops! You’ve already guessed that letter: _ a_ _
------------
You have 8 guesses left.
Available letters: bcdefghijklmnopqrstuvwxyz
Please guess a letter: s
Oops! That letter is not in my word: _ a_ _
------------
You have 7 guesses left.
Available letters: bcdefghijklmnopqrtuvwxyz
Please guess a letter: t
Good guess: ta_ t
------------
You have 7 guesses left.
Available letters: bcdefghijklmnopqruvwxyz
Please guess a letter: r
Oops! That letter is not in my word: ta_ t
------------
You have 6 guesses left.
Available letters: bcdefghijklmnopquvwxyz
Please guess a letter: m
Oops! That letter is not in my word: ta_ t
------------
You have 5 guesses left.
Available letters: bcdefghijklnopquvwxyz
Please guess a letter: c
Good guess: tact
------------
Congratulations, you won!
二、Python实现
在这个问题中,你将实现函数hangman(最后需要完成的函数),程序将在玩家与计算机之间交互运行。在完成这个函数的设计之前,需要先创建几个辅助函数。
2.1 函数一:isWordGuessed
- 它有2个参数:一个字符串secretWord, 一个字符列表lettersGuessed。函数返回逻辑值 ,如果 secretWord
已经被猜中 (ie, secretWord 中的所有字母都在lettersGuessed)返回True ,否则返回 False 。
(假设secretWord 与 lettersGuessed 都是小写字母。) - 代码如下:
// isWordGuessed
def isWordGuessed(secretWord, lettersGuessed):
secretWord_set = set(secretWord) #取secretWord全部字母作为集合secretWord
lettersGuessed_set = set(lettersGuessed) #将lettersGuessed转化集合lettersGuessed
if secretWord_set <= lettersGuessed_set: #集合secretWord是否为集合lettersGuessed子集
return True
else:
return False
2.2 函数二:getGuessedWord
- 它有2个输入参数:一个字符串secretWord,一个字母列表lettersGuessed。函数返回一个字符串,该返回串由字母与下划线组成,内容取决于lettersGuessed
中的字母是否是 secretWord的字母. 这个函数不应该与前面编写的代码isWordGuessed相差太大。
当在字符串中加入下划线时,要在后面加至少一个空格,这样用户看还有多少个字母未猜中会更清楚 (比较一下形式 __ 与 _ _ _ _ )。 - 代码如下:
// getGuessedWord
def getGuessedWord(secretWord, lettersGuessed):
secretWord_set = set(secretWord)
secretWord_tmp = secretWord
lettersGuessed_set = set(lettersGuessed)
right_set = secretWord_set & lettersGuessed_set #获取已猜中字母的集合right_set
wrong_set = secretWord_set - right_set #获取未猜中字母的集合wrong_set
for item in wrong_set:
secretWord_tmp = secretWord_tmp.replace(item, '_ ') #将未猜中字母全部替换后输出
return secretWord_tmp
2.3 函数三:getAvailableLetters
- 它接受一个输入参数:一个字母列表lettersGuessed。函数返回所有没有被猜测过(即不在lettersGuessed中)的小写字母按字母顺序组成的字符串。
- 代码如下:
// getAvailableLetters
def getAvailableLetters(lettersGuessed):
alpha26_set = set('abcdefghijklmnopqrstuvwxyz') #定义26个字母集合alpha26_set
lettersGuessed_set = set(lettersGuessed)
available_set = alpha26_set - lettersGuessed_set #获取没有被猜过字母的集合available_set
available_letters_tmp = ''.join(available_set) #将集合转化为字符串(乱序)
available_letters_lst = sorted(available_letters_tmp) #将乱序字符串转化为有序列表
available_letters = ''.join(available_letters_lst) #将有序列表转化为字符串输出
return available_letters
三、全部代码(.py)
- 直达下载链接(含全部代码和数据):link.