这里要改成fav_num(5,8)

这里要自己加
import time


这里需要自己加
import time


而当程序需要同时调用多个函数的话,一个习惯的用法是定义一个主函数main(),将其他函数放在主函数main()内部,起到一种封装的效果。

#第一个函数:打印我喜欢的两个数字
def fav_num(num1,num2): print('我喜欢的数字是%d,还有%d。' % (num1,num2))#第二个函数:打印两个这两个数字之和
def add_num(num1,num2):print('这两个数字相加的和为%d。'% (num1 + num2))#定义主函数,让我们可以一次性调用两个函数
def main(num1,num2):fav_num(num1,num2)add_num(num1,num2)main(7,9)
main(4,7)


似乎在这里,他先运行main()然后再运行其他def

这样,我们就通过一个主函数将具有不同功能的函数拼在一起。只需一行代码,就可调用不同的函数。

那么,接下来我们就看看怎么将项目1的部分代码封装成不同的函数,再用主函数打包,最后调用主函数。一段项目1的长代码来啦,看仔细~

#项目1的部分代码
import time#展示角色
player_life = 100
player_attack = 35
enemy_life = 105
enemy_attack = 33print('【玩家】\n血量:%s\n攻击:%s'%(player_life,player_attack))
print('------------------------')
time.sleep(1)
print('【敌人】\n血量:%s\n攻击:%s'%(enemy_life,enemy_attack))
print('-----------------------')#双方PK
while player_life > 0 and enemy_life > 0:player_life = player_life - enemy_attack enemy_life = enemy_life - player_attackprint('你发起了攻击,【敌人】剩余血量%s'%(enemy_life))print('敌人向你发起了攻击,【玩家】的血量剩余%s'%(player_life))print('-----------------------')time.sleep(1.2)#打印战果
if player_life > 0 and enemy_life <= 0:print('敌人死翘翘了,这局你赢了')
elif player_life <= 0 and enemy_life > 0:print('悲催,这局敌人把你干掉了!')
else:print('哎呀,这局你和敌人同归于尽了!')
print('-----------------------')

可以看到上面代码,能分成显示【展示角色】、【双方PK】和【打印战果】三部分,根据单个函数实现单个功能的原则,所以我们也可以封装成三个函数,放在主函数里。

第一个【展示角色】的函数show_role刚刚我们已经写好了。现在请你写一写第二个【双方PK】的函数式代码,函数名定为pk_role。

#双方PK,函数式代码
def pk_role(player_life,player_attack,enemy_life,enemy_attack):while player_life > 0 and enemy_life > 0:player_life = player_life - enemy_attackenemy_life = enemy_life - player_attacktime.sleep(1)print('你发起了攻击,【敌人】剩余血量%s'%(enemy_life))print('敌人向你发起了攻击,【玩家】剩余血量%s'%(player_life))print('-----------------------')

看上去很简单,加了一句def语句就搞定,而且乍一看好像没什么毛病。但其实中间是出了一些差错的。我们暂时把这三个函数合并,并定义了主函数,来找找bug出在哪,你可以运行看看:

当你运行代码的时候,你会发现:明明是玩家赢了或电脑赢了,最后的输出结果都是平局。不信,你可以传入不同的参数,多调用几次看看。

怎么样,你知道谜底了吗?老师也不卖关子了,问题出在打印战果的函数show_result()的参数里。


import time# 展示角色
def show_role(player_life,player_attack,enemy_life,enemy_attack):print('【玩家】\n血量:%s\n攻击:%s'%(player_life,player_attack))print('------------------------')time.sleep(1)print('【敌人】\n血量:%s\n攻击:%s'%(enemy_life,enemy_attack))print('-----------------------')# 双方PK
def pk_role(player_life,player_attack,enemy_life,enemy_attack):while player_life > 0 and enemy_life > 0:player_life = player_life - enemy_attackenemy_life = enemy_life - player_attacktime.sleep(1)print('你发起了攻击,【敌人】剩余血量'+str(enemy_life))print('敌人向你发起了攻击,【玩家】剩余血量'+str(player_life))print('-----------------------')#把打印战果函数放在PK函数内部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):show_role(player_life,player_attack,enemy_life,enemy_attack)pk_role(player_life,player_attack,enemy_life,enemy_attack)#删除了调用show_role函数的1行代码main(100,35,105,33)


