adventofcode/2018/day24/combat.go

73 lines
1.3 KiB
Go

package main
import (
"fmt"
"sort"
)
type Battle struct {
immune []*Army
infect []*Army
}
func NewBattle(immune, infect []*Army) *Battle {
return &Battle{
immune: immune,
infect: infect,
}
}
func (b *Battle) PrintStatus() {
fmt.Println("Immune System:")
for _, v := range b.immune {
fmt.Printf("Group %d contains %d units\n", v.id, v.units)
}
fmt.Println("Infection:")
for _, v := range b.infect {
fmt.Printf("Group %d contains %d units\n", v.id, v.units)
}
}
// All Battle Logic is in here
func (b *Battle) Fight() {
allCombatants := append(b.immune, b.infect...)
sort.Sort(ByPower(allCombatants))
for k := len(allCombatants) - 1; k >= 0; k-- {
b.FindTargetFor(allCombatants[k])
}
if Debug {
fmt.Println("")
}
for k := len(allCombatants) - 1; k >= 0; k-- {
allCombatants[k].Fight()
}
i := 0
for _, x := range b.immune {
if x.units > 0 {
b.immune[i] = x
i++
}
}
b.immune = b.immune[:i]
i = 0
for _, x := range b.infect {
if x.units > 0 {
b.infect[i] = x
i++
}
}
b.infect = b.infect[:i]
}
func (b *Battle) FindTargetFor(a *Army) {
if a.tp == ArmyTypeImmune {
a.FindTarget(b.infect)
} else if a.tp == ArmyTypeInfection {
a.FindTarget(b.immune)
}
}
func (b *Battle) IsOver() bool {
return len(b.immune) == 0 || len(b.infect) == 0
}