资源描述
综合练习
一、要求:
1、 本综合练习为选作,但建议完成;
2、 完成时间:2017年11月28日之前;
3、 如果完成,可在总评成绩中体现。
二、 题目(任选一个)
1、 结合个人实际工作内容,应用Python语言编程计算。
2、 设计完成一个单词游戏: HANGMAN。请按题目指导逐步完成。
这是一个经典单词游戏Hangman的变形设计。如果你对游戏规则不熟悉,可以点击链接(https://en.wikipedia.org/wiki/Hangman_(game))。此处第二玩家始终是计算机,它会随机选择一个单词(即下文经常用到的secretWord)
在这个问题中,你将实现函数hangman(最后需要完成的函数),程序将在玩家与计算机之间交互运行。在完成这个函数的设计之前,需要先创建几个辅助函数。
首先下载两个文件ps3_hangman.py 和 words.txt,存放在同一个目录中。打开并运行文件ps3_hangman.py ,不要做任何修改, 以保证正确运行。
题目所给的代码从文本文件wors.txt中装载单词列表,如果运行正常应该可以看到:
Loading word list from file...
55909 words loaded.
如果出现错误,需要将语句:
WORDLIST_FILENAME = "words.txt"
修改为类似如下形式(取决于words.txt存在哪个目录中):
WORDLIST_FILENAME = "C:\Users\Zhangjl\words.txt"
文件 ps3_hangman.py 已经实现了几个函数,可以直接用于问题的解决,你可以忽略代码中的注释,不过还是建议读一下。可以将自己的代码都写在这个文件里。
游戏要求:
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
最后要完成的函数hanman:
hangman(secretWord),它有一个输入参数:用户需要去猜测的单词 secretWord(后续程序用到的变量名)。由它开始游戏程序Hangman用户与计算机的交互过程。确保你用到之前部分设计完成的辅助函数isWordGuessed、etGuessedWord和 getAvailableLetters。
使用函数 lower() 来将用户的输入转换为小写。
有4个重要的信息需要保存:
(1) secretWord:猜测的目标单词
(2) lettersGuessed:追踪用户猜测过的字母
(3) mistakesMade:记录用户猜测错误的次数
(4) availableLetters:还可以用来被猜测的字母,用户猜测过的字母需要从availableLetters移除,用户重复猜了的字母,你需要告知用户你已经猜过这个字母。
The end
import random
import string
WORDLIST_FILENAME = "words.txt"
def loadWords():
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):
return random.choice(wordlist)
def isWordGuessed(secretWord, lettersGuessed):
for c in set(secretWord):
if not c in lettersGuessed:
return False
else:
return True
def getGuessedWord(secretWord, lettersGuessed):
ss=""
for s in set(lettersGuessed):
if s in secretWord:
ss=ss+s
return ss
def getAvailableLetters(lettersGuessed):
s="abcdefghijklmnopqrstuvwxyz"
for c in lettersGuessed:
s=s.replace(c,'')
return s
def hangman(secretWord):
print(" Welcome to the game, Hangman!")
print(" I am thinking of a word that is %d letters long."%len(secretWord))
lettersGuessed=''
AvailableLetters=getAvailableLetters(lettersGuessed)
GuessedWord=getGuessedWord(secretWord, lettersGuessed)
tmp_str=""
for i in range(0,len(secretWord)):
tmp_str=tmp_str+"_ "
left=8
while left>0:
print(" ------------")
print(" You have ",left, "guesses left.")
print(" Available letters:",AvailableLetters)
print(" Please guess a letter:",end='')
while 1:
c=input()
if ('a'<=c<='z' or 'A'<=c<='Z')and len(c)==1:
c=c.lower()
break
print(" Wrong input!Please guess a letter:")
if c in lettersGuessed:
print(" Oops! You've already guessed that letter:",tmp_str)
else:
lettersGuessed=lettersGuessed+c
AvailableLetters=getAvailableLetters(lettersGuessed)
if c in secretWord:
GuessedWord=GuessedWord+c
tmp_str=""
for tmp in secretWord:
if tmp in GuessedWord:
tmp_str=tmp_str+" "+tmp
else:
tmp_str=tmp_str+" "+"_"
print(" Good guess:",tmp_str)
if isWordGuessed(secretWord, lettersGuessed):
print(" Congratulations, you won!")
break
else:
left=left-1
print("Oops! That letter is not in my word:",tmp_str)
if not isWordGuessed(secretWord, lettersGuessed):
print("Sorry, you ran out of guesses. The word was else.")
wordlist = loadWords()
secretWord=chooseWord(wordlist)
hangman(secretWord)
展开阅读全文