Python-七、小游戲-組隊(duì)PK

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é)果:

V1.0 輸出結(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é)果:

V2.0輸出結(jié)果

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

V1.0~V2.0總結(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()

運(yùn)行結(jié)果

回過頭看,我們已經(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()

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容