目录
八、人机小游戏
项目实操:学会用封装函数编写程序,考察函数、列表、字典。
1、明确项目目标
1)随机生成玩家和敌人的属性,同时互相攻击,直至一方血量小于零。
2)这样的战斗会持续三局,采取三局两胜制,最后输出战斗结果,公布获胜方。
2、分解过程,拆解项目
1.0:自定属性,人工PK
2.0:随机属性,自动PK
3.0:打印战果,三局两胜
3、逐步执行,代码实现
1.0 版本+计时器time.sleep(sec)
显示玩家和敌人属性→PK过程展示,双方血量变化→显示pk结果
print('【玩家】\n血量:100\n攻击:50') # 自定义玩家角色的血量和攻击,用换行符'\n'来优化视觉
print('------------------------') # 辅助功能,起到视觉分割的作用,让代码的运行结果更清晰
print('【敌人】\n血量:100\n攻击:30')
print('------------------------')
print('你发起了攻击,【敌人】剩余血量50') # 人工计算敌人血量:100-50=50
print('敌人向你发起了攻击,【玩家】剩余血量70') # 人工计算玩家血量:100-30=70
print('------------------------')
print('你发起了攻击,【敌人】剩余血量0') # 双方同时攻击,若血量出现小于等于0,游戏结束
print('敌人向你发起了攻击,【玩家】剩余血量40')
print('-----------------------')
print('敌人死翘翘了,你赢了!') # 打印结果
计时器time.sleep(sec)
time.sleep(1.5)就表示停留1.5秒再运行后续代码
import time #通常import语句会写到代码的开头
print('【玩家】\n血量:100\n攻击:50')
print('------------------------')
time.sleep(1.5)
#暂停1.5秒,再继续运行后面的代码
print('【敌人】\n血量:100\n攻击:30')
print('------------------------')
time.sleep(1.5)
#同上
print('你发起了攻击,【敌人】剩余血量50')
print('敌人向你发起了攻击,【玩家】剩余血量70')
print('------------------------')
time.sleep(1.5)
print('你发起了攻击,【敌人】剩余血量0')
print('敌人向你发起了攻击,【玩家】剩余血量40')
print('-----------------------')
time.sleep(1.5)
print('敌人死翘翘了,你赢了!')
2.0版本+随机生成random.randint(a,b)
随机生成玩家和敌人属性→显示属性→PK过程展示,自动攻击扣血
随机生成[a,b]范围内的整数,random.randint(a,b)
import time,random
player_life = random.randint(100,150)
player_attack = random.randint(30,50)
enemy_life = random.randint(100,150)
enemy_attack = random.randint(30,50)
print('【玩家】\n'+'血量:'+str(player_life)+'\n攻击:'+str(player_attack))
print('------------------------')
time.sleep(1)
print('【敌人】\n'+'血量:'+str(enemy_life)+'\n攻击:'+str(enemy_attack))
print('------------------------')
time.sleep(1)
while (player_life >0) and (enemy_life > 0):
player_life = player_life - enemy_attack
enemy_life = enemy_life - player_attack
print('你发起了攻击,【玩家】剩余血量'+str(player_life))
#player_life是整数,所以拼接时要先用str()转换
print('敌人向你发起了攻击,【敌人】剩余血量'+str(enemy_life))
print('------------------------')
time.sleep(1.5)
# 为了体现出战斗回合,这里停顿1.5秒
3.0版本
游戏开始→随机生成属性→显示属性→PK过程展示→输出单局结果(循环3次)→输出三局两胜结果→游戏结束
import time,random
player_victory = 0
enemy_victory = 0
for i in range(1,4):
time.sleep(2) # 让局与局之间有较明显的有时间间隔
print(' \n——————现在是第'+str(i)+'局——————') # 作为局的标记
player_life = random.randint(100,150)
player_attack = random.randint(30,50)
enemy_life = random.randint(100,150)
enemy_attack = random.randint(30,50)
# 展示双方角色的属性
print('【玩家】\n'+'血量:'+str(player_life)+'\n攻击:'+str(player_attack))
print('------------------------')
time.sleep(1)
print('【敌人】\n'+'血量:'+str(enemy_life)+'\n攻击:'+str(enemy_attack))
print('------------------------')
time.sleep(1)
# 双方PK
while player_life > 0 and enemy_life > 0:
player_life = player_life - enemy_attack
enemy_life = enemy_life - player_attack
print('你发起了攻击,【玩家】剩余血量'+str(player_life))
print('敌人向你发起了攻击,【敌人】剩余血量'+str(enemy_life))
print('-----------------------')
time.sleep(1.5)
#打印最终战果
if player_life > 0 and enemy_life <= 0:
player_victory += 1
print('敌人死翘翘了,你赢了!')
elif player_life <= 0 and enemy_life > 0:
enemy_victory += 1
print('悲催,敌人把你干掉了!')
else:
print('哎呀,你和敌人同归于尽了!')
if player_victory > enemy_victory :
time.sleep(1)
print('【最终结果:你赢了!】')
elif enemy_victory > player_victory:
print('【最终结果:你输了!】')
else:
print('【最终结果:平局!】')
4、简化字符串的连接
1)格式符%+类型码
%s字符串,%f浮点数,%d整数
2)format()函数
format()函数用大括号{}占位,不用区分类型码
对比
print('【玩家】\n'+'血量:'+str(player_life)+'\n攻击:'+str(player_attack))
print('【玩家】\n血量:%s \n攻击:%s' % (player_life,player_attack))
print('【玩家】\n血量:{}\n攻击:{}'.format(player_life,player_attack))
5、新增功能:3局过后,是否再来一盘
import time,random
#随机生成属性
player_victory=0
enemy_victory=0
while True:
for i in range(1,4):
print('\n-------现在是第'+str(i)+'局-------')
player_life=random.randint(100,150)
player_attack=random.randint(30,50)
enemy_life=random.randint(100,150)
enemy_attack=random.randint(30,50)
print('【玩家】\n血量:{}\n攻击:{}'.format(player_life,player_attack))
print('--------------------------------------')
time.sleep(1)
print('【敌人】\n血量:{}\n攻击:{}'.format(enemy_life,enemy_attack))
print('--------------------------------------')
time.sleep(1)
#双方PK
while (player_life>0) and (enemy_life>0):
player_life-=enemy_attack
enemy_life-=player_attack
print ('你发起了攻击,【敌人】剩余血量{}'.format(enemy_life))
print ('敌人向你发起了攻击,【玩家】剩余血量{}'.format(player_life))
print ('--------------------------------------')
time.sleep(1.5)
#打印结果
if player_life<0 and enemy_life>0:
enemy_victory+=1
print('哎呀,你没了。')
elif player_life>0 and enemy_life<0:
player_victory+=1
print('恭喜你!取得胜利!')
else:
print('哦豁,你和敌人同归于尽了。')
time.sleep(1)
if player_victory>enemy_victory:
print('\n【最终结果:你赢了】')
elif player_victory<enemy_victory:
print('\n【最终结果:你输了】')
else:
print('\n【最终结果:平局】')
time.sleep(1)
a=input('你想再来一局吗?请按n键离开游戏,按其他任意键继续游戏。')
if a=='n':
break