【Python】Python实现猜词游戏 Hangman Game(不带提示和带提示版本)

【Python】Python实现猜词游戏 Hangman Game(不带提示和带提示版本),第1张

【Python】Python实现猜词游戏 Hangman Game(不带提示和带提示版本)

本文目录

Python实现猜词游戏(Hangman Game)

一、任务准备二、Hangman游戏的功能需求三、辅助函数的构建

1.确定一个单词是否被猜出2.获取用户当前的猜词进度3.确定还有哪些字母没猜过4.将当前猜词进度与词库匹配5.输出所有可能的匹配项 四、代码实现

Python实现猜词游戏(Hangman Game)

利用python语言,实现经典英语猜词游戏Hangman的程序设计。关于Hangman的具体游戏规则,可参见百度百科([https://baike.baidu.com/item/Hangman/9308312])。用python实现该游戏似乎是一个非常复杂的问题,但实际并非如此。下面我们将对该问题进行分解,逐步引导大家实现程序。

一、任务准备

”hangman.py”和”words.txt”,请确保这两个文件存储在同一路径下。在开始写代码之前,可以在Spyder中直接运行hangman.py文件,文件中的初始代码将执行从words.txt中加载单词列表的功能,并在完成该功能之后输出如下内容:

Loading word list from file...
55900 words loaded.
二、Hangman游戏的功能需求

我们的主要任务是对hangman.py文件中的一个名为hangman的函数进行设计和实现,该函数能够让用户与计算机进行hangman猜词游戏。主要游戏形式为计算机选一个英文单词,用户来猜英文单词中包含的字母。
我们需要实现的功能可以大概描述如下(别担心,虽然看起来复杂,但后面我们会帮助大家进行分析和解构,问题会变得简单很多!):
1)计算机必须从words.txt文件的单词列表中随机选择一个谜底单词。请注意words.txt中包含的英文单词全部为小写形式。
2)游戏开始时,用户需要有一定次数的猜测机会。
3)游戏以交互方式进行,用户输入其猜测字母,计算机提供以下反馈:
a.如果用户猜对了,则将谜底单词被猜中的字母显示出来告知用户;
b.如果用户猜错了,则减少其猜测次数
当用户用完其猜测次数,或者在这之前谜底被正确猜出时,游戏结束。

三、辅助函数的构建 1.确定一个单词是否被猜出

首先,实现一个名为is_word_guessed()的函数,该函数包含两个参数,分别命名为secret_word和letters_guessed。secret_word为string类型,表示谜底单词,即用户正在猜的词;letters_guessed为一个由字母组成的列表(list)。
该函数的返回值为boolean类型,如果secret_word的所有字母都已存在于letters_guessed中,函数返回True;否则返回False。
这个函数将能够帮助我们确定当前的猜词游戏是否已经满足结束条件,因此只要猜词游戏还在进行中,我们就需要用到该函数判断secret_word的所有字母是否已经被全部猜出。
为简便起见,在实现该函数时,我们可以预设secret_word和letters_guessed中的字母均为小写形式。
函数使用示例:

> secret_word = 'apple'
> letters_guessed = ['e', 'i', 'k', 'p', 'r', 's']
> print(is_word_guessed(secret_word, letters_guessed))
False
2.获取用户当前的猜词进度

接下来,实现一个名为get_guessed_word()的函数,该函数同样包含两个命名为secret_word和letters_guessed的参数。不同的是,该函数的返回值是一个string类型,该string由secret_word中的字母和””组成,其中猜出的字母正常表示,未猜出的字母则用””表示。具体形式见下方示例。
提示:在编写该函数的内部代码时,请思考函数结束时需要返回哪些信息,在对一个数据结构进行遍历时是否需要一个变量来存储该信息,以及如何在迭代过程中对该信息进行汇总。

3.确定还有哪些字母没猜过

然后,实现一个名为get_available_letters()的函数,该函数包含一个名为letters_guessed的参数,即一个由字母组成的列表(list)。函数的返回值为一个string类型,由不存在于letters_guessed中的字母组成。函数返回值中的字母需要按字母顺序排列。
简便起见,可预设函数的使用环境只考虑小写形式的字母,即letters_guessed中的字母全部为小写形式,函数返回值中的字母也全部为小写。
提示:可考虑使用变量string.ascii_lowercase​,该变量中包含了按字母顺序排列的所有小写字母。

4.将当前猜词进度与词库匹配

实现一个名为match_with_gaps​()的函数,该函数包含两个参数,分别命名为my_word和other_word。my_word为string类型,表示在猜测过程中的单词,也就是说my_word可能同时包含字母和””号(例如”t**t”)。other_word则表示一个正常的英文单词。
该函数的返回值为boolean类型,当my_word中已猜出的字母,与other_word中的字母在对应位置均一致时,返回True;当my_word与other_word长度不一致,或者两者在对应位置有字母不一致时,返回False。
请注意,在对my_word与other_word进行比较时,my_word中未猜出的部分(即”
”号表示部分)是不应参与比较的,因此在比较时碰到”*”号时应予以跳过。

