Python遊戲編程(四)Hangman

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

參考:

  1. 《Python遊戲編程快速上手》第四版,AI Sweigart著,李強 譯
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章