Python遊戲編程(二)Dragon Realm

這篇介紹第二個遊戲,叫做Dragon Realm,就是簡單的文本遊戲,就像二選一一樣,通過time模塊中的函數來延遲時間。

遊戲中有兩個山洞,一個有寶藏,另一個則有厄運,玩家選擇進入哪個山洞。

源代碼:

import random
import time

def displayIntro():
    print("""You are in a land full of dragons.In front of you,
          you see two caves. In one cave, the dragon is friendly
          and will share his treasure with you. The other dragon
          is greedy and hungry, and eat you on sight.""")
    print()
    
def chooseCave():
    cave = ''
    while cave != '1' and cave != '2':
        print('Which cave will you go into?(1 or 2)')
        cave = input()
    return cave
def checkCave(chosenCave):
    print('You approach the cave...')
    time.sleep(2)
    print('It is dark and spooky...')
    time.sleep(2)
    print('A large dragon jumps out in front of you! He opens his jaws')
    print()
    time.sleep(2)
    
    friendlyCave = random.randint(1, 2)
    
    if chosenCave == str(friendlyCave):
        print('Gives you his treasure!')
    else:
        print('Gobbles you down in one bite!')
        
playAgain = 'yes'
while playAgain == 'yes' or playAgain == 'y':
    displayIntro()
    caveNumber = chooseCave()
    checkCave(caveNumber)
    
    print('Do you want to play again?(yes or no)')
    playAgain = input()

本遊戲主要內容:

  • 流程圖;
  • 用def關鍵字創建自己的函數;
  • 多行字符串;
  • while語句;
  • 布爾操作符and、or和not;
  • 真值表;
  • 關鍵字return;
  • 全局變量作用域和局部變量作用域;
  • 形參和實參;
  • sleep()參數;

流程圖:

流程圖展示了在遊戲中能夠發生的每一種可能的動作,以及與之相關聯的動作。在開始編寫代碼之前,先畫出你想要實現的功能,當你開始這麼做的時候,就是在設計程序。

函數:

函數使得我們可以多次運行相同的代碼,而無需多次賦值粘貼源代碼。Dragon Realm遊戲中,我們編寫了自己的函數以供程序來調用。函數就像是一個程序中的小程序。

def displayIntro():
    print("""You are in a land full of dragons.In front of you,
          you see two caves. In one cave, the dragon is friendly
          and will share his treasure with you. The other dragon
          is greedy and hungry, and eat you on sight.""")
    print()

上述代碼展示了一部分def函數語句的各個部分。def關鍵字後邊緊跟着帶有圓括號的函數名稱,然後是一個冒號(:)。def語句後面的語句塊叫做def語句塊。當定義一個函數的時候,在它的def語句塊中指定該函數的指令。當調用一個函數的時候,會執行def語句塊中的代碼。

除非調用該函數,def語句塊中的指令時不會執行的。

函數的def語句和def語句塊必須放在該函數調用之前,這就像使用一個變量之前必須要先爲變量賦一個值一樣。如果把函數調用放在了函數定義之前,就會得到一個錯誤。

多行字符串

在一個字符串的開始和結尾使用了3個引號字符,字符串就可以跨越多行了,這就是多行字符串。只要3個引號一起使用,就不必使用\n轉義字符或者轉義引號。

def chooseCave():
    cave = ''
    while cave != '1' and cave != '2':
        print('Which cave will you go into?(1 or 2)')
        cave = input()
    return cave

while語句實現循環

while循環由while關鍵字、條件和一個冒號組成,while語句標誌一個循環的開始。for循環會循環一定的次數,而while循環只要某一個條件爲True就會一直重複。當執行遇到一條while語句時,它會計算while關鍵字後面的條件。如果條件計算爲True,執行會移動到後面的語句塊中。如果計算爲False,執行會跳過while語句塊。在while循環中,當執行到達語句塊的末尾的時候,它會回到while語句以重新檢查條件。

布爾操作符

布爾邏輯處理結果爲True或False的事件,布爾操作符對值進行比較,並且得到一個布爾值。
and(與)
or(或)
not(非)

返回值
return語句只是出現在一個函數的def語句塊中,一旦執行了return語句,程序執行會立即跳出def語句塊,就像break語句會讓執行跳出while語句塊一樣。程序執行將返回到調用該函數的那行代碼。這個函數調用本身的結果就是其返回值。

全局作用域和局部作用域

關於在函數中創建的變量,還有一些特別之處。

當調用一個函數的時候,就創建了一個局部作用域(local scope),在這個函數語句塊內的任何變量,都存在於這個局部作用域中,可以把作用域當做是變量的容器。調用函數時,變量被創建,稱之爲局部變量(local variable)。

在函數之外分配的變量,存在於全局作用域(global scope)中。只有一個全局作用域,並且當程序開始的時候,就創建了該作用域。當程序終止的時候,全局作用域就銷燬了,並且其所有的變量也會被忘掉。存在於全局作用域的變量稱之爲全局變量(global scope)。

def checkCave(chosenCave):
    print('You approach the cave...')
    time.sleep(2)
    print('It is dark and spooky...')
    time.sleep(2)
    print('A large dragon jumps out in front of you! He opens his jaws')
    print()
    time.sleep(2)
    
    friendlyCave = random.randint(1, 2)
    
    if chosenCave == str(friendlyCave):
        print('Gives you his treasure!')
    else:
        print('Gobbles you down in one bite!')

函數形參

上述代碼中checkCave()函數的形參就是chosenCave,所謂形參,是供函數的代碼使用的一個局部變量。當調用函數時,調用者的實參(argument)是要賦值給這個形參值的。

參考:

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