aboutsummaryrefslogtreecommitdiff
path: root/go/game/winCondition.go
diff options
context:
space:
mode:
Diffstat (limited to 'go/game/winCondition.go')
-rw-r--r--go/game/winCondition.go107
1 files changed, 66 insertions, 41 deletions
diff --git a/go/game/winCondition.go b/go/game/winCondition.go
index ec6a76e4..a0728e60 100644
--- a/go/game/winCondition.go
+++ b/go/game/winCondition.go
@@ -5,56 +5,81 @@ import (
)
// A WinCondition determines if there are winners using the current game state.
-type WinCondition func(*LocalState) []*Player
+type WinCondition interface {
+ check(*LocalState) []*Player
+ String() string
+}
+
+type winCondition struct {
+ condition func(*LocalState) []*Player
+ desc string
+}
+
+func (w *winCondition) check(s *LocalState) []*Player {
+ return w.condition(s)
+}
+
+func (w *winCondition) String() string {
+ return w.desc
+}
// DummyWinCondition always return an empty winner slice.
-func DummyWinCondition(*LocalState) []*Player {
- return []*Player{}
+var DummyWinCondition = &winCondition{
+ condition: func(*LocalState) []*Player {
+ return []*Player{}
+ },
+ desc: "dummy wincondition",
}
-// 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
+// KingGame reports all players without an enemy king.
+var KingGame = &winCondition{
+ condition: func(s *LocalState) []*Player {
+ foundKings := map[*Player]struct{}{}
+ for _, u := range s.Units() {
+ if u.card.Name != "King" {
+ continue
+ }
+
+ foundKings[u.owner] = struct{}{}
}
- foundKings[u.owner] = struct{}{}
- }
+ if len(foundKings) == len(s.Players()) {
+ return []*Player{}
+ }
- if len(foundKings) == len(s.Players()) {
- return []*Player{}
- }
-
- loosers := make([]*Player, 2, 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]
- }
-
- if len(loosers) == len(s.Players()) {
- return s.Players()
- }
-
- winners := []*Player{}
- for _, p := range s.Players() {
- if !slices.Contains(loosers, p) {
- winners = append(winners, p)
+ loosers := make([]*Player, 2, 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]
+ }
+
+ if len(loosers) == len(s.Players()) {
+ return s.Players()
+ }
+
+ winners := []*Player{}
+ for _, p := range s.Players() {
+ if !slices.Contains(loosers, p) {
+ winners = append(winners, p)
+ }
}
- }
- return winners
+ return winners
+ },
+ desc: "Destroy the enemy King",
}
-// DeathMatch returns the players without enemy &nits.
-func DeathMatch(s *LocalState) []*Player {
- winners := []*Player{}
- for _, p := range s.players {
- if len(s.EnemyUnits(p)) == 0 {
- winners = append(winners, p)
+// DeathMatch returns the players without enemy units.
+var DeathMatch = &winCondition{
+ condition: func(s *LocalState) []*Player {
+ winners := []*Player{}
+ for _, p := range s.players {
+ if len(s.EnemyUnits(p)) == 0 {
+ winners = append(winners, p)
+ }
}
- }
- return winners
+ return winners
+ },
+ desc: "Destroy all enemy units",
}