5.输出所有可能的匹配项

实现一个名为show_possible_matches​ ​()的函数,该函数包含一个名为my_word的参数。my_word为string类型,表示在猜测过程中的单词,也就是说my_word可能同时包含字母和”*”号(例如”t**t”)。
该函数无返回值,但需要输出wordlist中所有与my_word匹配的单词(wordlist在hangman.py文件的辅助代码中已事先定义好,具体见文件第56行代码)。

四、代码实现
# 猜词游戏(Hangman Game)
# -----------------------------------


############### 帮助代码-开始 ###############

# 答题者无需理解帮助代码的实现细节,但仍需要掌握如何使用该部分函数
# 以下代码中,请确保words.txt文件被程序正确读取

import random, string

# 单词库文件名,请注意words.txt文件中的单词全部为小写格式
WORDLIST_FILENAME = "words.txt"


def load_words():
    """
    返回值:一个由有效单词(string类型)构成的列表(list)
    
    根据单词列表的长度,该函数的执行可能需要消耗一定时间。
    """
    print("Loading word list from file...")
    # inFile:file
    inFile = open(WORDLIST_FILENAME, 'r')
    # line:string
    line = inFile.readline()
    # wordlist:list of strings
    wordlist = line.split()
    print("  ", len(wordlist), "words loaded.")
    return wordlist


def choose_word(wordlist):
    """
    wordlist:一个由有效单词(string类型)构成的列表(list)
    
    返回值:从wordlist中随机选取的一个单词
    """
    return random.choice(wordlist)


# 调用load_words()函数,将words.txt中的单词读取至变量wordlist中,
# 后续代码将可以直接从wordlist变量中读取任意单词
wordlist = load_words()


############### 帮助代码-结束 ###############


# -----------------------------------


def is_word_guessed(secret_word, letters_guessed):
    '''
    secret_word:string类型,谜底单词,用户正在猜的单词,该单词全部由小写字母构成
    letters_guessed:字母构成的list,其中包含用户已经猜中的字母,字母全部为小写
    
    返回值:boolean类型,如果secret_word的所有字母都已存在于letters_guessed中,
    返回True;否则返回False
    '''
    for i in secret_word:
        if i not in letters_guessed:
            return False
    return True


def get_guessed_word(secret_word, letters_guessed):
    '''
    secret_word:string类型,谜底单词,即用户正在猜的单词
    letters_guessed:字母构成的list,其中包含用户已经猜中的字母,字母全部为小写
    
    返回值:string类型,由用户已经猜中的字母,以及尚未猜中的字母(以*表示)组成。该string的
    字母排列顺序与谜底单词保持一致,如:谜底单词为study,猜测过程中的返回值的可能形式为s*u*y
    '''
    word = ''
    for i in secret_word:
        if i not in letters_guessed:
            word = word + '*'
        else:
            word = word + i
    return word


def get_available_letters(letters_guessed):
    '''
    letters_guessed:字母构成的list,其中包含用户已经猜中的字母,字母全部为小写
    
    返回值:string类型,由用户尚未猜中的字母组成
    '''
    letters = ''
    for i in string.ascii_lowercase:
        if i not in letters_guessed:
            letters = letters + i
    return letters


def hangman(secret_word):
    '''
    secret_word:string类型,谜底单词,即用户正在猜的单词
    
    该函数实现Hangman游戏的交互功能。主要包含以下功能点:
    
    - 游戏开始时,提示用户谜底单词包含多少个字母,以及用户一共有几次猜测机会。
      
    - 在游戏开始时,为用户提供6次猜测机会(当然也可以提供更多,取决于你的设计)。

    - 在每个猜词回合开始之前,提示用户还剩多少次猜测机会,以及谜底单词还有哪些字母没有被猜出。
    
    - 请求用户在每个回合输入【一个字母】作为猜测值,同时确保用户输入的内容不为空。
    
    - 在用户完成每一次猜测之后,需要立即提示用户,当前猜测字母是否存在于谜底单词中。

    - 在每次猜词之后,提示用户,哪些字母已经被正确猜出,哪些字母还未被猜出。
    
    其他具体要求请参照本次实践练习的指导手册.
    '''

    print('Welcome to the game, Hangman!')
    # 猜词次数:单词长度小于5,次数为6;大于5,次数为长度+3
    n = 6
    if len(secret_word) > 5:
        n = len(secret_word) + 3
    print('I am thinking of a word that is ' + str(len(secret_word)) + ' letters long.')
    letters_guessed = []
    while n != 0:
        print('===========================')
        print('You have ' + str(n) + ' guesses left.')
        # 谜底单词还有哪些字母没有被猜出
        print('Available letters: ', get_available_letters(letters_guessed))
        print('')
        # 请求用户在每个回合输入【一个字母】作为猜测值
        letter = input('Please guess a letter: ')
        # 输入必须为字母,长度必须为1
        if not letter.isalpha() or len(letter) != 1:
            print('Oops! That is not a valid letter:', get_guessed_word(secret_word, letters_guessed))
            continue
        # 大写转小写
        letter = letter.lower()
        letters_guessed.append(letter)
        if letter in secret_word:
            print('Good guess: ', get_guessed_word(secret_word, letters_guessed))
        else:
            print('Oops! That letter is not in my word: ', get_guessed_word(secret_word, letters_guessed))
        if is_word_guessed(secret_word, letters_guessed):
            print('===========================')
            print('Congratulations, you won!')
            return
        n = n - 1
    print('===========================')
    print('Sorry, you ran out of guesses. The word was: ', secret_word)


