1、明确项目目标
PK规模:3V3
PK视觉:角色拥有姓名,且有变化(即随机生成)
PK策略:可排序,有一定策略性
2、分析过程,拆解项目
版本1.0:固定角色固定属性,自动计算扣血量,三局两胜,封装为函数并调用。
版本2.0:随机角色,随机属性。
版本3.0:让玩家选择出场顺序,并打印出来
版本4.0:根据出场顺序和对方进行三轮PK,并输出战果。
3、逐步执行,代码实现
版本1.0(封装函数,自定属性):
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('你发起了攻击,【敌人】剩余血量%s'%(enemy_life))
print('敌人向你发起了攻击,【玩家】的血量剩余%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('悲催,这局敌人把你干掉了!')
else:
print('哎呀,这局你和敌人同归于尽了!')
print('-----------------------')
def main(player_life,player_attack,enemy_life,enemy_attack):
#别看这么长,其实就是三个函数,函数1:
show_role(player_life,player_attack,enemy_life,enemy_attack)
#函数2:
pk_role(player_life,player_attack,enemy_life,enemy_attack)
main(100,35,105,33)
输出结果:
版本2.0(随机角色和属性):
虽然是随机,但是我们得先有一个池子存放底层数据,对吧?于是我们建立敌我双方共十二个角色,分别存储在player_list和enemy_list中。在程序中导入预制的随机函数random!
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,180)
attack = random.randint(30,50)
return life,attack
# 给角色赋予随机属性,并展示角色信息。
def show_role():
for i in range(3):
player_info[players[i]] = born_role()
enemy_info[enemies[i]] = born_role()
# 这里要给敌人角色信息的字典添加键值对
print('----------------- 角色信息 -----------------')
# 展示我方的3个角色
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个角色,也是一个循环
show_role()
输出结果:
在开始V3.0之前,我们做一个小小的总结。
版本3.0(询问玩家出场顺序):
3.0版本增加两个功能:询问玩家每个角色的出场顺序,根据排序战斗;战斗三轮,输出单轮和最终结果。
import time,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,180)
attack = random.randint(30,50)
return life,attack
# 给角色赋予随机属性,并展示角色信息。
def show_role():
for i in range(3):
player_info[players[i]] = born_role()
enemy_info[enemies[i]] = born_role()
print('----------------- 角色信息 -----------------')
# 展示我方的3个角色
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个角色
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('请按回车键继续。\n') # 为了让玩家更有控制感,可以插入类似的代码来切分游戏进程。
# 按照玩家的需求,指派人上阵
def order_role():
global players
order_dict = {}
for i in range(3):
order = int(input('你想将 %s 放在第几个上场?(请输入数字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()
这里的重点是,将players字段做成global的,这样在两个函数间就可以调用了。
版本4.0(添加PK,不服就干):
互相PK,三局两胜。我们可以将其拆解为3部分:角色PK、打印单局战果和打印最终结果。设置一个变量为score = 0,玩家赢了加一分,输了扣一分,平局加零分。最终只要判断score是大于、小于或等于0就可以了。
为了保持函数的功能单一性,即每个功能尽量都封装成单独的函数,而pk_role()函数包含了战斗过程和战果统计两个功能。所以,可以考虑让统计单局战果的代码独立成一个函数,在pk_role()函数内部调用即可。
需要注意的是:有一些函数不会包含到主函数里,而是作为“辅助型”函数被其他函数调用,如一些返回数值的函数。这其实和之前在show_role()函数内部调用born_role()函数有些类似。
先单独把PK做出来,属性用直接定义,调试好。
import time
players = ['【狂血战士】','【森林箭手】','【光明骑士】']
enemies = ['【暗黑战士】','【黑暗弩手】','【暗夜骑士】']
player_info = {'【狂血战士】':(105,35),'【森林箭手】':(105,35),'【光明骑士】':(105,35)}
enemy_info = {'【暗黑战士】':(105,35),'【黑暗弩手】':(105,35),'【暗夜骑士】':(105,35)}
input('按回车开始简化版游戏:')
# 角色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和局数的变化。
print(show_result(player_life,enemy_life)[1])
# 调用show_result()函数,打印返回元组中的第一个元素result。
score += int(show_result(player_life,enemy_life)[0])
# 调用show_result()函数,完成计分变动。
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
pk_role()
回过头看,我们已经一步步写出了游戏需要的所有代码,定义了5个函数:born_role()/show_role()/order_role()/pk_role()/show_result()。
现在,我们将从零开始,完成这个练习。
# 导入需要的自带函数
import random,time
# 敌我全员名单
player_list = ['【狂血战士】','【森林箭手】','【光明骑士】','【独行剑客】','【格斗大师】','【枪弹专家】']
enemy_list = ['【暗黑战士】','【黑暗弩手】','【暗夜骑士】','【嗜血刀客】','【首席刺客】','【陷阱之王】']
#敌我上阵三人
players = random.sample(player_list,3)
enemies = random.sample(enemy_list,3)
# 需要的字典,用于存储随机生成的玩家和敌人的属性
player_info = {}
enemy_info = {}
# 1、定义随机生成属性的函数
def born_role():
life = random.randint(100,180)
attack = random.randint(30,50)
return (life,attack)
# 2、定义随机生成角色和属性、并打印出来的函数
def show_role():
#随机生成属性
for iin range(3):
player_info[players[i]] = born_role()
enemy_info[enemies[i]] = born_role()
# 打印角色信息
print('欢迎来到战场')
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('-------------------------------------')
# 定义玩家自选上阵顺序的函数
def order_role():
# 将players定义为全局变量
global players
# 定义一个order_list用于保存players的数据
order_list = {}
# 将玩家希望的上阵清单保存到order_list中
for iin range(3):
x =int(input('你想派 %s 第几个上场?'%(players[i])))
order_list[x] = players[i]
# 清空players
players = []
# 将玩家希望的上阵清单填入players列表中
for iin range(1,4):
players.append(order_list[i])
# 打印玩家最终选择的上阵顺序
print('你选择的上阵顺序是 %s '%(players))
# 定义pk函数
def pk_role():
order_role()
input('按回车开始游戏:\n')
# 定义回合计数以及玩家得分,得分用于判断最终胜负
round =1
sorce =0
for iin range(3):
# 每一局开始打印战斗信息
print('现在是第 %s 局' % (round))
# 我发现直接用元组的数据太痛苦了,太长了,我还是“转译”一下吧
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]
# 角色登场!
print('玩家%s出场! 血量:%s 攻击:%s' % (player_name,player_life,player_attack))
print('敌人%s出场! 血量:%s 攻击:%s' % (enemy_name,enemy_life,enemy_attack))
# 开始PK循环,直到一方的生命值小于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循环,意味着PK结束了,我们需要判断当前的玩家和敌人的生命,输出PK结果
else:
sorce += show_result(player_name,enemy_name,player_life,enemy_life)
#每局结束,局数+1
round +=1
print('---------------PK结束-----------------')
#三局两胜,得分大于等于2就是两胜啦!
if sorce >=2:
print('大侠果然高招!快去领取你的奖品吧!')
else:
print('胜败乃兵家常事,别灰心,回去练个千儿八百年的再来挑战吧!')
# 定义打印结果的函数
def show_result(player_name,enemy_name,player_life,enemy_life):
# 玩家生命大于敌人生命,玩家胜利
if player_life >0 and enemy_life <=0:
print('%s:我内瓦,世界一!!'%(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
# 定义主函数main
def main():
show_role()
pk_role()
main()
习题集【石头剪刀布】:
电脑先出拳,我们再出拳,判断胜负,三局两胜。
import random,time
punches = ['石头','剪刀','布']
# 定义出拳的过程,游戏内容简单,戏要多
def slp():
time.sleep(1)
def piantou():
print('伞兵一号卢本伟准备就绪!!!!')
slp()
print('他捏紧了拳头!!!!')
slp()
print('你轻蔑的笑:“我的大斧已经饥渴难耐了……”')
slp()
def chuquan():
# 电脑随机出拳
global computer_choice
computer_choice = random.choice(punches)
# 让玩家知道怎么出拳
print('-----------出拳规则------------')
for iin range(len(punches)):
print('%s.%s'%(i+1,punches[i]))
# 玩家输入数字出拳
x =int(input('“来~吧~(请输入数字出拳)”\n'))
# 将出拳结果返还
return x-1,computer_choice;
# 定义PK的过程,游戏内容简单,戏要多
def pk():
#定义玩家分数
sorce =0
round =1
pk =0
while round <=3:
print('--------性感兔女郎登场----------')
slp()
print('-----------第%s局PK啦-----------'%(round))
slp()
(x,y) = chuquan()
print('----------大战一触即发----------')
slp()
print('----------双方同时出拳----------')
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('你真是好狗运,容许你再出拳一次。')
print('------------------------------')
else:
print('啊!尼玛!……我,我又一次失利了!')
round +=1
print('你的得分 %s', sorce)
if sorce >=2:
print('你赢了,你挥一挥衣袖,留他在原地哭泣。')
else:
print('他赢了,他轻蔑一笑,三脚猫回家吃奶去吧!')
def main():
piantou()
pk()
main()