import time# 第一次 PK,给属性变量赋值
player_life = 100
player_attack = 35
enemy_life = 105
enemy_attack = 33print('【玩家】\n血量:%s\n攻击:%s'%(player_life,player_attack))
print('------------------------')
time.sleep(1)
print('【敌人】\n血量:%s\n攻击:%s'%(enemy_life,enemy_attack))
print('-----------------------')while player_life > 0 and enemy_life > 0:player_life = player_life - enemy_attack enemy_life = enemy_life - player_attackprint('你发起了攻击,【敌人】剩余血量%s'%(enemy_life))print('敌人向你发起了攻击,【玩家】的血量剩余%s'%(player_life))print('-----------------------')time.sleep(1.2)if player_life > 0 and enemy_life <= 0:print('敌人死翘翘了,这局你赢了')
elif player_life <= 0 and enemy_life > 0:print('悲催,这局敌人把你干掉了!')
else:print('哎呀,这局你和敌人同归于尽了!')
print('-----------------------')# 第二次 PK,又给属性变量赋值
player_life = 120
player_attack = 36
enemy_life = 100
enemy_attack = 45
print('【玩家】\n血量:%s\n攻击:%s'%(player_life,player_attack))
print('------------------------')
time.sleep(1)
print('【敌人】\n血量:%s\n攻击:%s'%(enemy_life,enemy_attack))
print('-----------------------')while player_life > 0 and enemy_life > 0:player_life = player_life - enemy_attack enemy_life = enemy_life - player_attackprint('你发起了攻击,【敌人】剩余血量%s'%(enemy_life))print('敌人向你发起了攻击,【玩家】的血量剩余%s'%(player_life))print('-----------------------')time.sleep(1.2)if player_life > 0 and enemy_life <= 0:print('敌人死翘翘了,这局你赢了')
elif player_life <= 0 and enemy_life > 0:print('悲催,这局敌人把你干掉了!')
else:print('哎呀,这局你和敌人同归于尽了!')
print('-----------------------')# 第三次PK ,又又又给属性变量赋值
player_life = 100
player_attack = 35
enemy_life = 100
enemy_attack = 35
print('【玩家】\n血量:%s\n攻击:%s'%(player_life,player_attack))
print('------------------------')
time.sleep(1)
print('【敌人】\n血量:%s\n攻击:%s'%(enemy_life,enemy_attack))
print('-----------------------')while player_life > 0 and enemy_life > 0:player_life = player_life - enemy_attack enemy_life = enemy_life - player_attackprint('你发起了攻击,【敌人】剩余血量%s'%(enemy_life))print('敌人向你发起了攻击,【玩家】的血量剩余%s'%(player_life))print('-----------------------')time.sleep(1.2)if player_life > 0 and enemy_life <= 0:print('敌人死翘翘了,这局你赢了')
elif player_life <= 0 and enemy_life > 0:print('悲催,这局敌人把你干掉了!')
else:print('哎呀,这局你和敌人同归于尽了!')
print('-----------------------')

import time# 展示角色
def show_role(player_life,player_attack,enemy_life,enemy_attack):print('【玩家】\n血量:%s\n攻击:%s'%(player_life,player_attack))print('------------------------')time.sleep(1)print('【敌人】\n血量:%s\n攻击:%s'%(enemy_life,enemy_attack))print('-----------------------')# 双方PK
def pk_role(player_life,player_attack,enemy_life,enemy_attack):while player_life > 0 and enemy_life > 0:player_life = player_life - enemy_attackenemy_life = enemy_life - player_attacktime.sleep(1)print('你发起了攻击,【敌人】剩余血量'+str(enemy_life))print('敌人向你发起了攻击,【玩家】剩余血量'+str(player_life))print('-----------------------')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):show_role(player_life,player_attack,enemy_life,enemy_attack)pk_role(player_life,player_attack,enemy_life,enemy_attack)main(100,35,105,33)
main(120,36,100,45)
main(100,35,100,35)








random.sample()可以从指定的序列中,随机的截取片断
这里是随机截取5个元素,作为一个片段返回

