文章程式碼顯示

2017年8月17日 星期四

一起學 Python - 09:小結:自製 姓名大作戰 time.sleep()與break




還記得之前在Facebook上有出現姓名大作戰這款遊戲,玩法是讓玩家一開始輸入兩個名字,並且讓兩個姓名進行對戰。說實在這遊戲跟朋友玩真的是頗有趣的,而事實上在學了前面幾章的 Python 練習之後,我們已經有能力可以自己製作一個這樣的遊戲了 !!!

首先我們先釐清一下想要達到的功能是什麼,還有大致上的流程是如何

在遊戲的一開始我們需要 input() 函數讓使用者輸入兩個對戰的姓名,並且需要列印出該姓名的 HP 、 攻 、 防 ... 等等,在此我們就只取前三個參數就好,簡化遊戲的設計。接著我們需要讓兩個姓名開始對打,為了增加趣味性,我們大量的使用 random 函數來增加不確定性,也就是身為這個遊戲的製作者,也不曉得究竟哪一邊會勝利,一切純憑運氣了。if ... ;else 則用來進行判斷;print來進行文字列印;while用來執行遊戲的迴圈


所以流程大致上可以是這樣

1. 讓使用者輸入兩個姓名分別是 A 跟 B
2. 亂數產生 A 跟 B 的 HP 、攻及防
3. 假設A先攻
4. B姓名現有的HP 減掉 ( A的攻擊減掉 B的防禦 遊戲王的概念!?) 再減掉一個亂數(增加不確定性)
5. 列印文字 " A 對 B 發動攻擊造成傷害 ??? 點, B剩下 ??? 點生命 "
6. 檢視B的生命是不是小於0 ,若成立則利用break跳出迴圈結束遊戲,不成立則繼續往下執行
7. 換B攻擊A 如同456步驟
8. 跳回第4步驟(迴圈)
9. 迴圈跳出,遊戲結束。列印文字 " A對B說 回家再練個幾年吧 "

整個程式碼如下,用到了兩個新的指令(不是說好用前面幾章學過的?),啊 ... 其實這兩個指令太簡單了,以致於我就沒開專章來說了。分別是 time.sleep() 與 break

time.sleep() 需要 import time 模組並調用裡面的 sleep 函數,其功用是讓程式暫停個幾秒,括弧內輸入的變數就是秒數
break 的概念也很好理解,就是跳出現有的迴圈。由程式碼中可以看出,運行的過程中如果 A 或 B 的 HP 低於 0 (也就是某一方掛了),就跳出現有的迴圈(while迴圈),到遊戲結束的地方。

import random
import time

A = input('輸入玩家1對戰姓名: ')
B = input('輸入玩家2對戰姓名: ')

A_HP = random.randint(100,600)
A_ATTACK = random.randint(20,150)
A_DEFENSE = random.randint(30,100)

B_HP = random.randint(100,600)
B_ATTACK = random.randint(20,150)
B_DEFENSE = random.randint(30,100)



print("\n【%s】姓名能力指數" % (A))
print("HP : %d 攻 : %d 防 : %d" % (A_HP,A_ATTACK,A_DEFENSE))

print("【%s】姓名能力指數" % (B))
print("HP : %d 攻 : %d 防 : %d\n" % (B_HP,B_ATTACK,B_DEFENSE))
time.sleep(2)

while ((A_HP >= 0)or(B_HP >=0)):
    temp = (A_ATTACK-B_DEFENSE)+random.randint(80,150)
    B_HP = B_HP - temp
    print("【%s】對【%s】發動了愛的攻擊,造成 %d 傷害,【%s】剩下 %d 生命值。" % (A,B,temp,B,B_HP))
    time.sleep(2)
    if B_HP <= 0:
        break
    
    temp = (B_ATTACK-A_DEFENSE)+random.randint(80,150)
    A_HP = A_HP - temp
    print("【%s】對【%s】發動了愛的攻擊,造成 %d 傷害,【%s】剩下 %d 生命值。" % (B,A,temp,A,A_HP))
    time.sleep(2)
    if A_HP <= 0:
        break
    
# 遊戲結束
if A_HP<=0:
    print("【%s】擊敗了【%s】。仰天長嘯地說:回家再練個幾年吧" % (B,A))
else:
    print("【%s】擊敗了【%s】。仰天長嘯地說:回家再練個幾年吧" % (A,B))

print(input('Press Enter'))


















僅用幾堂課的時間,就可以寫出一個在 Facebook 上大紅大紫的應用,是不是很有成就感呢 !?
當然這個程式碼還有可以改進的地方,例如應該亂數選擇讓 A 或 B 先攻,而不是都A先攻。以及為了增加趣味性,文字的部分應該要亂數變更,但此概念需要利用到陣列的概念,在後續的章節將會教到,到時有興趣的同學就可以回過頭來讓自己的姓名大作戰更完美囉!!!

新來的同學還不快點到一起學 Python - 00 :Python安裝 實現簡單猜數字遊戲 惡補?
一起學 Python - 08 :print()函數深入解析以及使用open()函數讀取、輸出數據
一起學 Python - 07 :import random 載入模塊? 結構體?

進階版 一起學 Python - 13:自製 姓名大作戰 加入陣列改良 讓你的人物變成武俠大師

↓↓↓ 連結到部落格方針與索引 ↓↓↓

Blog 使用方針與索引