python_test2(函式)
阿新 • • 發佈:2021-10-11
田忌賽馬
第一階段:將專案1的部分程式碼,調整後用函式封裝並呼叫。
第二階段:從角色池裡為雙方隨機選出3個角色,並隨機生成血量和攻擊力。
第三階段:詢問玩家角色出場順序,並打印出來。
第四階段:根據出場順序和對方進行三輪PK,並輸出結果。
第一階段
將專案1的部分程式碼,調整後用函式封裝並呼叫。
分析:注意變數的作用域,比方說
這兩個變數如果沒有套在這裡面的話,輸出結果會一直是平局。
import time # 展示角色 def show_role(player_life,player_attack,enemy_life,enemy_attack): print('【玩家】\n血量:%s\n攻擊:%s'%(player_life,player_attack)) print('----------------------------------------------------' ) time.sleep(1) print('【敵人】\n血量:%s\n攻擊:%s'%(enemy_life,enemy_attack)) print('----------------------------------------------------') # 雙方PK def pk_role(player_life,player_attack,enemy_life,enemy_attack):while player_life > 0 and enemy_life > 0: player_life = player_life - enemy_attack enemy_life = enemy_life - player_attack time.sleep(1) print('你發起了攻擊,【敵人】剩餘血量'+str(enemy_life)) print('敵人向你發起了攻擊,【玩家】剩餘血量'+str(player_life)) print('----------------------------------------------------') show_result(player_life,enemy_life) # 列印戰果 def show_result(player_life,enemy_life): if player_life > 0 and enemy_life <= 0: print('敵人死翹翹了,這局你贏了') elif player_life <= 0 and enemy_life > 0: print('悲催,這局敵人把你幹掉了!') else: print('哎呀,這局你和敵人同歸於盡了!') print('----------------------------------------------------') # (主函式)展開戰鬥全流程 def main(player_life,player_attack,enemy_life,enemy_attack): show_role(player_life,player_attack,enemy_life,enemy_attack) pk_role(player_life,player_attack,enemy_life,enemy_attack) main(100,35,105,33) main(120,36,100,45) main(100,35,100,35)
效果動圖:
第二階段
從角色池裡為雙方隨機選出3個角色,並隨機生成血量和攻擊力。
分析:因為要隨機生成角色,這些角色是我們事先存放在一個列表裡的,因此我們要用到從列表隨機抽取3個角色的函式,經過搜尋,random.sample可以實現這個功能
import time import random player_list = ['【德瑪西亞皇子】','【德瑪西亞之力】','【無雙劍姬】','【光輝女郎】','【暗夜獵手】','【龍血武姬】'] enemy_list = ['【諾克薩斯統領】','【詭術妖姬】','【榮耀行刑官】','【刀鋒之影】','【亡靈勇士】','【嗜血獵手】'] players = random.sample(player_list,3) enemies = random.sample(enemy_list,3) player_info = {} enemy_info = {} #隨機生成兩種屬性 def born_role(): life = random.randint(100,166) attack = random.randint(30,66) return life,attack # 給角色隨機屬性,並展示角色資訊 def show_role(): for i in range(3): player_info[players[i]] = born_role() enemy_info[enemies[i]] = born_role() # 展示我方的3個角色 print('----------------- 角色資訊 -----------------') print('你的人物:') for i in range(3): print('%s 血量:%d 攻擊:%d' %(players[i],player_info[players[i]][0],player_info[players[i]][1])) #展示敵方的3個角色 print('--------------------------------------------') print('電腦敵人:') for i in range(3): print('%s 血量:%d 攻擊:%d' %(enemies[i],enemy_info[enemies[i]][0],enemy_info[enemies[i]][1])) show_role()
效果圖:
第三階段
詢問玩家角色出場順序,並打印出來。
分析:我們再建一個字典把使用者給出的順序依次放入新的字典中就可以,然後再封裝一下函式(注意把玩家角色定義為全域性變數,否則後面的函式無法引用)。
import time import random player_list = ['【德瑪西亞皇子】','【德瑪西亞之力】','【無雙劍姬】','【光輝女郎】','【暗夜獵手】','【龍血武姬】'] enemy_list = ['【諾克薩斯統領】','【詭術妖姬】','【榮耀行刑官】','【刀鋒之影】','【亡靈勇士】','【嗜血獵手】'] players = random.sample(player_list,3) enemies = random.sample(enemy_list,3) player_info = {} enemy_info = {} #隨機生成兩種屬性 def born_role(): life = random.randint(100,166) attack = random.randint(30,66) return life,attack # 給角色隨機屬性,並展示角色資訊 def show_role(): for i in range(3): player_info[players[i]] = born_role() enemy_info[enemies[i]] = born_role() # 展示我方的3個角色 print('----------------- 角色資訊 -----------------') print('你的人物:') for i in range(3): print('%s 血量:%d 攻擊:%d' %(players[i],player_info[players[i]][0],player_info[players[i]][1])) #展示敵方的3個角色 print('--------------------------------------------') print('電腦敵人:') for i in range(3): print('%s 血量:%d 攻擊:%d' %(enemies[i],enemy_info[enemies[i]][0],enemy_info[enemies[i]][1])) print('--------------------------------------------') input('請按回車鍵繼續。\n') # 為了讓玩家更有控制感,可以插入類似的程式碼來切分遊戲程序。 #詢問玩家我方角色的出場順序。 def order_role(): global players test1 = {} for i in range(3): order = int(input('請選擇'+ players[i] +'的出場次序')) test1[order] = players[i] players = [] for i in range(1,4): players.append(test1[i]) print('\n我方角色的出場順序是:%s、%s、%s' % (players[0],players[1],players[2])) print('敵方角色的出場順序是:%s、%s、%s' % (enemies[0],enemies[1],enemies[2])) def main(): show_role() order_role() main()
效果動圖:
第四階段
根據出場順序和對方進行三輪PK,並輸出結果。
分析:要定義pk的函式,以及輸出結果的函式,以及對上面三個階段的融合。
import time import random player_list = ['【德瑪西亞皇子】','【德瑪西亞之力】','【無雙劍姬】','【光輝女郎】','【暗夜獵手】','【龍血武姬】'] enemy_list = ['【諾克薩斯統領】','【詭術妖姬】','【榮耀行刑官】','【刀鋒之影】','【亡靈勇士】','【嗜血獵手】'] players = random.sample(player_list,3) enemies = random.sample(enemy_list,3) player_info = {} enemy_info = {} #隨機生成兩種屬性 def born_role(): life = random.randint(100,166) attack = random.randint(30,66) return life,attack # 給角色隨機屬性,並展示角色資訊 def show_role(): for i in range(3): player_info[players[i]] = born_role() enemy_info[enemies[i]] = born_role() # 展示我方的3個角色 print('----------------- 角色資訊 -----------------') print('你的人物:') for i in range(3): print('%s 血量:%d 攻擊:%d' %(players[i],player_info[players[i]][0],player_info[players[i]][1])) #展示敵方的3個角色 print('--------------------------------------------') print('電腦敵人:') for i in range(3): print('%s 血量:%d 攻擊:%d' %(enemies[i],enemy_info[enemies[i]][0],enemy_info[enemies[i]][1])) print('--------------------------------------------') input('請按回車鍵繼續。\n') # 為了讓玩家更有控制感,可以插入類似的程式碼來切分遊戲程序。 #詢問玩家我方角色的出場順序。 def order_role(): global players test1 = {} for i in range(3): order = int(input('請選擇'+ players[i] +'的出場次序')) test1[order] = players[i] players = [] for i in range(1,4): players.append(test1[i]) print('\n我方角色的出場順序是:%s、%s、%s' % (players[0],players[1],players[2])) print('敵方角色的出場順序是:%s、%s、%s' % (enemies[0],enemies[1],enemies[2])) # 角色PK def pk_role(): round = 1 score = 0 for i in range(3): # 一共要打三局 player_name = players[i] enemy_name = enemies[i] player_life = player_info[players[i]][0] player_attack = player_info[players[i]][1] enemy_life = enemy_info[enemies[i]][0] enemy_attack = enemy_info[enemies[i]][1] # 每一局開戰前展示戰鬥資訊 print('\n----------------- 【第%d局】 -----------------' % round) print('玩家角色:%s vs 敵方角色:%s ' %(player_name,enemy_name)) print('%s 血量:%d 攻擊:%d' %(player_name,player_life,player_attack)) print('%s 血量:%d 攻擊:%d' %(enemy_name,enemy_life,enemy_attack)) print('--------------------------------------------') input('請按回車鍵繼續。\n') # 開始判斷血量是否都大於零,然後互扣血量。 while player_life > 0 and enemy_life > 0: enemy_life = enemy_life - player_attack player_life = player_life - enemy_attack print('%s發起了攻擊,%s剩餘血量%d' % (player_name,enemy_name,enemy_life)) print('%s發起了攻擊,%s剩餘血量%d' % (enemy_name,player_name,player_life)) print('--------------------------------------------') time.sleep(1) else: # 每局的戰果展示,以及分數score和局數的變化。 # 呼叫show_result()函式,列印返回元組中的result。 print(show_result(player_life,enemy_life)[1]) # 呼叫show_result()函式,完成計分變動。 score += int(show_result(player_life,enemy_life)[0]) round += 1 input('\n點選回車,檢視比賽的最終結果\n') if score > 0: print('【最終結果:你贏了!】\n') elif score < 0: print('【最終結果:你輸了!】\n') else: print('【最終結果:平局!】\n') # 返回單局戰果和計分法所加分數。 def show_result(player_life,enemy_life): # 注意:該函式要設定引數,才能判斷單局戰果。 if player_life > 0 and enemy_life <= 0: result = '\n小勝一局,加把勁沖沖衝!' return 1,result # 返回元組(1,'\n敵人死翹翹了,你贏了!'),類似角色屬性的傳遞。 elif player_life <= 0 and enemy_life > 0: result = '\n別慌,爭取下把拿下!' return -1,result else : result = '\n平局了,可惜!' return 0,result # (主函式)展開戰鬥流程 def main(): show_role() order_role() pk_role() # 啟動程式(呼叫主函式) main()
效果動圖:
結束!