diff --git a/game/game.go b/game/game.go index 6d509be..86d85b7 100644 --- a/game/game.go +++ b/game/game.go @@ -163,6 +163,21 @@ func (g *Game) Shoot(id player.ID, self bool) error { return nil } +// Concede sets the player with the given ID to zero health. The returned +// Boolean indicates whether the game has ended. (It will be false if id does +// not correspond to either player.) +func (g *Game) Concede(id player.ID) bool { + switch id { + case g.players[0].id: + g.players[0].hp = 0 + case g.players[1].id: + g.players[1].hp = 0 + default: + return false + } + return true +} + // DTO returns the current game state as viewed by the given player. func (g *Game) DTO(id player.ID) serve.Game { return serve.Game{ diff --git a/game/game_test.go b/game/game_test.go index a67e95d..e330b16 100644 --- a/game/game_test.go +++ b/game/game_test.go @@ -405,6 +405,42 @@ func TestGameShoot(t *testing.T) { } } +func TestConcede(t *testing.T) { + dealer, chall := player.ID{1}, player.ID{2} + cases := []struct { + name string + p player.ID + winner player.ID + }{ + { + name: "dealer", + p: dealer, + winner: chall, + }, + { + name: "challenger", + p: chall, + winner: dealer, + }, + { + name: "neither", + p: player.ID{3}, + winner: player.ID{}, + }, + } + for _, c := range cases { + c := c + t.Run(c.name, func(t *testing.T) { + t.Parallel() + g := New(dealer, chall) + g.Concede(c.p) + if got := g.Winner(); deref(got).id != c.winner { + t.Errorf("wrong winner: %#v doesn't have id %#v", got, c.winner) + } + }) + } +} + func TestGameShellCounts(t *testing.T) { cases := []struct { name string