Lesson 15 - Combat Simulator

The following topics are discussed in this notebook:

  • Classes and instances.
  • Attributes and methods.
  • Constructors
In [1]:
import numpy as np
In [2]:
class Fighter:
    
    def __init__(self, name, power, defense, speed, health = 20):
        self.name = name
        self.power = power
        self.defense = defense
        self.speed = speed
        self.max_health = health
        self.health = health
        self.cooldown = 0
    
    def upkeep(self):
        if self.cooldown > 0:
            self.cooldown -= 1
        
    def attack(self, other):
        attack = np.random.choice(range(0,self.power + 1), 1)[0]
        block = np.random.choice(range(0,other.defense + 1), 1)[0]
        damage = max(attack - block, 0)
        other.health -= damage
        self.cooldown += 6 - self.speed
        msg = self.name + ' attacks ' + other.name + ' for ' + str(attack) + ' damage. '
        msg += other.name + ' blocks for ' + str(block) + ' and loses ' + str(damage) + ' health.'
        return(msg)    
    
    def reset(self):
        self.health = self.max_health
        self.cooldown = 0
In [3]:
class Battle:
     
    def __init__(self, fighter1, fighter2, verbose = 2):
        self.turn = 0
        self.fighter1 = fighter1
        self.fighter2 = fighter2
                
        while(self.finished() == False):
            self.turn += 1
            self.fighter1.upkeep()
            self.fighter2.upkeep()
            
            if(verbose == 2):
                msg = '--- Turn ' + str(self.turn) + ' ('
                msg += fighter1.name + ' has ' + str(fighter1.health) + ' health, '
                msg += fighter2.name + ' has ' + str(fighter2.health) + ' health) ---'
                print(msg)
            
            msg1 = ''
            msg2 = ''

            if(self.fighter1.cooldown == 0):
                msg1 = fighter1.attack(fighter2)
                if(verbose == 2):
                    print(msg1)
            if(self.fighter2.cooldown == 0):
                msg2 = fighter2.attack(fighter1)
                if(verbose == 2):
                    print(msg2)
            if(msg1 == '' and msg2 == '' and verbose == 2):
                print('Nothing happened.')
                  
        if(self.fighter1.health > 0):
            self.winner = fighter1
            self.loser = fighter2
        else:
            self.winner = fighter2
            self.loser = fighter1
        
        if(verbose > 0):
            print('The winner is ' + self.winner.name + '!!')
            
        fighter1.reset()
        fighter2.reset()
            
    def finished(self):
        if(self.fighter1.health <= 0 or self.fighter2.health <= 0):
            return True
        return False
            
    
In [4]:
Thor = Fighter('Thor', 4, 3, 3, 20)
Hulk = Fighter('Hulk', 5, 3, 2, 20)

the_battle = Battle(Thor, Hulk, verbose=1)
The winner is Hulk!!
In [5]:
hulk_wins = 0

for i in range(0, 1000):
    a_battle = Battle(Thor, Hulk, verbose=0)
    if(a_battle.winner.name == 'Hulk'):
        hulk_wins += 1

hulk_perc = hulk_wins / 10
thor_perc = 100 - hulk_perc

print('Hulks\'s win percentage: ' + str(hulk_perc))
print('Thor\'s win percentage: ' + str(thor_perc))
Hulks's win percentage: 57.2
Thor's win percentage: 42.8
In [6]:
Spidey = Fighter('Spider-Man', 2, 4, 5, 20)
Hulk = Fighter('Hulk', 5, 3, 2, 20)

the_battle = Battle(Spidey, Hulk, verbose=1)
The winner is Spider-Man!!
In [7]:
hulk_wins = 0

for i in range(0, 1000):
    a_battle = Battle(Spidey, Hulk, verbose=0)
    if(a_battle.winner.name == 'Hulk'):
        hulk_wins += 1

hulk_perc = hulk_wins / 10
spidey_perc = 100 - hulk_perc

print('Hulks\'s win percentage: ' + str(hulk_perc))
print('Spider-Man\'s win percentage: ' + str(spidey_perc))
Hulks's win percentage: 40.1
Spider-Man's win percentage: 59.9
In [ ]: