题目要求:
如今除了字典外,我们已经学了Python编程中最基本的语法,也学了三种控制流(顺序结构,循环结构,分支结构),这些足以让我们实现一些简单的项目了,当然复杂的项目也是可以用最基本的语法实现,但是操作会繁杂且机械些。其实计算机运行的思路很简单的,它得到一个前提,再根据某些条件判断进行分支,最后根据你定下的公式进行运算得出结果。如果公式复杂,需要重复操作的话,就可以通过循环进行处理。
光听会比较抽象,接下来我们通过一个小游戏项目来加深对编程的认知吧,这个小游戏就是【人机PK】。在这个小游戏项目中,我们会运用所学知识(也会适量补充一些新知识),一起完成一个文字版的人机对战小游戏,并逐步增加游戏的功能,让它变得更真实、更好玩。
简单来说,这个游戏中,会随机生成玩家和敌人的属性,同时互相攻击,直至一方血量小于零。另外,这样的战斗会持续三局,采取三局两胜制,最后输出战斗结果,公布获胜方。
其实在现实生活中,甲方这样就已经是提完需求了,接下来就交由技术人员去琢磨,只要最终结果一致且不出问题就可以交付任务啦。
考虑到我们还是一群刚入门的新手,主要目的是学习,所以我先给大家梳理一下这个小游戏的整体思路吧~
游戏名称:人机PK
游戏角色:玩家&敌人
游戏规则:玩家与敌人相互攻击,血量先为0者失败
游戏模式:三局两胜
我们要有玩家、敌人,要能相互攻击,攻击能够减少血量,最终会有胜负。
那么首先得创建角色,角色有血量与攻击力,主要的是血量和攻击力,我们需要进行它们之间的计算。接下来就是一些运算,如何相互攻击,如何减少血量,以及怎么显示结果,这些就交由你自己思考啦~
这里我再分享两点额外的知识,也是游戏里可能用到的内容:【随机生成血量与攻击力】、【延迟显示结果】。
(1)随机生成血量与攻击力
由于是三局两胜的模式,我们不能够一开始限定死双方的血量与攻击力,不然始终由一方获胜就没有意义啦。可以在每一轮结束后重新设定两个值(用input()函数),这会比较麻烦,而且在数值上是主观的。我这里有一种方法可以交由计算机随机生成数字,这样就不会我们手动输入且保证相对公平啦。
import random # 导入random模块
# 使用randint()方法,在1-100间随机生成一个整数,包括1和100
num_1 = random.randint(1, 100)
num_2 = random.randint(1, 100)
# 每次打印的数字都是不一样的
print('num1为:{}\nnum2为:{}'.format(num_1, num_2))
(2)延迟显示结果
在需求中我们看到,结果是逐渐显示的,在我们之前运行时,结果是一下子全部显示出来的,那么我们要怎么做到逐渐显示的效果呢?
这里就可以用到另一个模块:time模块
import time # 导入time模块
print('测试1')
time.sleep(2) # 让程序休眠2秒,可以改秒数
print('2秒后显示测试2')
time模块中有许多关于时间的操作,其中就有让程序休眠的方法 time.sleep(n)。逐渐显示就是延迟显示,只要让时间暂停1或2秒钟就可以啦~
代码实现:
# 导入time和random模块
import time
import random
# 初始化玩家和敌人的胜利次数
player_victory = 0
enemy_victory = 0
# 设置循环3次,三局两胜
for i in range(1, 4):
# 每局开始前停顿1.5秒
time.sleep(1.5)
print(' \n——————现在是第 %s 局——————' % i)
# 对比之前:(' \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血量:%s\n攻击:%s' % (player_life, player_attack))
print('------------------------')
time.sleep(1)
print('【敌人】\n血量:%s\n攻击:%s' % (enemy_life, enemy_attack))
print('-----------------------')
time.sleep(1)
# 如果双方血量都大于0时,就进入循环
while player_life > 0 and enemy_life > 0:
# 目前血量 = 原有血量 - 对方的攻击力
player_life = player_life - enemy_attack
enemy_life = enemy_life - player_attack
if player_life < 0:
player_life = 0
if enemy_life < 0:
enemy_life = 0
print('你发起了攻击,【敌人】剩余血量%s' % enemy_life)
print('敌人向你发起了攻击,【玩家】的血量剩余%s' % player_life)
print('-----------------------')
time.sleep(1.2)
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('哎呀,你和敌人同归于尽了!')
# 一次循环过后,会回到循环的条件判断,如果血量都大于0,继续循环
if player_victory > enemy_victory:
time.sleep(1)
print('\n【最终结果:你赢了!】')
elif enemy_victory > player_victory:
print('\n【最终结果:你输了!】')
else:
print('\n【最终结果:平局!】')
运行结果:
因为血量和攻击力都是随机生成的,所以每次的执行结果都是不固定的。