国科大python期末综合练习hangman代码

这份代码是我昨天晚上(2021/5/22)写的,如有纰漏,多多包涵。

游戏要求:

1、计算机从单词表中随机地选取一个单词,实现这一点的代码已经提供在文件中。
2、游戏是交互式的,游戏的流程如下:
• 刚开始时,让用户知道单词的长度(即secretWord的长度)
• 每一轮让用户猜一次(一个字母)
• 用户能得到立即反馈,所猜字母是否是secret单词的字母
• 每一轮,需要显示已经猜中的部分,以及用户没有猜过的字母
3.游戏的额外规则:
用户可以猜8次. 每一轮猜测后提醒他剩余多少次可猜。假设用户总是每 次输入一个字母 (A-Z)。 当用户错误猜测时,猜测次数减少1次。
如果用户重复猜了已经猜过的字母,猜测次数不减,提醒他这个字母已经猜过了,并继续猜测。
如果用户猜过的字母拼出了那个单词,游戏结束。如果用户用完猜测次数(未猜中单词),游戏结束并揭示秘密单词。

样例(注:有两类,仔细看哦,对写代码有好处)

赢了游戏应如下显示:

*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!*

输了游戏如下显示:

*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
	Oops! That letter is not in my word _ _ _ _
	-----------
	You have 7 guesses left
	Available Letters: bcdefghijklmnopqrstuvwxyz
	Please guess a letter: b
	Oops! That letter is not in my word _ _ _ _
	-----------
	You have 6 guesses left
	Available Letters: cdefghijklmnopqrstuvwxyz
	Please guess a letter: c
	Oops! That letter is not in my word _ _ _ _
	-----------
	You have 5 guesses left
	Available Letters: defghijklmnopqrstuvwxyz
	Please guess a letter: d
	Oops! That letter is not in my word _ _ _ _
	-----------
	You have 4 guesses left
	Available Letters: efghijklmnopqrstuvwxyz
	Please guess a letter: e
	Good guess: e_ _ e
	-----------
	You have 4 guesses left
	Available Letters: fghijklmnopqrstuvwxyz
	Please guess a letter: f
	Oops! That letter is not in my word e_ _ e
	-----------
	You have 3 guesses left
	Available Letters: ghijklmnopqrstuvwxyz
	Please guess a letter: g
	Oops! That letter is not in my word e_ _ e
	-----------
	You have 2 guesses left
	Available Letters: hijklmnopqrstuvwxyz
	Please guess a letter: h
	Oops! That letter is not in my word e_ _ e
	-----------
	You have 1 guesses left
	Available Letters: ijklmnopqrstuvwxyz
	Please guess a letter: i
	Oops! That letter is not in my word e_ _ e
	-----------
	Sorry, you ran out of guesses. The word was else.* 

需要完成下列三个辅助函数:

1、 函数isWordGuessed (secretWord, lettersGuessed), 它有2个参数:一个字符串secretWord, 一个字符列表lettersGuessed。函数返回逻辑值 ,如果 secretWord 已经被猜中 (ie, secretWord 中的所有字母都在lettersGuessed)返回True ,否则返回 False 。假设secretWord 与 lettersGuessed 都是小写字母。(注:这个函数我没用到)
例如:

>>> secretWord = 'apple' 
>>> lettersGuessed = ['e', 'i', 'k', 'p', 'r', 's']
>>> print (isWordGuessed(secretWord, lettersGuessed))
False

2、 函数getGuessedWord (secretWord, lettersGuessed),它有2个输入参数:一个字符串secretWord,一个字母列表lettersGuessed。函数返回一个字符串,该返回串由字母与下划线组成,内容取决于lettersGuessed 中的字母是否是 secretWord的字母. 这个函数不应该与前面编写的代码isWordGuessed相差太大。
当在字符串中加入下划线时,要在后面加至少一个空格,这样用户看还有多少个字母未猜中会更清楚 (比较一下形式 __ 与 _ _ _ _ )。
假设 secretWord 和lettersGuessed 都是小写字母。
例如:

>>> secretWord = 'apple' 
>>> lettersGuessed = ['e', 'i', 'k', 'p', 'r', 's']
>>> print getGuessedWord(secretWord, lettersGuessed)
'_ pp_ e'

3、 函数getAvailableLetters (lettersGuessed),它接受一个输入参数:一个字母列表lettersGuessed。函数返回所有没有被猜测过(即不在lettersGuessed中)的小写字母按字母顺序组成的字符串。
假设lettersGuessed中的字母都是小写的。
例如:

lettersGuessed = ['e', 'i', 'k', 'p', 'r', 's']
>>> print getAvailableLetters(lettersGuessed)
Abcdfghjlmnoqtuvwxyz

最后要完成的函数hangman:

