本文目录
Python实现猜词游戏(Hangman Game)
利用python语言,实现经典英语猜词游戏Hangman的程序设计。关于Hangman的具体游戏规则,可参见百度百科([https://baike.baidu.com/item/Hangman/9308312])。用python实现该游戏似乎是一个非常复杂的问题,但实际并非如此。下面我们将对该问题进行分解,逐步引导大家实现程序。
完整代码下载
下载地址:Python实现猜词游戏 Hangman Game(不带提示和带提示版本)
一、任务准备
”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