Royale: Shrink a random edge instead of the whole board

This commit is contained in:
Brad Van Vugt 2020-07-29 10:24:38 -07:00
parent 2ca57f0779
commit 64dfc6dd55
2 changed files with 119 additions and 16 deletions

View file

@ -23,6 +23,17 @@ func TestRoyaleDefaultSanity(t *testing.T) {
require.NoError(t, err)
}
func TestRoyaleOutOfBoundsNoSnakes(t *testing.T) {
b := &BoardState{}
r := RoyaleRuleset{
ShrinkEveryNTurns: 10,
DamagePerTurn: 10,
}
err := r.populateOutOfBounds(b, 100)
require.Equal(t, errors.New("royale mode requires at least one snake id"), err)
}
func TestRoyaleOutOfBounds(t *testing.T) {
tests := []struct {
Width int32
@ -39,24 +50,48 @@ func TestRoyaleOutOfBounds(t *testing.T) {
{Width: 3, Height: 3, Turn: 9, ShrinkEveryNTurns: 10, ExpectedOutOfBounds: []Point{}},
{
Width: 3, Height: 3, Turn: 10, ShrinkEveryNTurns: 10,
ExpectedOutOfBounds: []Point{{0, 0}, {0, 1}, {0, 2}, {1, 0}, {1, 2}, {2, 0}, {2, 1}, {2, 2}},
ExpectedOutOfBounds: []Point{{0, 0}, {0, 1}, {0, 2}},
},
{
Width: 3, Height: 3, Turn: 11, ShrinkEveryNTurns: 10,
ExpectedOutOfBounds: []Point{{0, 0}, {0, 1}, {0, 2}, {1, 0}, {1, 2}, {2, 0}, {2, 1}, {2, 2}},
ExpectedOutOfBounds: []Point{{0, 0}, {0, 1}, {0, 2}},
},
{
Width: 3, Height: 3, Turn: 19, ShrinkEveryNTurns: 10,
ExpectedOutOfBounds: []Point{{0, 0}, {0, 1}, {0, 2}, {1, 0}, {1, 2}, {2, 0}, {2, 1}, {2, 2}},
ExpectedOutOfBounds: []Point{{0, 0}, {0, 1}, {0, 2}},
},
{
Width: 3, Height: 3, Turn: 20, ShrinkEveryNTurns: 10,
ExpectedOutOfBounds: []Point{{0, 0}, {0, 1}, {0, 2}, {1, 2}, {2, 2}},
},
{
Width: 3, Height: 3, Turn: 31, ShrinkEveryNTurns: 10,
ExpectedOutOfBounds: []Point{{0, 0}, {0, 1}, {0, 2}, {1, 0}, {1, 1}, {1, 2}, {2, 2}},
},
{
Width: 3, Height: 3, Turn: 42, ShrinkEveryNTurns: 10,
ExpectedOutOfBounds: []Point{{0, 0}, {0, 1}, {0, 2}, {1, 0}, {1, 1}, {1, 2}, {2, 0}, {2, 2}},
},
{
Width: 3, Height: 3, Turn: 53, ShrinkEveryNTurns: 10,
ExpectedOutOfBounds: []Point{{0, 0}, {0, 1}, {0, 2}, {1, 0}, {1, 1}, {1, 2}, {2, 0}, {2, 1}, {2, 2}},
},
{
Width: 3, Height: 3, Turn: 64, ShrinkEveryNTurns: 10,
ExpectedOutOfBounds: []Point{{0, 0}, {0, 1}, {0, 2}, {1, 0}, {1, 1}, {1, 2}, {2, 0}, {2, 1}, {2, 2}},
},
{
Width: 3, Height: 3, Turn: 6987, ShrinkEveryNTurns: 10,
ExpectedOutOfBounds: []Point{{0, 0}, {0, 1}, {0, 2}, {1, 0}, {1, 1}, {1, 2}, {2, 0}, {2, 1}, {2, 2}},
},
}
for _, test := range tests {
b := &BoardState{Width: test.Width, Height: test.Height}
b := &BoardState{
Width: test.Width,
Height: test.Height,
Snakes: []Snake{{ID: "test-snake"}},
}
r := RoyaleRuleset{
Turn: test.Turn,
ShrinkEveryNTurns: test.ShrinkEveryNTurns,
@ -174,38 +209,68 @@ func TestRoyaleDamagePerTurn(t *testing.T) {
}
func TestRoyalDamageNextTurn(t *testing.T) {
b := &BoardState{Width: 10, Height: 10, Snakes: []Snake{{ID: "one", Health: 100, Body: []Point{{1, 1}}}}}
r := RoyaleRuleset{Turn: 10, ShrinkEveryNTurns: 10, DamagePerTurn: 30}
b := &BoardState{Width: 10, Height: 10, Snakes: []Snake{{ID: "one", Health: 100, Body: []Point{{1, 0}}}}}
r := RoyaleRuleset{ShrinkEveryNTurns: 10, DamagePerTurn: 30}
m := []SnakeMove{{ID: "one", Move: "right"}}
r.Turn = 10
n, err := r.CreateNextBoardState(b, m)
require.NoError(t, err)
require.Equal(t, NotEliminated, n.Snakes[0].EliminatedCause)
require.Equal(t, int32(99), n.Snakes[0].Health)
require.Equal(t, Point{2, 1}, n.Snakes[0].Body[0])
require.Equal(t, 36, len(r.OutOfBounds))
require.Equal(t, Point{2, 0}, n.Snakes[0].Body[0])
require.Equal(t, 10, len(r.OutOfBounds)) // X = 0
r.Turn = 20
n, err = r.CreateNextBoardState(b, m)
require.NoError(t, err)
require.Equal(t, NotEliminated, n.Snakes[0].EliminatedCause)
require.Equal(t, int32(99), n.Snakes[0].Health)
require.Equal(t, Point{2, 1}, n.Snakes[0].Body[0])
require.Equal(t, 64, len(r.OutOfBounds))
require.Equal(t, Point{2, 0}, n.Snakes[0].Body[0])
require.Equal(t, 19, len(r.OutOfBounds)) // Y = 0
r.Turn = 21
n, err = r.CreateNextBoardState(b, m)
require.NoError(t, err)
require.Equal(t, NotEliminated, n.Snakes[0].EliminatedCause)
require.Equal(t, int32(69), n.Snakes[0].Health)
require.Equal(t, Point{2, 1}, n.Snakes[0].Body[0])
require.Equal(t, 64, len(r.OutOfBounds))
require.Equal(t, Point{2, 0}, n.Snakes[0].Body[0])
require.Equal(t, 19, len(r.OutOfBounds))
b.Snakes[0].Health = 15
n, err = r.CreateNextBoardState(b, m)
require.NoError(t, err)
require.Equal(t, EliminatedByStarvation, n.Snakes[0].EliminatedCause)
require.Equal(t, int32(0), n.Snakes[0].Health)
require.Equal(t, Point{2, 1}, n.Snakes[0].Body[0])
require.Equal(t, 64, len(r.OutOfBounds))
require.Equal(t, Point{2, 0}, n.Snakes[0].Body[0])
require.Equal(t, 19, len(r.OutOfBounds))
}
func TestRoyalGetRandGenerator(t *testing.T) {
tests := []struct {
SnakeIDs []string
Error error
firstInt int
}{
{[]string{}, errors.New("royale mode requires at least one snake id"), 0},
{[]string{"1"}, nil, 1400170195406563237},
{[]string{"1", "2", "3", "4", "5"}, nil, 1400170195406563237},
{[]string{"5", "4", "3", "2", "1"}, nil, 1400170195406563237},
{[]string{"3", "4", "1", "5", "2"}, nil, 1400170195406563237},
{[]string{"3", "4", "5", "2"}, nil, 5139088052943840554},
}
for _, test := range tests {
b := &BoardState{}
for _, id := range test.SnakeIDs {
b.Snakes = append(b.Snakes, Snake{ID: id})
}
r := RoyaleRuleset{}
generator, err := r.getRandGenerator(b)
require.Equal(t, test.Error, err)
if err == nil {
require.Equal(t, test.firstInt, generator.Int())
}
}
}