至今为止,应该遇到下面几个:
random.randint()随机生成一个整数int类型(随机整数)
random.choice()可以从序列,选取一个随机的元素返回(随机元素)
random.sample()可以从序列中,随机截取片段(随机片段)

# 由于生成双方角色属性的代码类似,所以在试验期,只考虑我方角色。import random# 将需要用到的固定变量一起放到代码开头,便于使用和管理。
player_list =  ['【狂血战士】','【森林箭手】','【光明骑士】','【独行剑客】','【格斗大师】','【枪弹专家】']
players = random.sample(player_list,3)  # 从列表里随机选取三个元素
player_life = {}  # 建立空字典,存放我方角色的血量。
player_attack = {}  # 建立空字典,存放我方角色的攻击。# 生成角色的属性
life = random.randint(100,180) # 从100-180随机生成整数,赋值给变量life
attack = random.randint(30,50) # 从30-50随机生成整数,赋值给变量attack
player_life[players[0]] = life # 给空字典player_life添加键值对,角色列表players的第0个元素为键,变量life为值
player_attack[players[0]] = attack # 给空字典player_attack添加键值对,角色列表players的第0个元素为键,变量attack为值
import random# ①将需要用到的固定变量一起放到代码开头,便于使用和管理。
player_list =  ['【狂血战士】','【森林箭手】','【光明骑士】','【独行剑客】','【格斗大师】','【枪弹专家】']
players = random.sample(player_list,3)  # 从列表里随机选取三个元素
player_life = {}  # 建立空字典,存放我方角色的血量。
player_attack = {}  # 建立空字典,存放我方角色的攻击。# ②生成角色的属性
life = random.randint(100,180) # 从100-180随机生成整数,赋值给变量life
attack = random.randint(30,50) # 从30-50随机生成整数,赋值给变量attack
player_life[players[0]] = life # 给空字典添加键值对,角色列表players的第0个元素为键,变量life为值
player_attack[players[0]] = attack # 给空字典添加键值对,角色列表players的第0个元素为键,变量attack为值# ③展示我方的角色信息
print('----------------- 角色信息 -----------------')
print('你的人物:')
print('%s  血量:%d  攻击:%d'
%(players[0],player_life[players[0]],player_attack[players[0]]))
print('--------------------------------------------')
import randomplayer_list =  ['【狂血战士】','【森林箭手】','【光明骑士】','【独行剑客】','【格斗大师】','【枪弹专家】']
players = random.sample(player_list,3)  # 从列表里随机选取三个元素
player_life = {}  # 建立空字典,存放我方角色的血量。
player_attack = {}  # 建立空字典,存放我方角色的攻击。#循环三次
for i in range(3):# 生成角色的属性life = random.randint(100,180) attack = random.randint(30,50) player_life[players[i]] = life # 给空字典添加键值对,角色列表players的第0个元素为键,变量life为值player_attack[players[i]] = attack # 给空字典添加键值对,角色列表players的第0个元素为键,变量attack为值# 展示我方的角色信息
print('----------------- 角色信息 -----------------')
print('你的人物:')for i in range(3):print('%s  血量:%d  攻击:%d' %(players[i],player_life[players[i]],player_attack[players[i]]))print('--------------------------------------------')

别忘了今天的主角是函数,所以我们将生成和展示人物属性信息的功能封装成函数就是:

import randomplayer_list =  ['【狂血战士】','【森林箭手】','【光明骑士】','【独行剑客】','【格斗大师】','【枪弹专家】']
players = random.sample(player_list,3)
player_life = {}
player_attack = {}# 将这个过程封装成函数
def show_role(): for i in range(3):life = random.randint(100,180)attack = random.randint(30,50)player_life[players[i]] = lifeplayer_attack[players[i]] = attack# 展示我方的3个角色print('----------------- 角色信息 -----------------')print('你的人物:')for i in range(3):print('%s  血量:%d  攻击:%d' %(players[i],player_life[players[i]],player_attack[players[i]]))print('--------------------------------------------')show_role()

