本文目录

  • 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:fileinFile = open(WORDLIST_FILENAME, 'r')# line:stringline = inFile.readline()# wordlist:list of stringswordlist = line.split()print("  ", len(wordlist), "words loaded.")return wordlistdef 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 Falsereturn Truedef 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 + ireturn worddef get_available_letters(letters_guessed):'''letters_guessed:字母构成的list,其中包含用户已经猜中的字母,字母全部为小写返回值:string类型,由用户尚未猜中的字母组成'''letters = ''for i in string.ascii_lowercase:if i not in letters_guessed:letters = letters + ireturn lettersdef hangman(secret_word):'''secret_word:string类型,谜底单词,即用户正在猜的单词该函数实现Hangman游戏的交互功能。主要包含以下功能点:- 游戏开始时,提示用户谜底单词包含多少个字母,以及用户一共有几次猜测机会。- 在游戏开始时,为用户提供6次猜测机会(当然也可以提供更多,取决于你的设计)。- 在每个猜词回合开始之前,提示用户还剩多少次猜测机会,以及谜底单词还有哪些字母没有被猜出。- 请求用户在每个回合输入【一个字母】作为猜测值,同时确保用户输入的内容不为空。- 在用户完成每一次猜测之后,需要立即提示用户,当前猜测字母是否存在于谜底单词中。- 在每次猜词之后,提示用户,哪些字母已经被正确猜出,哪些字母还未被猜出。其他具体要求请参照本次实践练习的指导手册.'''print('Welcome to the game, Hangman!')# 猜词次数:单词长度小于5,次数为6;大于5,次数为长度+3n = 6if len(secret_word) > 5:n = len(secret_word) + 3print('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: ')# 输入必须为字母,长度必须为1if 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!')returnn = n - 1print('===========================')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 Falsefor i in range(len(my_word)):if my_word[i] != '*' and my_word[i] != other_word[i]:return Falsereturn Truedef show_possible_matches(my_word):'''my_word:string类型,当前的谜底单词,其中尚未猜中的字母以*表示。返回值:无(无需返回值)功能:用print()函数打印出worldlist中所有与my_word匹配的单词。'''print('Possible word matches are:')count = 0for word in wordlist:if match_with_gaps(my_word, word):count += 1print(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,次数为长度+3n = 6if len(secret_word) > 5:n = len(secret_word) + 3print('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))continueif not letter.isalpha() or len(letter) != 1:print('Oops! That is not a valid letter:', get_guessed_word(secret_word, letters_guessed))continueletter = 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!')returnn = n - 1print('===========================')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(不带提示和带提示版本)

Python实现猜词游戏 Hangman Game(不带提示和带提示版本)相关推荐

  1. hangman游戏c语言,英语游戏 猜词游戏hangman

    HANGMAN英语课堂游戏的设计 广东深圳市电子技术学校 张江宏 一.Hangman游戏的由来 Hangman在西方是一个家喻户晓的猜词游戏.Hang的英文意思是"绞死",而Man ...

  2. 采用python语言实现猜数游戏_用python实现猜数游戏

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 本文实例为大家分享了python实现猜数游戏的具体代码,供大家参考,具体内容如下 ...

  3. 教你用python制作猜数游戏

    大家好!我又回来了!今天我教大家怎样用python制作猜数游戏.在此之前我们先了解一下什么是python版猜数游戏. 了解 python版猜数游戏是指您先输入下限值与上限值,然后系统随机生成一个在此范 ...

  4. python实现猜数字游戏_python如何实现猜数字游戏

    python实现猜数字游戏的方法:使用条件语句实现判断,代码为[print('猜一个1-20之间的整数.');print('开始猜:');for i in range(1, 7):try:guess ...

  5. 微信小程序开发之猜词游戏

    基于微信小程序开发的猜词游戏.之所以想开发这个小游戏,是因为网上类似的游戏,充斥了太多广告和暗坑,所以想想比如自己开发一个. 以下是几个截图,比较简单,但是足够自己玩了:) 源码地址供参考: 微信小程 ...

  6. Day18-用vim写猜词游戏

    Day18-用vim写猜词游戏

  7. python编写猜数游戏代码、如果不是整数、显示输入错误_数字炸弹游戏程序 用python来实现...

    相信许多小伙伴都玩过数字炸弹游戏,就是指在一定数字范围(一般是整数,不包含边界)里,一个玩家选中一个数字当作炸弹,其余玩家在这个范围含数字,每次只要没猜中炸弹数字,则根据玩家猜的数字缩小范围,直至其中 ...

  8. python编写猜数游戏代码、如果不是整数、显示输入错误_python编写猜数游戏代码、如果不是整数、显示输入错误_数字炸弹游戏程序 用python来实现......

    相信许多小伙伴都玩过数字炸弹游戏,就是指在一定数字范围(一般是整数,不包含边界)里,一个玩家选中一个数字当作炸弹,其余玩家在这个范围含数字,每次只要没猜中炸弹数字,则根据玩家猜的数字缩小范围,直至其中 ...

  9. python连续猜数游戏_python实现猜数游戏

    本文实例为大家分享了python实现猜数游戏的具体代码,供大家参考,具体内容如下 一.问题描述: 使用python开发一个猜数小游戏,程序随机产生0~1024之间的数字,用户输入猜测数字,程序告诉用户 ...

最新文章

  1. 电动双联电位器ZW1613
  2. 关于ionic的跨域问题
  3. 【数据结构与算法】之深入解析“插入区间”的求解思路与算法示例
  4. MPU和CPU有什么区别?
  5. 项目信息追踪(Log)
  6. IOS开发基础之汽车品牌项目-14
  7. iphone 数据存储之属性和归档archive
  8. mybatis萌新基础
  9. kmeans算法中的sse_k-means聚类算法原理与参数调优详解
  10. 无人机会飞丢及编程上的改进思路
  11. 肇庆学院计算机类宿舍哪里,肇庆学院宿舍怎么样 住宿条件好不好
  12. 为什么大龄程序员不能去创业?网友:看完这四个原因你就懂了
  13. 评弱水三千,该取几瓢饮?———贪恋还是专情
  14. 【Git】git checkout
  15. 代码规范 : 关于注释和日志
  16. 在线文档编辑插件——KindEditor
  17. 测试菜鸟学习网站汇总
  18. Oracle 11g 停止正在运行的job
  19. php.ini配置文件详解(mac nginx1.8.0 php5.6 )持续更新中
  20. 微信小程序-图片宽高设置

热门文章

  1. 6-8 使用函数求最大公约数 (10 分)
  2. flush=true 的含义
  3. IDEA安装docker插件
  4. oracle索引的一些实践
  5. rtx3050和rtx3050ti区别 rtx3050和rtx3050ti显卡什么水平
  6. jarsigner签名APK完整步骤
  7. PHP 的__call()
  8. 微信公众号网页授权,获取用户信息以及openid -- PHP后台
  9. Photoshop制作水晶立体字
  10. Cravatar头像