Tower Defense Game Example

Here is an example of class inheritance in the context of a tower defense game

class Tower {
  constructor(x, y) {
    this.x = x;
    this.y = y;
    this.range = 1;
    this.damage = 1;
    this.price = 10;
  }

  attack(enemies) {
    // Find the closest enemy within range
    let closestEnemy = null;
    let closestDistance = this.range + 1;
    for (const enemy of enemies) {
      const distance = Math.sqrt(Math.pow(enemy.x - this.x, 2) + Math.pow(enemy.y - this.y, 2));
      if (distance < closestDistance) {
        closestEnemy = enemy;
        closestDistance = distance;
      }
    }

    // Attack the closest enemy if it is within range
    if (closestEnemy && closestDistance <= this.range) {
      closestEnemy.health -= this.damage;
      console.log(`Tower at (${this.x}, ${this.y}) attacked enemy at (${closestEnemy.x}, ${closestEnemy.y}) for ${this.damage} damage.`);
      if (closestEnemy.health <= 0) {
        console.log(`Enemy at (${closestEnemy.x}, ${closestEnemy.y}) has been defeated!`);
      }
    }
  }
}

class MissileTower extends Tower {
  constructor(x, y) {
    super(x, y);
    this.range = 3;
    this.damage = 5;
    this.price = 30;
  }

  attack(enemies) {
    // Find all enemies within range
    const enemiesInRange = enemies.filter(enemy => {
      const distance = Math.sqrt(Math.pow(enemy.x - this.x, 2) + Math.pow(enemy.y - this.y, 2));
      return distance <= this.range;
    });

    // Attack all enemies within range
    for (const enemy of enemiesInRange) {
      enemy.health -= this.damage;
      console.log(`Missile tower at (${this.x}, ${this.y}) attacks enemy at (${enemy.x}, ${enemy.y}) for ${this.damage} damage.`);
      if (enemy.health <= 0) {
        console.log(`Enemy at (${enemy.x}, ${enemy.y}) has been defeated!`);
      }
    }
  }
}

class Enemy {
  constructor(x, y) {
    this.x = x;
    this.y = y;
    this.health = 10;
  }
}

// Create a new tower and enemy
const tower = new Tower(5, 5);
const enemy = new Enemy(10, 5);

// Attack the enemy with the tower
tower.attack([enemy]);
// Output: "Tower at (5, 5) attack enemy at (10, 5) for 1 damage."

// Create a new missile tower and enemy
const missileTower = new MissileTower(5, 5);
const enemy2 = new Enemy(8,5);

// Attack the enemy with the missile tower
missileTower.attack([enemy2]);
// Output: "Missile tower at (5, 5) attacks enemy at (8, 5) for 5 damage."

// Create a new missile tower and multiple enemies
const missileTower2 = new MissileTower(5, 5);
const enemy3 = new Enemy(7, 5);
const enemy4 = new Enemy(9, 5);
const enemy5 = new Enemy(10, 5);

// Attack the enemies with the missile tower
missileTower2.attack([enemy3, enemy4, enemy5]);
// Output:
// "Missile tower at (5, 5) attacks enemy at (7, 5) for 5 damage."
// "Missile tower at (5, 5) attacks enemy at (9, 5) for 5 damage."
// "Missile tower at (5, 5) attacks enemy at (10, 5) for 5 damage."

In this example you can clearly see how Missile Tower extends the functionality of base tower using class inheritance

Last updated