interface Weapon {
var power: Int
fun fire(): Int
}
interface Shield {
var power: Int
fun absorb(damage: Int): Int
}
interface Spaceship {
val name: String
val weapon: Weapon
val shield: Shield
var isDestroyed: Boolean
fun takeDamage(damage: Int)
}
interface BattleSimulator {
fun simulate(federation1: Spaceship, federation2: Spaceship, romulan1: Spaceship, romulan2: Spaceship)
}
interface BattleReporter {
fun reportBattle(federation1: Spaceship, federation2: Spaceship, romulan1: Spaceship, romulan2: Spaceship)
}
class Phaser(override var power: Int) : Weapon {
override fun fire(): Int {
val damage = maxOf(power / 10, 1)
power -= damage
return damage
}
}
class DeflectorShield(override var power: Int) : Shield {
override fun absorb(damage: Int): Int {
val absorbed = minOf(power, damage)
power -= absorbed
return damage - absorbed
}
}
abstract class AbstractSpaceship(
override val name: String,
weaponPower: Int,
shieldPower: Int
) : Spaceship {
override val weapon = Phaser(weaponPower)
override val shield = DeflectorShield(shieldPower)
override var isDestroyed = false
private var hullStrength = 100
override fun takeDamage(damage: Int) {
val remainingDamage = shield.absorb(damage)
hullStrength -= remainingDamage
if (hullStrength <= 0) {
isDestroyed = true
}
}
}
class SpaceBattleSimulator : BattleSimulator {
override fun simulate(federation1: Spaceship, federation2: Spaceship, romulan1: Spaceship, romulan2: Spaceship) {
// Simulate 5 rounds of battle
repeat(5) {
// Federation ships attack Romulan ships
if (!federation1.isDestroyed && !romulan1.isDestroyed) {
romulan1.takeDamage(federation1.weapon.fire())
}
if (!federation2.isDestroyed && !romulan2.isDestroyed) {
romulan2.takeDamage(federation2.weapon.fire())
}
// Romulan ships attack Federation ships
if (!romulan1.isDestroyed && !federation1.isDestroyed) {
federation1.takeDamage(romulan1.weapon.fire())
}
if (!romulan2.isDestroyed && !federation2.isDestroyed) {
federation2.takeDamage(romulan2.weapon.fire())
}
}
}
}
class BattleReport : BattleReporter {
override fun reportBattle(federation1: Spaceship, federation2: Spaceship, romulan1: Spaceship, romulan2: Spaceship) {
println("Battle Report:")
printShipStatus("Federation", federation1)
printShipStatus("Federation", federation2)
printShipStatus("Romulan", romulan1)
printShipStatus("Romulan", romulan2)
val fedSurvivors = listOf(federation1, federation2).count { !it.isDestroyed }
val romSurvivors = listOf(romulan1, romulan2).count { !it.isDestroyed }
println("\nBattle Outcome:")
when {
fedSurvivors > romSurvivors -> println("Federation Victory!")
romSurvivors > fedSurvivors -> println("Romulan Victory!")
else -> println("It's a draw!")
}
}
private fun printShipStatus(fleetName: String, ship: Spaceship) {
val status = if (ship.isDestroyed) "Destroyed" else "Operational"
println("$fleetName ${ship.name}: $status (Shield: ${ship.shield.power}, Weapon: ${ship.weapon.power})")
}
}
fun main() {
// Create the 2 Federation and the 2 Romulan Ships
// Run the simulation
// Create the battle results report.
}