package game import ( "golang.org/x/exp/slices" ) // A WinCondition determines if there are winners using the current game state. type WinCondition func(*LocalState) []*Player // DummyWinCondition always return an empty winner slice. func DummyWinCondition(*LocalState) []*Player { return []*Player{} } // KingGame reports the winners of a game using kings. func KingGame(s *LocalState) []*Player { foundKings := map[*Player]struct{}{} for _, u := range s.Units() { if u.card.Name != "King" { continue } foundKings[u.owner] = struct{}{} } if len(foundKings) == len(s.Players()) { return []*Player{} } loosers := make([]*Player, 0, len(s.Players())) copy(loosers, s.Players()) for p := range foundKings { i := slices.Index(loosers, p) loosers[i] = loosers[len(loosers)-1] loosers = loosers[:len(loosers)-1] } winners := []*Player{} for _, p := range s.Players() { if !slices.Contains(loosers, p) { winners = append(winners, p) } } return winners }