import randomplayer = ['狂血战士']
#角色列表,有一个元素dict1 = {}
#创建一个字典,存放角色属性信息def info():a = random.randint(1,3)b = random.randint(4,6)return a,b  # return 多个值时,返回一个元组(a,b)data = info()
#调用info()函数,将返回的元组(a,b)赋值给变量data
print(data)dict1[player[0]] = data
#往空字典添加键值对,player[0]即'狂血战士'为键,data(元组)为值。
print(dict1)
print(dict1[player[0]]) # 打印出字典的值
print(dict1[player[0]][0]) # 打印出字典的值data的第0个元素
print(dict1[player[0]][1]) # 打印出字典的值data的第1个元素

import randomplayer_list =  ['【狂血战士】','【森林箭手】','【光明骑士】','【独行剑客】','【格斗大师】','【枪弹专家】']
players = random.sample(player_list,3)
player_info = {}# 随机生成属性,并用return语句保存属性信息
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()# 展示我方的3个角色print('----------------- 角色信息 -----------------')print('你的人物:')for i in range(3):print('%s  血量:%d  攻击:%d' %(players[i],player_info[players[i]][0],player_info[players[i]][1]))print('--------------------------------------------')show_role()

# 运行代码即可。
import time,randomplayer_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  # return 多个元素时,返回一个元组(昨天课堂有讲)# 给角色生成随机属性,并展示角色信息。
def show_role():for i in range(3):player_info[players[i]] = born_role()enemy_info[enemies[i]] = born_role()# 展示我方的3个角色print('----------------- 角色信息 -----------------')print('你的人物:')for i in range(3):print('%s  血量:%d  攻击:%d' %(players[i],player_info[players[i]][0],player_info[players[i]][1]))print('--------------------------------------------')print('电脑敌人:')# 展示敌方的3个角色for i in range(3):print('%s  血量:%d  攻击:%d' %(enemies[i],enemy_info[enemies[i]][0],enemy_info[enemies[i]][1]))print('--------------------------------------------')show_role()










# 排序功能,未封装函数前的代码
players = ['【狂血战士】','【森林箭手】','【光明骑士】']order_dict = {}
for i in range(3):order = int(input('你想将 %s 放在第几个上场?(输入数字1~3)' % players[i]))order_dict[order] = players[i]players = []
for i in range(1,4):players.append(order_dict[i]) print('\n我方角色的出场顺序是:%s、%s、%s' % (players[0],players[1],players[2]))# 排序功能,封装成函数后(未调用)
players = ['【狂血战士】','【森林箭手】','【光明骑士】']def order_role(): global players  #记得global一下order_dict = {}for i in range(3):order = int(input('你想将 %s 放在第几个上场?(输入数字1~3)'%(players[i])))order_dict[order] = players[i]  players = []for i in range(1,4):players.append(order_dict[i]) print('\n我方角色的出场顺序是:%s、%s、%s' %(players[0],players[1],players[2]))

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()# 展示我方的3个角色print('----------------- 角色信息 -----------------')print('你的人物:')for i in range(3):print('%s  血量:%d  攻击:%d' %(players[i],player_info[players[i]][0],player_info[players[i]][1]))print('--------------------------------------------')print('电脑敌人:')# 展示敌方的3个角色for i in range(3):print('%s  血量:%d  攻击:%d' %(enemies[i],enemy_info[enemies[i]][0],enemy_info[enemies[i]][1]))print('--------------------------------------------')input('请按回车键继续。\n')  # 为了让玩家更有控制感,可以插入类似的代码来切分游戏进程。# 角色排序,选择出场顺序。
def order_role(): global playersorder_dict = {}for i in range(3):order = int(input('你想将 %s 放在第几个上场?(输入数字1~3)'%(players[i])))order_dict[order] = players[i]  players = []for i in range(1,4):players.append(order_dict[i]) print('\n我方角色的出场顺序是:%s、%s、%s' %(players[0],players[1],players[2]))print('敌方角色的出场顺序是:%s、%s、%s' %(enemies[0],enemies[1],enemies[2]))def main():show_role()order_role()main()


