目录

  • 一、HANGMAN游戏
  • 1.1 游戏规则
  • 1.2 游戏样例
  • 二、Python实现
  • 2.1 函数一:isWordGuessed
  • 2.2 函数二:getGuessedWord
  • 2.3 函数三:getAvailableLetters
  • 三、全部代码(.py)

一、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.