Hangman是一个双人游戏,通常用纸和铅笔来玩。一个玩家想好一个单词,然在纸上为单词的每个字母画一个空格。然后第二个玩家猜测这个单词中可能包含的字母。
如果第二个玩家猜测对了,第一个玩家就在正确的空格处填写这个字母。如果没有猜对,第一个玩家就画出火柴人的身体的一部分。第二个玩家必须在火柴人画好之前,就猜对单词中所有的字母,只有这样他才能获胜。
主要内容:
- 列表;
- in操作符;
- 方法;
- 字符串方法lower()、upper()、split()、startswith()和endswith();
- elif语句;
源代码:
import random
HANGMAN_PICS = ['''
+---+
|
|
|
===''','''
+---+
0 |
|
|
===''','''
+---+
0 |
| |
|
===''','''
+---+
0 |
/| |
|
===''','''
+---+
0 |
/|\ |
|
===''','''
+---+
0 |
/|\ |
/ |
===''','''
+---+
0 |
/|\ |
/ \ |
===''']
words = '''ant baboon badger bat beer beaver
camle cat clam cobra cougar
coyote crow deer dog donkey duck eagle
ferret fox frog goat goose hawk'''.split()
def getRandomWord(wordList):
#This function returns a random string from the passed list of string.
wordIndex = random.randint(0, len(wordList) - 1)
return wordList[wordIndex]
def displayBoard(missedLetters, correctLetters, secretWord):
print(HANGMAN_PICS[len(missedLetters)])
print()
print('Missed letters:', end=' ')
for letter in missedLetters:
print(letter, end=' ')
print()
blanks = '_'*len(secretWord)
for i in range(len(secretWord)):
#Replace blanks with correctly guessed letters.
if secretWord[i] in correctLetters:
blanks = blanks[:i] + secretWord[i] + blanks[i + 1:]
#Show the secret word with spaces in betweeen each letter.
for letter in blanks:
print(letter, end=' ')
print()
def getGuess(alreadyGuessed):
#Return the letter the player entered. This function makes sure the
#player entered asingle letter and not something else.
while True:
print('Guess a letter.')
guess = input()
guess = guess.lower()
if len(guess) != 1:
print('Please enter a single letter.')
elif guess in alreadyGuessed:
print('you have already guessed that letter. Choose again.')
elif guess not in 'abcdefghizklmnopqrstuvwxyz':
print('Please enter a LETTER.')
else:
return guess
def playAgain():
#This function returns True if the player wants to play agains;
#otherwise, it returns False.
print('Do you want to play again ? (yes or no)')
return input().lower().startswith('y')
print('H A N G M A N')
missedLetters = ' '
correctLetters = ' '
secretWord = getRandomWord(words)
gameIsDone = False
while True:
displayBoard(missedLetters, correctLetters, secretWord)
guess = getGuess(missedLetters + correctLetters)
if guess in secretWord:
correctLetters = correctLetters + guess
foundAllLetters = True
for i in range(len(secretWord)):
if secretWord[i] not in correctLetters:
foundAllLetters = False
break
if foundAllLetters == True:
print('Yes! The secret word is "' + secretWord + '"! You have won!')
gameIsDone = True
else:
missedLetters = missedLetters + guess
#Check if player has guessed too many times and lost.
if len(missedLetters) == len(HANGMAN_PICS) - 1:
displayBoard(missedLetters, correctLetters, secretWord)
print('You have run out of guesses!\nAfter ' +
str(len(missedLetters)) + ' missed guesses and '+
str(len(correctLetters)) + ' correct guesses, the word was "'
+ secretWord +' " ')
gameIsDone = True
#Ask the player if they want to play again(but only if the game is done.)
if gameIsDone:
if playAgain():
missedLetters = ''
correctLetters = ''
gameIsDone = False
secretWord = getRandomWord(words)
else:
break
常量:
变量HANGMAN_PICS的名称全部是大写的,这是表示常量的惯例。常量(constsnt)是在第一次赋值之后其值就不在变化的量。
列表数据类型
HANGMAN_PICS包含了几个多行字符串。逗号隔开的列表中的各个值,这些值也叫做元素(item)。HANGMAN_PICS中的每一个元素都是一个多行字符串,列表使得你能够存储多个值,而不需要为每个值都使用一个变量。
列表可以通过索引进行访问,记住列表索引值是从0开始的,就是说0是表示列表中的第一个元素。
列表连接
列表使用 + 号连接,如下例:
>>> [1,2,3] + [4,5,6] + [7,8,9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
in操作符
in操作符可以告诉我们一个值是否在列表中,使用in操作符的表达式会返回一个布尔值。如果该值在列表中,返回值是True;如果该值不在列表中,返回值是False。
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> 1 in [1,2,3]
True
>>> 4 in [1,2,3]
False
调用方法:
方法(method)是附加到一个值之上的函数。要调用一个方法,必须使用一个句点将其附加到一个具体的值上。
reverse()方法会把列表中的元素顺序反转。
>>> x = [1,2,3]
>>> x.reverse()
>>> x
[3, 2, 1]
append()方法会把作为参数传递给它的值添加到列表的末尾。
>>> x = [1,2,3]
>>> x.append(4)
>>> x
[1, 2, 3, 4]
split()方法返回多个字符串的一个列表
>>> y ='Hello Pyhton'
>>> y.split()
['Hello', 'Pyhton']
lower()方法返回一个字母都是小写的字符串
upper()方法返回一个字母都是大写的字符串
>>> y ='Hello Pyhton'
>>> y.split()
['Hello', 'Pyhton']
>>> y = 'Hello World'
>>> y.lower()
'hello world'
>>> y.upper()
'HELLO WORLD'
startswith()方法是以括号内开头的返回True,反之为False
endswith()方法是以括号内开头的返回Flase,繁殖为True
>>> 'hello'.startswith('h')
True
>>> 'python'.endswith('p')
False
参考:
- 《Python游戏编程快速上手》第四版,AI Sweigart著,李强 译