player_victory = 0
enemy_victory = 0while player_life > 0 and enemy_life > 0:player_life = player_life - enemy_attack enemy_life = enemy_life - player_attackprint('你发起了攻击,【玩家】剩余血量%s' % player_life)print('敌人向你发起了攻击,【敌人】的血量剩余%s' % enemy_life)print('-----------------------')time.sleep(1.2)if player_life > 0 and enemy_life <= 0:player_victory += 1print('敌人死翘翘了,你赢了!')
elif player_life <= 0 and enemy_life > 0:enemy_victory += 1print('悲催,敌人把你干掉了!')
else:print('哎呀,你和敌人同归于尽了!')if player_victory > enemy_victory :time.sleep(1)print('\n【最终结果:你赢了!】')
elif enemy_victory > player_victory:print('\n【最终结果:你输了!】')
else: print('\n【最终结果:平局!】')



# 为专注于pk_role()函数,将前面代码做了简化,是我们前面已经实现的效果(默认你已经掌握了)。
# 注意代码的缩进、循环和判断条件的设定。import time
#PK过程,还是有暂停效果比较好!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  # 注:round表示局数。score = 0for i in range(3):  # 一共要打三局 i依次为0,1,2player_name = players[i]  # 统一将下面会用到的数据先赋值给变量会更清晰更好管理# 提取玩家角色名称enemy_name = enemies[i]  player_life = player_info[players[i]][0]#玩家血量是字典里的值(元组)的第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_attackplayer_life = player_life - enemy_attackprint('%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和局数round的影响。if player_life > 0 and enemy_life <= 0:print('\n敌人死翘翘了,你赢了!')score += 1  # 分数变化(1)elif player_life <= 0 and enemy_life > 0:        print('\n悲催,敌人把你干掉了!')score += -1  # 分数变化(2)# 等价于score = score - 1else :print('\n哎呀,你和敌人同归于尽了!')score += 0  # 分数变化(3)#这行不写也不影响round += 1  # 局数+1,直到循环完3局。input('\n点击回车,查看比赛的最终结果\n')if score > 0:print('【最终结果:你赢了!】\n')elif score < 0:print('【最终结果:你输了!】\n')else:print('【最终结果:平局!】\n')pk_role()



