使用Python模拟武侠小说中两派人的一场遭遇战。
生活随笔
收集整理的這篇文章主要介紹了
使用Python模拟武侠小说中两派人的一场遭遇战。
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
使用Python模擬武俠小說中兩派人的一場遭遇戰。
每個人都有名字、血量(HP) 、一系列技能及技能對應的攻擊輸出。每個人的攻擊方式均一致,即隨機從自己的技能包中抽取一個技能進行攻擊。兩派人(自己命名)均繼承
自武林人士這個父類,但有各個門派都有各自的技能包及對應的輸出值。門派下每個人擁有的技能包都是在實例化對象的時候隨機賦子的。
遭遇戰的時候,每個幫派的人數不確定。戰斗采用回合制的方式進行,即整派A中的一個人隨機選擇幫派B中的一個人進行攻擊, B受到的傷害值為A隨機選擇的技能的輸出值加
上20%的標準正態分布生成的隨機數向下取整,即傷害值=輸出值(1+0.2*N( 0,1)),技能被選擇的概率和其對應的輸出值成反比,如某人擁有兩個技能,輸出值分別為10、30
則技能1的被選擇概率為 (1/10)/(1/10 + 1/30).其中某一門派參與戰斗的所有人都則陣亡(既HP降為0)則戰斗結束。
幾個隨機數生成函數:首先引入random包, import random; random.random()生成一個0-1的均勻分布隨機數; random.randint(a,b)生成取信范圍為[a.b])的數隨機
?
?
import random # 導入庫 import numpy as np import math from matplotlib import pyplot as pltshaolin = {"玄難": 135, "玄寂": 132, "玄奘": 136, "玄苦": 137, "玄渡": 131} # 人 及其 HP carefree = {"康廣陵": 91, "范百齡": 93, "薛慕華": 108} # 人 及其 HP s_skill = {"大金剛掌": 20, "如來千手": 30, "擒龍功": 25, "金剛指": 30, "少林長拳": 35} # 技能及其輸出值 c_skill = {"小無相功": 20, "天山折梅手": 30, "八荒六合唯我獨尊功": 25, "天上六陽掌": 30} # 技能及其輸出值 d_sname = {} d_cname = {} s_suiji = {} c_suiji = {}class Wulinpeople():def __init__(self):self.s_name = random.sample(list(s_skill),random.randrange(1,len(s_skill)+1))self.c_name = random.sample(list(c_skill),random.randrange(1,len(c_skill)+1))def Shaolin_Temple(self):s_name = random.sample(list(shaolin),1)[0] # 隨機選取攻擊方的人物s_hp = shaolin[s_name] # 隨機選取攻擊方人物的hpc_name = random.sample(list(carefree),1)[0] # 隨機選取被攻擊方的人物c_hp = carefree[c_name] # 隨機選取被攻擊方人物的hppt = d_sname[s_name] # 隨機分配的技能包qwq = random.random()for x in pt: # 隨機分配的技能包的輸出值s_suiji[x]=s_skill[x]a = list(s_suiji.values())c = 0key = 0s_kill_name = "" #定義隨機技能名的變量for i in s_suiji:i_1 = s_skill[i]b = 0for j in a:b += 1/jkey += 1/i_1 / b# print("c的值:{} key的值{}".format(c,key))if c < qwq <= key:s_kill_name = i # 根據輸出值成反比的概率 分配的技能名# print('隨機值:{},技能名:{},技能輸出值{}'.format(qwq,i,i_1))c = key# s_kill_name = random.sample(pt, 1)[0] # 隨機分配的技能s_kill_hp = int(s_skill[s_kill_name] ) # 隨機分配的技能輸出值random3 = np.random.randn() # 隨機生成1個服從正態分布的隨機數hurt = math.floor(s_kill_hp * (1 + 0.2*random3)) #向下取整的傷害值# print("傷害是{:0.1f}".format(hurt))print("少林僧人{}使出了一招傷害為{}的{}".format(s_name,s_kill_hp,s_kill_name))c_kill_hp = c_hp - hurtif c_kill_hp <= 0:del carefree[c_name] # 刪除鍵 'shaolin'print("逍遙派{}受到{}點傷害,剩余HP{}".format(c_name, hurt, 0))print("逍遙派{}陣亡!!!!".format(c_name))else:carefree[c_name] = c_kill_hpprint("逍遙派{}受到{}點傷害,剩余HP{}".format(c_name, hurt, c_kill_hp))def Carefree(self):c_name = random.sample(list(carefree),1)[0] # 隨機選取攻擊方的人物c_hp = carefree[c_name] # 隨機選取攻擊方人物的hps_name = random.sample(list(shaolin),1)[0] # 隨機選取被攻擊方的人物s_hp = shaolin[s_name] # 隨機選取被攻擊方人物的hppt = d_sname[c_name] # 隨機分配的技能包qwq = random.random()for x in pt: # 隨機分配的技能包的輸出值c_suiji[x] = c_skill[x]a = list(c_suiji.values())c = 0key = 0c_kill_name = "" #定義隨機技能名的變量for i in c_suiji:i_1 = c_skill[i]b = 0for j in a:b += 1/jkey += 1/i_1 / b# print("c的值:{} key的值{}".format(c,key))if c < qwq <= key:c_kill_name = i # 根據輸出值成反比的概率 分配的技能名# print('隨機值:{},技能名:{},技能輸出值{}'.format(qwq,i,i_1))c = key# s_kill_name = random.sample(pt, 1)[0] # 隨機分配的技能c_kill_hp = int(c_skill[c_kill_name] ) # 隨機分配的技能輸出值random3 = np.random.randn() # 隨機生成1個服從正態分布的隨機數hurt = math.floor(c_kill_hp * (1 + 0.2*random3)) #向下取整的傷害值# print("傷害是{:0.1f}".format(hurt))print("逍遙派{}使出了一招傷害為{}的{}".format(c_name,c_kill_hp,c_kill_name))s_kill_hp = s_hp - hurtif s_kill_hp <= 0:del shaolin[s_name] # 刪除鍵 'shaolin'print("少林僧人{}受到{}點傷害,剩余HP{}".format(s_name, hurt, 0))print("少林僧人{}陣亡!!!!".format(s_name))else:shaolin[s_name] = s_kill_hpprint("少林僧人{}受到{}點傷害,剩余HP{}".format(s_name, hurt, s_kill_hp))passdef Battle():sign = Truewhile sign:# 少林寺Wulinpeople.Shaolin_Temple(Wulinpeople)if not shaolin or not carefree: #判斷雙方是否完全陣亡if shaolin:print("戰斗結束,少林寺獲勝!留在戰場的是:")for i in shaolin:print("少林僧人{}剩余血量{}".format(i,shaolin[i]))sign = Falseelse:print("戰斗結束,逍遙派獲勝!留在戰場的是:")for i in carefree:print("逍遙派人{}剩余血量{}".format(i,carefree[i]))sign = Falseif not sign: # 結束程序break# 逍遙派Wulinpeople.Carefree(Wulinpeople)def main():print("戰斗開始了!出場人物是:")for i in range(len(shaolin)+len(carefree)):a = Wulinpeople()if i<len(shaolin):kill = ",".join(a.s_name)d_sname[list(shaolin)[i]] = a.s_nameprint("少林寺的少林僧人{},HP{},招數為{}".format(list(shaolin)[i],shaolin[list(shaolin)[i]],kill))else:i = i-len(shaolin)kill = ",".join(a.c_name)d_sname[list(carefree)[i]] = a.c_nameprint("逍遙派的逍遙派{},HP{},招數為{}".format(list(carefree)[i],carefree[list(carefree)[i]],kill))Battle() main()# 1)生成隨機數 rdm = np.random.randn(10000) # 隨機生成10000個服從正態分布的隨機數 # 2)結果驗證 import seaborn as sns # 使用seaborn 庫畫直方圖驗證結果 sns.set_palette("hls") # 設置所有圖的顏色,使用hls色彩空間 sns.distplot(rdm,color="r",bins=1000,kde=True) # 繪制直方圖,color設置顏色,bins設置直方圖的劃分數 plt.show()?
總結
以上是生活随笔為你收集整理的使用Python模拟武侠小说中两派人的一场遭遇战。的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TypeScript免费视频图文教程(2
- 下一篇: 乔布斯前传:混沌岁月塑造独特性格