aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Fischer <florian.fischer@muhq.space>2025-08-19 14:33:48 +0200
committerFlorian Fischer <florian.fischer@muhq.space>2025-08-20 14:46:13 +0200
commit225d31b0db1f88a1aa94bb83e98c543bad8e609d (patch)
tree401b2e882c9dabe9fa8a8a394bf62c33c9ed0bbc
parent8df8a477f7c3091f87127246b4703f6a2424808e (diff)
downloadmuhqs-game-225d31b0db1f88a1aa94bb83e98c543bad8e609d.tar.gz
muhqs-game-225d31b0db1f88a1aa94bb83e98c543bad8e609d.zip
fix king game wincondition and add draw special case
-rw-r--r--go/game/winCondition.go6
-rw-r--r--go/game/winCondition_test.go40
2 files changed, 45 insertions, 1 deletions
diff --git a/go/game/winCondition.go b/go/game/winCondition.go
index ded9b0ca..ec6a76e4 100644
--- a/go/game/winCondition.go
+++ b/go/game/winCondition.go
@@ -27,7 +27,7 @@ func KingGame(s *LocalState) []*Player {
return []*Player{}
}
- loosers := make([]*Player, 0, len(s.Players()))
+ loosers := make([]*Player, 2, len(s.Players()))
copy(loosers, s.Players())
for p := range foundKings {
i := slices.Index(loosers, p)
@@ -35,6 +35,10 @@ func KingGame(s *LocalState) []*Player {
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) {
diff --git a/go/game/winCondition_test.go b/go/game/winCondition_test.go
new file mode 100644
index 00000000..4ecd472e
--- /dev/null
+++ b/go/game/winCondition_test.go
@@ -0,0 +1,40 @@
+package game
+
+import (
+ "testing"
+
+ "golang.org/x/exp/slices"
+)
+
+func TestKingGame(t *testing.T) {
+ s := NewLocalState()
+ s.SetMap(newEmpty2x2Map())
+ s._map.WinCondition = KingGame
+ p := s.AddNewPlayer("p", NewDeck())
+ k1 := s.addNewUnit(NewCard("misc/king"), Position{0, 0}, p)
+ o := s.AddNewPlayer("o", NewDeck())
+ k2 := s.addNewUnit(NewCard("misc/king"), Position{1, 1}, o)
+
+ w := s._map.WinCondition(s)
+ if len(w) != 0 {
+ t.Fatal("winners declared with two kings")
+ }
+
+ s.destroyPermanent(k2)
+ w = s._map.WinCondition(s)
+ if len(w) != 1 {
+ t.Fatal("winner not declared", w)
+ }
+ if w[0] != p {
+ t.Fatal("p is not the winner", w)
+ }
+
+ s.destroyPermanent(k1)
+ w = s._map.WinCondition(s)
+ if len(w) != 2 {
+ t.Fatal("winners not declared", w)
+ }
+ if !slices.Contains(w, p) || !slices.Contains(w, o) {
+ t.Fatal("p or o is not a winner", w)
+ }
+}