1、明確項(xiàng)目目標(biāo)
PK規(guī)模:3V3
PK視覺:角色擁有姓名,且有變化(即隨機(jī)生成)
PK策略:可排序,有一定策略性
2、分析過程,拆解項(xiàng)目
版本1.0:固定角色固定屬性,自動(dòng)計(jì)算扣血量,三局兩勝,封裝為函數(shù)并調(diào)用。
版本2.0:隨機(jī)角色,隨機(jī)屬性。
版本3.0:讓玩家選擇出場(chǎng)順序,并打印出來
版本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
#把敵人的屬性也打印出來
player_list =? ['【狂血戰(zhàn)士】','【森林箭手】','【光明騎士】','【獨(dú)行劍客】','【格斗大師】','【槍彈專家】']
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é)果:

在開始V3.0之前,我們做一個(gè)小小的總結(jié)。

版本3.0(詢問玩家出場(chǎng)順序):
3.0版本增加兩個(gè)功能:詢問玩家每個(gè)角色的出場(chǎng)順序,根據(jù)排序戰(zhàn)斗;戰(zhàn)斗三輪,輸出單輪和最終結(jié)果。
import time,random
#定義敵我屬性
player_list =? ['【狂血戰(zhàn)士】','【森林箭手】','【光明騎士】','【獨(dú)行劍客】','【格斗大師】','【槍彈專家】']
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)按回車鍵繼續(xù)。\n')? # 為了讓玩家更有控制感,可以插入類似的代碼來切分游戲進(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)斗過程和戰(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ù)有些類似。
先單獨(dú)把PK做出來,屬性用直接定義,調(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('按回車開始簡(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]
? ? ? ? # 每一局開戰(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)按回車鍵繼續(xù)。\n')
? ? ? ? # 開始判斷血量是否都大于零,然后互扣血量。
? ? ? ? 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)擊回車,查看比賽的最終結(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()

回過頭看,我們已經(jīng)一步步寫出了游戲需要的所有代碼,定義了5個(gè)函數(shù):born_role()/show_role()/order_role()/pk_role()/show_result()。
現(xiàn)在,我們將從零開始,完成這個(gè)練習(xí)。
# 導(dǎo)入需要的自帶函數(shù)
import random,time
# 敵我全員名單
player_list = ['【狂血戰(zhàn)士】','【森林箭手】','【光明騎士】','【獨(dú)行劍客】','【格斗大師】','【槍彈專家】']
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ī)生成角色和屬性、并打印出來的函數(shù)
def show_role():
#隨機(jī)生成屬性
? ? for iin range(3):
player_info[players[i]] = born_role()
enemy_info[enemies[i]] = born_role()
# 打印角色信息
? ? print('歡迎來到戰(zhàn)場(chǎng)')
input('按下回車抽取角色。\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('按回車開始游戲:\n')
# 定義回合計(jì)數(shù)以及玩家得分,得分用于判斷最終勝負(fù)
? ? round =1
? ? sorce =0
? ? for iin range(3):
# 每一局開始打印戰(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))
# 開始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è)千兒八百年的再來挑戰(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)瓦,世界一!!'%(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 = ['石頭','剪刀','布']
# 定義出拳的過程,游戲內(nèi)容簡(jiǎn)單,戲要多
def slp():
time.sleep(1)
def piantou():
print('傘兵一號(hào)盧本偉準(zhǔn)備就緒?。。?!')
slp()
print('他捏緊了拳頭?。。?!')
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('“來~吧~(請(qǐng)輸入數(shù)字出拳)”\n'))
# 將出拳結(jié)果返還
? ? return x-1,computer_choice;
# 定義PK的過程,游戲內(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('---------他慢慢張開手掌---------')
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('神來一剪……將你切片。')
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()