六、反恐精英#

反恐精英是非常经典的游戏,游戏中分为两个角色:警察和土匪

警察和土匪都可以拿枪打击对方

我们要用面向对象实现反恐精英流程

1. 需求说明#

1
2
3
4
5
6
7
8
1.游戏枪支有不同的型号,并拥有不同的伤害
2.枪支可以添加一定数量的子弹
3.枪支可以设计敌人,设计敌人时,如果子弹数量为0,则提示玩家;如果有子弹,会减少子弹,如果击中敌人,会让敌人受伤
4.输出枪支信息时,可以显示枪支的型号、伤害、子弹数量
5.游戏玩家分为警察和土匪两种角色,玩家拥有自己的枪支和血量,可以攻击敌人
6.玩家攻击敌人时,如果没有枪,则提示玩家;如果有枪,则检查枪支是否有子弹,有子弹则使用枪支射击敌人,没有子弹则自动给枪支添加子弹
7.玩家被击中会受伤,减少血量为枪支的伤害,提示玩家受伤并显示当前血量;如果血量<=0,则提示玩家死亡
8.输出玩家信息时,可以显示玩家角色、状态、血量、所持有枪支的信息

类图

枪支类

  1. 使用Gun类可以创建枪支对象
  2. 枪有三个属性:
  3. 型号:model
  4. 杀伤力:damage
  5. 子弹数量:bullet_count,枪出事没有子弹
  6. 实现__str__方法,显示枪的model、damage和area属性
  7. 调用add_bullets方法可以增加子弹数量
  8. 调用shoot方法可以给参数敌人对象造成伤害
  9. 如果没有子弹,则提示玩家并返回
  10. 如果有子弹,则:
    1. 子弹数量减少
    2. 调用敌人对象hurt方法,给敌人造成伤害

玩家类

  1. 使用Player类可以创建警察对象土匪对象
  2. 玩家有三个属性:
  3. 姓名:name
  4. 血量:hp
  5. 枪:gun 使用Gun类创建的对象,初始没有枪
  6. 实现__str__方法,显示玩家的name、hp和gun属性
  7. 调用hurt方法可以让当前玩家受到enemy_gun的伤害,具体流程如下:
  8. 玩家血量减去枪对象damage伤害度
  9. 判断修改后的玩家血量
    1. 如果血量<0,提示玩家挂了
    2. 否则,提示玩家受伤以及当前血量
  10. 调用fire方法可以向enemy开火,具体流程如下:
  11. 判断自己是否有武器,如果没有直接返回
  12. 检查自己的枪是否有子弹,如果没有,自动装填子弹
  13. 让自己的枪调用shoot方法,并传递要射击的敌人对象

主程序流程

  1. 创建枪对象并测试装填和发射子弹
  2. 创建警察对象policeman匪徒对象badman
  3. 将枪支交给警察,警察向匪徒开火
  4. 利用循环消灭匪徒

2. 代码实现#

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
"""------------------ 枪支类 ------------------"""


class Gun:
    def __init__(self, model, damage):
        '''
        初始化枪支
        :param model: 型号
        :param damage: 伤害
        '''
        self.model = model
        self.damage = damage
        # 默认子弹数量
        self.bullet_count = 0

    def __str__(self):
        return '型号:{},伤害:{},子弹数量:{}'.format(self.model, self.damage, self.bullet_count)

    def add_bullets(self, count):
        '''
        添加子弹
        :param count:
        :return:
        '''
        self.bullet_count += count
        print('添加子弹成功')

    def shoot(self, enemy):
        '''
        射击敌人
        :param enemy: 敌方Player类型
        :return:
        '''
        # 判断子弹是否为0
        if self.bullet_count == 0:
            print('请填充子弹')
        else:
            # 有子弹
            # 减少子弹
            self.bullet_count -= 1
            # 默认击中敌人
            enemy.hurt(self)


"""------------------ 游戏玩家 ------------------"""


class Player:
    def __init__(self, role):
        '''
        初始化玩家
        :param role: 玩家角色
        '''
        self.role = role
        # 默认血量为100
        self.hp = 100
        # 枪支 默认没有枪支 为None
        self.gun = None
        # 状态
        self.state = '活着'

    def __str__(self):
        return '角色:{},状态:{},血量:{},枪支:{}'.format(self.role, self.state, self.hp, self.gun)

    def fire(self, enemy):
        '''
        射击敌人
        :param enemy: 敌人Player类型
        :return:
        '''
        # 判断有没有枪
        if self.gun:
            # 有枪
            # 判断是否有子弹
            if self.gun.bullet_count > 0:
                # 有子弹
                self.gun.shoot(enemy)
            else:
                # 没有子弹,添加子弹
                self.gun.add_bullets(5)
        else:
            # 没枪
            print('现在还没有枪支')

    def hurt(self, enemy_gun):
        '''
        玩家受到伤害
        :param enemy_gun:受到哪个枪支的伤害
        :return:
        '''
        # 减少血量
        self.hp -= enemy_gun.damage
        if self.hp<=0:
            # 死亡
            print('玩家:{}死亡'.format(self.role))
        else:
            # 提示玩家受伤  提示当前血量
            print('玩家受伤,当前血量:{}'.format(self.hp))

# 创建枪支
gun = Gun('ak47',10)
# 创建警察
player1 = Player('警察')
# 创建土匪
player2 = Player('土匪')

# 把枪支交给警察
player1.gun = gun

# 警察射击土匪
while player2.hp>0:
    player1.fire(player2)