# ------------------Tips------------------
# 在完成以上hangman()函数的实现代码后,请滚动至最底部,对该函数的功能进行测试
# 提示:在进行测试时,可以考虑手动设置谜底单词,这样便于进行程序调试

# hangman()函数测试无误后,可进入以下部分,完成hangman_with_hints()函数的实现


# -----------------------------------


def match_with_gaps(my_word, other_word):
    '''
    my_word:string类型,当前的谜底单词,其中尚未猜中的字母以*表示。
    other_word:string类型,常规英文单词
    
    返回值:boolean类型,如果my_word与other_word长度相同,且my_word中已猜出的字母
    与other_word中对应位置的字母全部匹配,返回True;否则返回False。 
    '''
    if len(my_word) != len(other_word):
        return False
    for i in range(len(my_word)):
        if my_word[i] != '*' and my_word[i] != other_word[i]:
            return False
    return True


def show_possible_matches(my_word):
    '''
    my_word:string类型,当前的谜底单词,其中尚未猜中的字母以*表示。
    
    返回值:无(无需返回值)
    功能:用print()函数打印出worldlist中所有与my_word匹配的单词。

    '''
    print('Possible word matches are:')
    count = 0
    for word in wordlist:
        if match_with_gaps(my_word, word):
            count += 1
            print(word, end=' ')
            if count % 10 == 0:
                print('')
    print('')


def hangman_with_hints(secret_word):
    '''
    secret_word:string类型,谜底单词,即用户正在猜的单词
    
    该函数除了包含Hangman()函数的所有功能,还提供以下功能:    
    - 如果用户输入"*",则打印wordlist中与当前猜想结果相匹配的所有单词
    '''

    print('Welcome to the game, Hangman!')
    # 猜词次数:单词长度小于5,次数为6;大于5,次数为长度+3
    n = 6
    if len(secret_word) > 5:
        n = len(secret_word) + 3
    print('I am thinking of a word that is ' + str(len(secret_word)) + ' letters long.')
    letters_guessed = []
    while n != 0:
        print('===========================')
        print('You have ' + str(n) + ' guesses left.')
        print('Available letters: ', get_available_letters(letters_guessed))
        print('')
        letter = input('Please guess a letter: ')
        if letter == '*':
            show_possible_matches(get_guessed_word(secret_word, letters_guessed))
            continue
        if not letter.isalpha() or len(letter) != 1:
            print('Oops! That is not a valid letter:', get_guessed_word(secret_word, letters_guessed))
            continue
        letter = letter.lower()
        letters_guessed.append(letter)
        if letter in secret_word:
            print('Good guess: ', get_guessed_word(secret_word, letters_guessed))
        else:
            print('Oops! That letter is not in my word: ', get_guessed_word(secret_word, letters_guessed))
        if is_word_guessed(secret_word, letters_guessed):
            print('===========================')
            print('Congratulations, you won!')
            return
        n = n - 1
    print('===========================')
    print('Sorry, you ran out of guesses. The word was: ', secret_word)


# ------------------Tips------------------
# 在完成以上hangman_with_hint()函数的实现代码后,请在下方代码中,对该函数的功能进行测试
# 提示:在进行测试时,可以考虑手动设置谜底单词,这样便于进行程序调试

# hangman_with_hint()函数测试无误后,在下方完成主函数代码,最终提交作业


if __name__ == "__main__":
    # 以下为hangman()函数的测试代码,为了便于测试,可考虑将secret_word赋值为固定字符串

    # secret_word='apple'
    secret_word = choose_word(wordlist)
    hangman(secret_word)
    # hangman_with_hints(secret_word)

###############

# 以下为hangman_with_hints()函数的测试代码。请将以上两行代码注释,
# 并将以下代码从注释状态复原,然后进行测试
# 同样的,为了便于测试,可考虑将secret_word赋值为固定字符串

# secret_word = choose_word(wordlist)
# hangman_with_hints(secret_word)

下载地址:Python实现猜词游戏 Hangman Game(不带提示和带提示版本)

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5711444.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存