人机对战小游戏

题目要求:

如今除了字典外,我们已经学了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【最终结果:平局!】')

运行结果:

因为血量和攻击力都是随机生成的,所以每次的执行结果都是不固定的。 

猜你喜欢

转载自blog.csdn.net/mez_Blog/article/details/122507297
今日推荐