hangman(secretWord),它有一个输入参数:用户需要去猜测的单词 secretWord(后续程序用到的变量名)。由它开始游戏程序Hangman用户与计算机的交互过程。确保你用到之前部分设计完成的辅助函数isWordGuessed、etGuessedWord和 getAvailableLetters。
使用函数 lower() 来将用户的输入转换为小写。
有4个重要的信息需要保存:
(1) secretWord:猜测的目标单词
(2) lettersGuessed:追踪用户猜测过的字母
(3) mistakesMade:记录用户猜测错误的次数
(4) availableLetters:还可以用来被猜测的字母,用户猜测过的字母需要从availableLetters移除,用户重复猜了的字母,你需要告知用户你已经猜过这个字母。

代码如下:


# Hangman game
#

# -----------------------------------
# Helper code
# You don't need to understand this helper code,
# but you will have to know how to use the functions
# (so be sure to read the docstrings!)

import random
import string

WORDLIST_FILENAME = "words.txt"

def loadWords():
    """
    Returns a list of valid words. Words are strings of lowercase letters.
    
    Depending on the size of the word list, this function may
    take a while to finish.
    """
    print ("Loading word list from file...")
    # inFile: file
    inFile = open(WORDLIST_FILENAME, 'r', -1)
    # line: string
    line = inFile.readline()
    # wordlist: list of strings
    wordlist = line.split()
    print ("  ", len(wordlist), "words loaded.")
    return wordlist

#随机选择单词
def chooseWord(wordlist):
    """
    wordlist (list): list of words (strings)

    Returns a word from wordlist at random
    """
    return random.choice(wordlist)

# end of helper code
# -----------------------------------

# Load the list of words into the variable wordlist
# so that it can be accessed from anywhere in the program
wordlist = loadWords()

def isWordGuessed(secretWord, lettersGuessed):
    '''
    secretWord: string, the word the user is guessing
    lettersGuessed: list, what letters have been guessed so far
    returns: boolean, True if all the letters of secretWord are in lettersGuessed;
      False otherwise
    '''
    # FILL IN YOUR CODE HERE...
    for i in secretWord:
        if i in lettersGuessed:
            pass
        else:
            return False
    return True






def getGuessedWord(secretWord, lettersGuessed):
    '''
    secretWord: string, the word the user is guessing
    lettersGuessed: list, what letters have been guessed so far
    returns: string, comprised of letters and underscores that represents
      what letters in secretWord have been guessed so far.
    '''
    # FILL IN YOUR CODE HERE...
    s = []
    for i in range(len(secretWord)):
        s.append('_ ')
    for i in lettersGuessed:
        for j in range(len(secretWord)):
            if i == secretWord[j]:
                s[j] = i
    return s


#保留每次迭代得到的结果列表
def listt(j,s):
    for i in range(len(s)):
        if j [i] == '_ ' and j[i] != s[i]:
            j[i] = s[i]
    return j





def getAvailableLetters(lettersGuessed):
    '''
    lettersGuessed: list, what letters have been guessed so far
    returns: string, comprised of letters that represents what letters have not
      yet been guessed.
    '''
    # FILL IN YOUR CODE HERE...
    a = 'abcdefghijklmnopqrstuvwxyz'
    a = list(a)
    for i in lettersGuessed:
        a.remove(i)
    return ''.join(a)


    

def hangman(secretWord):
    '''
    secretWord: string, the secret word to guess.

    Starts up an interactive game of Hangman.

    * At the start of the game, let the user know how many 
      letters the secretWord contains.

    * Ask the user to supply one guess (i.e. letter) per round.

    * The user should receive feedback immediately after each guess 
      about whether their guess appears in the computers word.

    * After each round, you should also display to the user the 
      partially guessed word so far, as well as letters that the 
      user has not yet guessed.

    Follows the other limitations detailed in the problem write-up.
    '''
    # FILL IN YOUR CODE HERE...
    j = []
    for i in range(len(secretWord)):
        j.append('_ ')
    print('Welcome to the game Hangman!')
    print('I am thinking of a word that is %d letters long'%(len(secretWord)))
    print('-----------')
    t = list(secretWord)
    num = 8
    lettersGuessed = []
    while num > 0:
        print('You have %d guesses left'%(num))
        num -= 1
        print('Available Letters:',end = '')
        print(getAvailableLetters(lettersGuessed))
        print('Please guess a letter: ',end = '')
        alp = input()
        if alp in lettersGuessed:
            print('Oops! You have already guessed that letter: %s'%(''.join(j)))
        else:
            lettersGuessed.append(alp)
            if alp in secretWord:
                print('Good guess: %s' % (''.join(listt(j, getGuessedWord(secretWord, lettersGuessed)))))
            else:
                print('Oops! That letter is not in my word: %s' % (''.join(j)))
        j = listt(j,getGuessedWord(secretWord, lettersGuessed))
        print('----------------------')
        if list(secretWord) == j:
            print('Congratulations, you won!')
            return ''.join(listt(j,getGuessedWord(secretWord, lettersGuessed)))
    print('Sorry, you ran out of guesses. The word was else.')
    return secretWord










# When you've completed your hangman function, uncomment these two lines
# and run this file to test! (hint: you might want to pick your own
# secretWord while you're testing)

secretWord = chooseWord(wordlist).lower()
hangman(secretWord)

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值