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