import timeplayers = ['【狂血战士】','【森林箭手】','【光明骑士】']
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 = 0for 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_attackplayer_life = player_life - enemy_attackprint('%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 += 1input('\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,resultelse :result = '\n哎呀,你和敌人同归于尽了!'return 0,resultpk_role()



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()# 展示我方的3个角色print('----------------- 角色信息 -----------------')print('你的人物:')for i in range(3):print('%s  血量:%d  攻击:%d' %(players[i],player_info[players[i]][0],player_info[players[i]][1]))print('--------------------------------------------')print('电脑敌人:')# 展示敌方的3个角色for i in range(3):print('%s  血量:%d  攻击:%d' %(enemies[i],enemy_info[enemies[i]][0],enemy_info[enemies[i]][1]))print('--------------------------------------------')input('请按回车键继续。\n')  # 为了让玩家更有控制感,可以插入类似的代码来切分游戏进程。# 角色排序,选择出场顺序。
def order_role(): global playersorder_dict = {}for i in range(3):order = int(input('你想将 %s 放在第几个上场?(输入数字1~3)'% players[i]))order_dict[order] = players[i]  players = []for i in range(1,4):players.append(order_dict[i]) print('\n我方角色的出场顺序是:%s、%s、%s' %(players[0],players[1],players[2]))print('敌方角色的出场顺序是:%s、%s、%s' %(enemies[0],enemies[1],enemies[2]))# 角色PK
def pk_role(): round = 1  score = 0for 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_attackplayer_life = player_life - enemy_attackprint('%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和局数的变化。# 调用show_result()函数,打印返回元组中的result。print(show_result(player_life,enemy_life)[1])# 调用show_result()函数,完成计分变动。score += int(show_result(player_life,enemy_life)[0])round += 1input('\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,resultelse :result = '\n哎呀,你和敌人同归于尽了!'return 0,result# (主函数)展开战斗流程
def main():show_role()order_role()pk_role()# 启动程序(即调用主函数)
main()

本文总结:
前面废话了那么多,其实就是为了得出上面这个终极结论,
而这个终极结论如果不看前面的废话,主要由下面几个重要的点组成:
1、main 主函数

2、如何存放角色属性的信息:

import random
player = ['狂血战士']
#角色列表,有一个元素
dict1 = {}
#创建一个字典,存放角色属性信息
def info():a = random.randint(1,3)b = random.randint(4,6)return a,b  # return 多个值时,返回一个元组(a,b)
data = info()
#调用info()函数,将返回的元组(a,b)赋值给变量data
print(data)
dict1[player[0]] = data
#往空字典添加键值对,player[0]即'狂血战士'为键,
#data(元组)为值。
print(dict1)
print(dict1[player[0]])
# 打印出字典的值
print(dict1[player[0]][0])
# 打印出字典的值data的第0个元素
print(dict1[player[0]][1])
# 打印出字典的值data的第1个元素


3.global
其实我也不理解为啥这里要写global player

4.input时候的顺序存放问题

这个地方容易写错

5、元组

返回的元组[0] 用来计分,元组[1]用来返回比赛结果

2020/4/14 纪念:
终于能一次默写出来了。

import random
pall=['【君莫笑】','【全职高手】','【千机伞】','【散人】','【芦苇微微】']
eall=['【巫师】','【骑士】','【战队】','【工会】','【黑魔法】']
p3=random.sample(pall,3)
e3=random.sample(eall,3)
pinfo={}
einfo={}
def xueliang():life=random.randint(150,200)attack=random.randint(30,50)return life,attack
def role():for i in range(3):pinfo[p3[i]]=xueliang()einfo[e3[i]]=xueliang()print('-----角色信息-----')print('你的人物:')for i in range(3):print('%s 血量:%s 攻击:%s'%(p3[i],pinfo[p3[i]][0],pinfo[p3[i]][1]))print('-----------------')print('电脑敌人:')for i in range(3):print('%s 血量: %s 攻击:%s'%(e3[i],einfo[e3[i]][0],einfo[e3[i]][1]))print('-----------------')input('请按回车键继续\n')
def order():global p3shunxu={}for i in range(3):s=int(input('你想将%s放在第几个出场'%(p3[i])))shunxu[s]=p3[i]p3=[]for i in range(1,4):p3.append(shunxu[i])print('我方角色的出场顺序是:%s%s%s'%(p3[0],p3[1],p3[2]))print('敌方角色的出场顺序是:%s%s%s'%(e3[0],e3[1],e3[2]))
def pk():round=1score=0for i in range(3):pname=p3[i]ename=e3[i]plife=pinfo[p3[i]][0]pattack=pinfo[p3[i]][1]elife=einfo[e3[i]][0]eattack=einfo[e3[i]][0]print('\n-------【第%s局】--------'%round)print('玩家角色:%s VS 敌方角色:%s'%(pname,ename))print('%s 血量:%s 攻击:%s'%(pname,plife,pattack))print('%s 血量:%s 攻击:%s'%(ename,elife,eattack))print('--------------------------')input('请按回车键继续\n')while plife>0 and elife>0:plife=plife-eattackelife=elife-pattackprint('%s发起了攻击,%s剩余血量:%s'%(pname,ename,elife))print('%s发起了攻击,%s剩余血量:%s'%(ename,pname,plife))print('------------------------')else:print(showresult(plife,elife)[1])round+=1score+=int(showresult(plife,elife)[0])input('\n点击回车,查看比赛的最终结果')if score>0:print('最后是你赢了')elif score<0:print('最后是敌人赢了')else:print('平局')def showresult(plife,elife):if plife>0 and elife<=0:result='你赢了'return 1,resultelif plife<=0 and elife>0:result='敌人赢了'return -1,resultelse:result='同归于尽'return 0,result
def main():role()order()pk()
main()

第10关:田忌赛马 (1)相关推荐

  1. 开发者基础知识游戏,共10关,欢迎挑战

    昨晚无眠,突然想起了以前园子里出现的某种找答案的游戏,那时是一个老外设计的. (补充,后来有网友告知,是某年的双十一光棍节应景的游戏) 于是花了一个晚上思考,今天又花了点时间,设计了一个简单的开发者知 ...

  2. sqli-labs 1~10关教程

    sqlli-labs 1~10关教程 本篇有点长,建议使用目录查看自己想看的关卡 第一关 输入?id=1 出现如下图 输入id=1' 出现语法错误 表示这里可能出现sql注入漏洞 进一步尝试 输入 i ...

  3. python-85行代码完成贪吃蛇和关卡升级:是男人就坚持到第10关!

    使用python,85行代码实现贪吃蛇和关卡升级 你觉得你能坚持到第10关吗? 一.实现效果 二.环境要求 1.python 3+ 2.pygame包 安装命令:打开cmd 输入: pip insta ...

  4. PythonChallenge过关斩将录-0~10关

    说明: http://www.pythonchallenge.com/ pythonchallenge是在学习openstack的时候,介绍python语言时推荐的一个游戏解密网站,自己看了一下,有些 ...

  5. 光棍节程序员闯关秀(总共10关)

    程序员闯关大挑战: https://1111.segmentfault.com/ 仓鼠演示7k7k.4399小游戏: http://cdn.abowman.com/widgets/hamster/ha ...

  6. python基础语法第10关作业-Python基础语法习题一

    Part 1 习题 1.简述编译型与解释型语言的区别,且分别列出你知道的哪些语言属于编译型,哪些属于解释型2.执行 Python 脚本的两种方式是什么3.Pyhton 单行注释和多行注释分别用什么?4 ...

  7. python基础语法第10关作业-Python基础语法习题

    1.~12为什么是-13? 解1:12 二进制:0000 1100 补码: 0000 1100 按位取反 :1111 0011 求这个原码,即负数求补码的逆过程:先减1,再取反 (符号位不变) -1 ...

  8. python基础语法第10关作业-Python基础作业一

    一.python变量命名规范: 1.变量名主要由字母,数字,下划线组成 2.变量名不能以数字作为开头,更不能全部由数字组成 3.变量名不能以中文命名 4.变量名需简洁明了 5,变量名不能过长 6.py ...

  9. python基础语法第10关作业-关于一些Python的一些基础语法训练

    1:已知a和b元素 a = 'pyer' b = 'apple' 用字典和format方法实现:效果:my name is pyer, i love apple. 1.format的方法 c =&qu ...

最新文章

  1. django 快速实现文件上传
  2. 深入理解javascript的闭包
  3. mysql大数据量的全量备份_mysql备份神器——Xtrabackup全量备份还原
  4. Android Sensor Driver(四)——IIC总线和驱动
  5. 腾讯云再登 KVM 开源贡献榜,Linux 虚拟化技术将走向何方?
  6. 基于junit4的关于个人所得税计算的等价类与边界值_测试用例的设计方法--边界值分析方法...
  7. Ubuntu下PostgreSQL数据库集群(PL/Proxy)配置方法
  8. 华为手机文档里的html,如何在华为手机上编辑word文档
  9. 个人微信机器人,微信开发API
  10. android硬盘加密软件,Whisper Systems推出Android硬盘加密工具
  11. [window] win7系统下电脑声音正常,右下角的小喇叭图标不见了
  12. 习题3.3投骰子的随机游戏
  13. 网络其他计算机无法访问,win7局域网别人无法访问我的电脑是为什么_win7其他电脑无法访问我的电脑如何修复-win7之家...
  14. 网站带不带www真的不一样,很多新手不知道区别会被坑死的
  15. 【杂谈】如何找回自己的执行力
  16. 国外计算机专业博士项目,国外计算机类优秀博士答辩pptPhDdefense().ppt
  17. 接地电阻测试仪使用方法讲解
  18. Slysoft All-in-One 1.9 (21/03/2007)
  19. 软件开发成本太高,怎么办?
  20. 【基金量化研究系列】大类资产配置研究(二)——股债二八轮动策略

热门文章

  1. Linux中root@localhost变为root@bogon的解决方法
  2. Kurento 源码解析系列(3)- RtpEndpoint端点初始化解析
  3. SaaS电商新零售系统-PHP+UniApp
  4. GeoTools集成一些细节
  5. 华为服务器 联想服务器 稳定性,西安华为服务器
  6. 【SQL】群辉 NAS 安装 Mysql 远程访问连接
  7. FL Studio打开保存的flp文件
  8. 单片机ADC检测4-20mA电路,以及计算方法
  9. dns服务器响应名称,在没有配置的 DNS 服务器响应之后,名称xxxx的名称解析超时。...
  10. CRect 详解及注意事项