1舌厨、明確項(xiàng)目目標(biāo)
PK規(guī)模:3V3
PK視覺(jué):角色擁有姓名岂却,且有變化(即隨機(jī)生成)
PK策略:可排序,有一定策略性
2裙椭、分析過(guò)程躏哩,拆解項(xiàng)目
版本1.0:固定角色固定屬性,自動(dòng)計(jì)算扣血量揉燃,三局兩勝扫尺,封裝為函數(shù)并調(diào)用。
版本2.0:隨機(jī)角色炊汤,隨機(jī)屬性正驻。
版本3.0:讓玩家選擇出場(chǎng)順序,并打印出來(lái)
版本4.0:根據(jù)出場(chǎng)順序和對(duì)方進(jìn)行三輪PK抢腐,并輸出戰(zhàn)果姑曙。
3、逐步執(zhí)行迈倍,代碼實(shí)現(xiàn)
版本1.0(封裝函數(shù)渣磷,自定屬性):
import time
def show_role(player_life,player_attack,enemy_life,enemy_attack):
? ? print('【玩家】\n血量:%s\n攻擊:%s'%(player_life,player_attack))
? ? print('------------------------')
? ? print('【敵人】\n血量:%s\n攻擊:%s'%(enemy_life,enemy_attack))
? ? print('-----------------------')
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
? ? ? ? print('你發(fā)起了攻擊,【敵人】剩余血量%s'%(enemy_life))
? ? ? ? print('敵人向你發(fā)起了攻擊授瘦,【玩家】的血量剩余%s'%(player_life))
? ? ? ? print('-----------------------')
? ? ? ? time.sleep(1.2)
? ? 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('悲催竟宋,這局?jǐn)橙税涯愀傻袅耍?)
? ? else:
? ? ? ? print('哎呀,這局你和敵人同歸于盡了形纺!')
? ? print('-----------------------')
def main(player_life,player_attack,enemy_life,enemy_attack):
? ? #別看這么長(zhǎng)丘侠,其實(shí)就是三個(gè)函數(shù),函數(shù)1:
? ? show_role(player_life,player_attack,enemy_life,enemy_attack)
? ? #函數(shù)2:
? ? pk_role(player_life,player_attack,enemy_life,enemy_attack)
main(100,35,105,33)
輸出結(jié)果:
版本2.0(隨機(jī)角色和屬性):
雖然是隨機(jī)逐样,但是我們得先有一個(gè)池子存放底層數(shù)據(jù)蜗字,對(duì)吧?于是我們建立敵我雙方共十二個(gè)角色脂新,分別存儲(chǔ)在player_list和enemy_list中挪捕。在程序中導(dǎo)入預(yù)制的隨機(jī)函數(shù)random!
import random
#把敵人的屬性也打印出來(lái)
player_list =? ['【狂血戰(zhàn)士】','【森林箭手】','【光明騎士】','【獨(dú)行劍客】','【格斗大師】','【槍彈專(zhuān)家】']
enemy_list = ['【暗黑戰(zhàn)士】','【黑暗弩手】','【骷髏騎士】','【嗜血刀客】','【首席刺客】','【陷阱之王】']
#敵我各隨機(jī)抽三人上陣
players = random.sample(player_list,3)?
enemies = random.sample(enemy_list,3)
#敵我各建立兩個(gè)空的存儲(chǔ)字典
player_info = {}
enemy_info = {}
# 隨機(jī)生成兩種屬性
def born_role():
? ? life = random.randint(100,180)
? ? attack = random.randint(30,50)
? ? return life,attack
# 給角色賦予隨機(jī)屬性争便,并展示角色信息级零。
def show_role():
? ? for i in range(3):
? ? ? ? player_info[players[i]] = born_role()
? ? ? ? enemy_info[enemies[i]] = born_role()
? ? # 這里要給敵人角色信息的字典添加鍵值對(duì)? ?
? ? print('----------------- 角色信息 -----------------')
? ? # 展示我方的3個(gè)角色
? ? print('你的人物:')
? ? for i in range(3):
? ? ? ? print('%s? 血量:%d? 攻擊:%d'
? ? ? ? %(players[i],player_info[players[i]][0],player_info[players[i]][1]))
? ? print('--------------------------------------------')
? ? print('電腦敵人:')
? ? for i in range(3):
? ? ? ? print('%s? 血量:%d? 攻擊:%d'
? ? ? ? %(enemies[i],enemy_info[enemies[i]][0],enemy_info[enemies[i]][1]))
? ? # 展示敵方3個(gè)角色,也是一個(gè)循環(huán)
show_role()
輸出結(jié)果:
在開(kāi)始V3.0之前滞乙,我們做一個(gè)小小的總結(jié)奏纪。
版本3.0(詢(xún)問(wèn)玩家出場(chǎng)順序):
3.0版本增加兩個(gè)功能:詢(xún)問(wèn)玩家每個(gè)角色的出場(chǎng)順序,根據(jù)排序戰(zhàn)斗斩启;戰(zhàn)斗三輪序调,輸出單輪和最終結(jié)果。
import time,random
#定義敵我屬性
player_list =? ['【狂血戰(zhàn)士】','【森林箭手】','【光明騎士】','【獨(dú)行劍客】','【格斗大師】','【槍彈專(zhuān)家】']
enemy_list = ['【暗黑戰(zhàn)士】','【黑暗弩手】','【骷髏騎士】','【嗜血刀客】','【首席刺客】','【陷阱之王】']
#敵我各隨機(jī)抽三人上陣
players = random.sample(player_list,3)
enemies = random.sample(enemy_list,3)
#敵我各建立兩個(gè)空的存儲(chǔ)字典
player_info = {}
enemy_info = {}
# 隨機(jī)生成兩種屬性
def born_role():
? ? life = random.randint(100,180)
? ? attack = random.randint(30,50)
? ? return life,attack
# 給角色賦予隨機(jī)屬性兔簇,并展示角色信息发绢。
def show_role():
? ? for i in range(3):
? ? ? ? player_info[players[i]] = born_role()
? ? ? ? enemy_info[enemies[i]] = born_role()?
? ? print('----------------- 角色信息 -----------------')
? ? # 展示我方的3個(gè)角色
? ? print('你的人物:')
? ? for i in range(3):
? ? ? ? print('%s %s? 血量:%d? 攻擊:%d'
? ? ? ? %(i+1,players[i],player_info[players[i]][0],player_info[players[i]][1]))
? ? print('--------------------------------------------')
? ? # 展示敵方3個(gè)角色
? ? print('電腦敵人:')
? ? for i in range(3):
? ? ? ? print('%s %s? 血量:%d? 攻擊:%d'
? ? ? ? %(i+1,enemies[i],enemy_info[enemies[i]][0],enemy_info[enemies[i]][1]))
? ? input('請(qǐng)按回車(chē)鍵繼續(xù)。\n')? # 為了讓玩家更有控制感垄琐,可以插入類(lèi)似的代碼來(lái)切分游戲進(jìn)程边酒。
# 按照玩家的需求,指派人上陣
def order_role():
? ? global players
? ? order_dict = {}
? ? for i in range(3):
? ? ? ? order = int(input('你想將 %s 放在第幾個(gè)上場(chǎng)此虑?(請(qǐng)輸入數(shù)字3,2,1):'
? ? ? ? ? ? ? ? ? ? ? ? ? %(players[i])))
? ? ? ? order_dict[order]=players[i]
? ? players = []
? ? for i in range(1,4):
? ? ? ? players.append(order_dict[i])
? ? print(players)
def main():
? ? show_role()
? ? order_role()
main()
這里的重點(diǎn)是,將players字段做成global的口锭,這樣在兩個(gè)函數(shù)間就可以調(diào)用了朦前。
版本4.0(添加PK,不服就干):
互相PK鹃操,三局兩勝韭寸。我們可以將其拆解為3部分:角色PK、打印單局戰(zhàn)果和打印最終結(jié)果荆隘。設(shè)置一個(gè)變量為score = 0恩伺,玩家贏了加一分,輸了扣一分椰拒,平局加零分晶渠。最終只要判斷score是大于凰荚、小于或等于0就可以了。
為了保持函數(shù)的功能單一性褒脯,即每個(gè)功能盡量都封裝成單獨(dú)的函數(shù)便瑟,而pk_role()函數(shù)包含了戰(zhàn)斗過(guò)程和戰(zhàn)果統(tǒng)計(jì)兩個(gè)功能。所以番川,可以考慮讓統(tǒng)計(jì)單局戰(zhàn)果的代碼獨(dú)立成一個(gè)函數(shù)到涂,在pk_role()函數(shù)內(nèi)部調(diào)用即可。
需要注意的是:有一些函數(shù)不會(huì)包含到主函數(shù)里颁督,而是作為“輔助型”函數(shù)被其他函數(shù)調(diào)用践啄,如一些返回?cái)?shù)值的函數(shù)。這其實(shí)和之前在show_role()函數(shù)內(nèi)部調(diào)用born_role()函數(shù)有些類(lèi)似沉御。
先單獨(dú)把PK做出來(lái)屿讽,屬性用直接定義,調(diào)試好嚷节。
import time
players = ['【狂血戰(zhàn)士】','【森林箭手】','【光明騎士】']
enemies = ['【暗黑戰(zhàn)士】','【黑暗弩手】','【暗夜騎士】']
player_info = {'【狂血戰(zhàn)士】':(105,35),'【森林箭手】':(105,35),'【光明騎士】':(105,35)}
enemy_info = {'【暗黑戰(zhàn)士】':(105,35),'【黑暗弩手】':(105,35),'【暗夜騎士】':(105,35)}
input('按回車(chē)開(kāi)始簡(jiǎn)化版游戲:')
# 角色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]
? ? ? ? # 每一局開(kāi)戰(zhàn)前展示戰(zhàn)斗信息
? ? ? ? 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('請(qǐng)按回車(chē)鍵繼續(xù)聂儒。\n')
? ? ? ? # 開(kāi)始判斷血量是否都大于零,然后互扣血量硫痰。
? ? ? ? while player_life > 0 and enemy_life > 0:
? ? ? ? ? ? enemy_life = enemy_life - player_attack
? ? ? ? ? ? player_life = player_life - enemy_attack
? ? ? ? ? ? print('%s發(fā)起了攻擊衩婚,%s剩余血量%d'%(player_name,enemy_name,enemy_life))
? ? ? ? ? ? print('%s發(fā)起了攻擊,%s剩余血量%d'%(enemy_name,player_name,player_life))
? ? ? ? ? ? print('--------------------------------------------')
? ? ? ? ? ? time.sleep(1)
? ? ? ? else:? # 每局的戰(zhàn)果展示效斑,以及分?jǐn)?shù)score和局?jǐn)?shù)的變化非春。
? ? ? ? ? ? print(show_result(player_life,enemy_life)[1])
? ? ? ? ? ? # 調(diào)用show_result()函數(shù),打印返回元組中的第一個(gè)元素result缓屠。
? ? ? ? ? ? score += int(show_result(player_life,enemy_life)[0])
? ? ? ? ? ? # 調(diào)用show_result()函數(shù)奇昙,完成計(jì)分變動(dòng)。
? ? ? ? ? ? round += 1
? ? input('\n點(diǎn)擊回車(chē)敌完,查看比賽的最終結(jié)果\n')
? ? if score > 0:
? ? ? ? print('【最終結(jié)果:你贏了储耐!】\n')
? ? elif score < 0:
? ? ? ? print('【最終結(jié)果:你輸了!】\n')
? ? else:
? ? ? ? print('【最終結(jié)果:平局滨溉!】\n')
# 返回單局戰(zhàn)果和計(jì)分法所加分?jǐn)?shù)什湘。
def show_result(player_life,enemy_life):? # 注意:該函數(shù)要設(shè)定參數(shù),才能判斷單局戰(zhàn)果晦攒。
? ? 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
pk_role()
回過(guò)頭看,我們已經(jīng)一步步寫(xiě)出了游戲需要的所有代碼绎巨,定義了5個(gè)函數(shù):born_role()/show_role()/order_role()/pk_role()/show_result()近尚。
現(xiàn)在,我們將從零開(kāi)始场勤,完成這個(gè)練習(xí)戈锻。
# 導(dǎo)入需要的自帶函數(shù)
import random,time
# 敵我全員名單
player_list = ['【狂血戰(zhàn)士】','【森林箭手】','【光明騎士】','【獨(dú)行劍客】','【格斗大師】','【槍彈專(zhuān)家】']
enemy_list = ['【暗黑戰(zhàn)士】','【黑暗弩手】','【暗夜騎士】','【嗜血刀客】','【首席刺客】','【陷阱之王】']
#敵我上陣三人
players = random.sample(player_list,3)
enemies = random.sample(enemy_list,3)
# 需要的字典,用于存儲(chǔ)隨機(jī)生成的玩家和敵人的屬性
player_info = {}
enemy_info = {}
# 1和媳、定義隨機(jī)生成屬性的函數(shù)
def born_role():
life = random.randint(100,180)
attack = random.randint(30,50)
return (life,attack)
# 2格遭、定義隨機(jī)生成角色和屬性、并打印出來(lái)的函數(shù)
def show_role():
#隨機(jī)生成屬性
? ? for iin range(3):
player_info[players[i]] = born_role()
enemy_info[enemies[i]] = born_role()
# 打印角色信息
? ? print('歡迎來(lái)到戰(zhàn)場(chǎng)')
input('按下回車(chē)抽取角色留瞳。\n')
print('--------------你的角色----------------')
for iin range(3):
print('|%s 角色:%s 血量:%s 攻擊:%s|'
? ? ? ? ? ? ? %(i+1,players[i],player_info[players[i]][0],player_info[players[i]][1]))
print('-------------------------------------')
print('-------------電腦的角色---------------')
for iin range(3):
print('|%s 角色:%s 血量:%s 攻擊:%s|'
? ? ? ? ? ? ? %(i+1,enemies[i],enemy_info[enemies[i]][0],enemy_info[enemies[i]][1]))
print('-------------------------------------')
# 定義玩家自選上陣順序的函數(shù)
def order_role():
# 將players定義為全局變量
? ? global players
# 定義一個(gè)order_list用于保存players的數(shù)據(jù)
? ? order_list = {}
# 將玩家希望的上陣清單保存到order_list中
? ? for iin range(3):
x =int(input('你想派 %s 第幾個(gè)上場(chǎng)拒迅?'%(players[i])))
order_list[x] = players[i]
# 清空players
? ? players = []
# 將玩家希望的上陣清單填入players列表中
? ? for iin range(1,4):
players.append(order_list[i])
# 打印玩家最終選擇的上陣順序
? ? print('你選擇的上陣順序是 %s '%(players))
# 定義pk函數(shù)
def pk_role():
order_role()
input('按回車(chē)開(kāi)始游戲:\n')
# 定義回合計(jì)數(shù)以及玩家得分,得分用于判斷最終勝負(fù)
? ? round =1
? ? sorce =0
? ? for iin range(3):
# 每一局開(kāi)始打印戰(zhàn)斗信息
? ? ? ? print('現(xiàn)在是第 %s 局' % (round))
# 我發(fā)現(xiàn)直接用元組的數(shù)據(jù)太痛苦了她倘,太長(zhǎng)了璧微,我還是“轉(zhuǎn)譯”一下吧
? ? ? ? player_name = players[i]
player_life = player_info[players[i]][0]
player_attack = player_info[players[i]][1]
enemy_name = enemies[i]
enemy_life = enemy_info[enemies[i]][0]
enemy_attack = enemy_info[enemies[i]][1]
# 角色登場(chǎng)!
? ? ? ? print('玩家%s出場(chǎng)硬梁! 血量:%s 攻擊:%s' % (player_name,player_life,player_attack))
print('敵人%s出場(chǎng)前硫! 血量:%s 攻擊:%s' % (enemy_name,enemy_life,enemy_attack))
# 開(kāi)始PK循環(huán),直到一方的生命值小于1
? ? ? ? while player_life >0 and enemy_life >0:
enemy_life -= player_attack
player_life -= enemy_attack
print('%s攻擊荧止,敵%s血量降為%s' % (player_name, enemy_name, enemy_life))
print('敵%s攻擊屹电,%s血量降為%s' % (enemy_name, player_name, player_life))
print('-------------------------------------')
time.sleep(1)
# 出PK循環(huán),意味著PK結(jié)束了跃巡,我們需要判斷當(dāng)前的玩家和敵人的生命危号,輸出PK結(jié)果
? ? ? ? else:
sorce += show_result(player_name,enemy_name,player_life,enemy_life)
#每局結(jié)束,局?jǐn)?shù)+1
? ? ? ? round +=1
? ? print('---------------PK結(jié)束-----------------')
#三局兩勝素邪,得分大于等于2就是兩勝啦外莲!
? ? if sorce >=2:
print('大俠果然高招!快去領(lǐng)取你的獎(jiǎng)品吧兔朦!')
else:
print('勝敗乃兵家常事偷线,別灰心,回去練個(gè)千兒八百年的再來(lái)挑戰(zhàn)吧烘绽!')
# 定義打印結(jié)果的函數(shù)
def show_result(player_name,enemy_name,player_life,enemy_life):
# 玩家生命大于敵人生命淋昭,玩家勝利
? ? if player_life >0 and enemy_life <=0:
print('%s:我內(nèi)瓦俐填,世界一0步印!'%(player_name))
print('-------------------------------------')
return 1
? ? # 敵人生命大于玩家生命,敵人勝利
? ? elif player_life <=0 and enemy_life >0:
print('%s:豈可休盏檐,輸了歇式!'%(player_name))
print('-------------------------------------')
return -1
? ? # 其它情況,平局
? ? else:
print('納尼胡野,竟然打平了材失?')
print('-------------------------------------')
return 0
# 定義主函數(shù)main
def main():
show_role()
pk_role()
main()
習(xí)題集【石頭剪刀布】:
電腦先出拳,我們?cè)俪鋈蚨梗袛鄤儇?fù)龙巨,三局兩勝。
import random,time
punches = ['石頭','剪刀','布']
# 定義出拳的過(guò)程熊响,游戲內(nèi)容簡(jiǎn)單旨别,戲要多
def slp():
time.sleep(1)
def piantou():
print('傘兵一號(hào)盧本偉準(zhǔn)備就緒!:骨选=粘凇!')
slp()
print('他捏緊了拳頭:樘肌5堇馈!瞳腌!')
slp()
print('你輕蔑的笑:“我的大斧已經(jīng)饑渴難耐了……”')
slp()
def chuquan():
# 電腦隨機(jī)出拳
? ? global computer_choice
computer_choice = random.choice(punches)
# 讓玩家知道怎么出拳
? ? print('-----------出拳規(guī)則------------')
for iin range(len(punches)):
print('%s.%s'%(i+1,punches[i]))
# 玩家輸入數(shù)字出拳
? ? x =int(input('“來(lái)~吧~(請(qǐng)輸入數(shù)字出拳)”\n'))
# 將出拳結(jié)果返還
? ? return x-1,computer_choice;
# 定義PK的過(guò)程绞铃,游戲內(nèi)容簡(jiǎn)單,戲要多
def pk():
#定義玩家分?jǐn)?shù)
? ? sorce =0
? ? round =1
? ? pk =0
? ? while round <=3:
print('--------性感兔女郎登場(chǎng)----------')
slp()
print('-----------第%s局PK啦-----------'%(round))
slp()
(x,y) = chuquan()
print('----------大戰(zhàn)一觸即發(fā)----------')
slp()
print('----------雙方同時(shí)出拳----------')
slp()
print('----------你出了~%s-----------' % (punches[x]))
slp()
print('---------他慢慢張開(kāi)手掌---------')
slp()
print('-------------%s纯趋!-------------' % (computer_choice))
slp()
if punches[x] =="石頭" and computer_choice =="剪刀":
print('我用石頭……錘爆你憎兽。')
print('------------------------------')
sorce +=1
? ? ? ? ? ? round +=1
? ? ? ? elif punches[x] =="布" and computer_choice =="石頭":
print('我的布,容納天地吵冒!')
print('------------------------------')
sorce +=1
? ? ? ? ? ? round +=1
? ? ? ? elif punches[x] =="剪刀" and computer_choice =="布":
print('神來(lái)一剪……將你切片纯命。')
print('------------------------------')
sorce +=1
? ? ? ? ? ? round +=1
? ? ? ? elif punches[x] == computer_choice:
print('你真是好狗運(yùn),容許你再出拳一次痹栖。')
print('------------------------------')
else:
print('耙诠!尼瑪揪阿!……我疗我,我又一次失利了!')
round +=1
? ? ? ? print('你的得分 %s', sorce)
if sorce >=2:
print('你贏了南捂,你揮一揮衣袖吴裤,留他在原地哭泣。')
else:
print('他贏了溺健,他輕蔑一笑麦牺,三腳貓回家吃奶去吧!')
def main():
piantou()
pk()
main()