reorder built-in ruleset stages so game over is checked first (#79)

This commit is contained in:
Rob O'Dwyer 2022-06-01 15:21:27 -07:00 committed by GitHub
parent f0dc0bcb38
commit 426da8ac5e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 17 additions and 43 deletions

View file

@ -1,6 +1,7 @@
package rules package rules
var constrictorRulesetStages = []string{ var constrictorRulesetStages = []string{
StageGameOverStandard,
StageMovementStandard, StageMovementStandard,
StageStarvationStandard, StageStarvationStandard,
StageHazardDamageStandard, StageHazardDamageStandard,
@ -8,7 +9,6 @@ var constrictorRulesetStages = []string{
StageEliminationStandard, StageEliminationStandard,
StageSpawnFoodNoFood, StageSpawnFoodNoFood,
StageModifySnakesAlwaysGrow, StageModifySnakesAlwaysGrow,
StageGameOverStandard,
} }
type ConstrictorRuleset struct { type ConstrictorRuleset struct {

View file

@ -2,48 +2,12 @@ package rules
import ( import (
"testing" "testing"
"github.com/stretchr/testify/require"
) )
func TestConstrictorRulesetInterface(t *testing.T) { func TestConstrictorRulesetInterface(t *testing.T) {
var _ Ruleset = (*ConstrictorRuleset)(nil) var _ Ruleset = (*ConstrictorRuleset)(nil)
} }
func TestConstrictorModifyInitialBoardState(t *testing.T) {
tests := []struct {
Height int
Width int
IDs []string
}{
{1, 1, []string{}},
{1, 1, []string{"one"}},
{2, 2, []string{"one"}},
{2, 2, []string{"one", "two"}},
{11, 1, []string{"one", "two"}},
{11, 11, []string{}},
{11, 11, []string{"one", "two", "three", "four", "five"}},
}
r := ConstrictorRuleset{}
for testNum, test := range tests {
state, err := CreateDefaultBoardState(MaxRand, test.Width, test.Height, test.IDs)
require.NoError(t, err)
require.NotNil(t, state)
state, err = r.ModifyInitialBoardState(state)
require.NoError(t, err)
require.NotNil(t, state)
require.Equal(t, test.Width, state.Width)
require.Equal(t, test.Height, state.Height)
require.Len(t, state.Food, 0, testNum)
// Verify snakes
require.Equal(t, len(test.IDs), len(state.Snakes))
for i, id := range test.IDs {
require.Equal(t, id, state.Snakes[i].ID)
require.Equal(t, state.Snakes[i].Body[2], state.Snakes[i].Body[1])
}
}
}
// Test that two equal snakes collide and both get eliminated // Test that two equal snakes collide and both get eliminated
// also checks: // also checks:
// - food removed // - food removed

View file

@ -5,13 +5,13 @@ import (
) )
var royaleRulesetStages = []string{ var royaleRulesetStages = []string{
StageGameOverStandard,
StageMovementStandard, StageMovementStandard,
StageStarvationStandard, StageStarvationStandard,
StageHazardDamageStandard, StageHazardDamageStandard,
StageFeedSnakesStandard, StageFeedSnakesStandard,
StageEliminationStandard, StageEliminationStandard,
StageSpawnHazardsShrinkMap, StageSpawnHazardsShrinkMap,
StageGameOverStandard,
} }
type RoyaleRuleset struct { type RoyaleRuleset struct {

View file

@ -13,9 +13,14 @@ func TestRoyaleRulesetInterface(t *testing.T) {
} }
func TestRoyaleDefaultSanity(t *testing.T) { func TestRoyaleDefaultSanity(t *testing.T) {
boardState := &BoardState{} boardState := &BoardState{
Snakes: []Snake{
{ID: "1", Body: []Point{{X: 0, Y: 0}}},
{ID: "2", Body: []Point{{X: 0, Y: 1}}},
},
}
r := RoyaleRuleset{StandardRuleset: StandardRuleset{HazardDamagePerTurn: 1}, ShrinkEveryNTurns: 0} r := RoyaleRuleset{StandardRuleset: StandardRuleset{HazardDamagePerTurn: 1}, ShrinkEveryNTurns: 0}
_, err := r.CreateNextBoardState(boardState, []SnakeMove{{"", ""}}) _, err := r.CreateNextBoardState(boardState, []SnakeMove{{"1", "right"}, {"2", "right"}})
require.Error(t, err) require.Error(t, err)
require.Equal(t, errors.New("royale game can't shrink more frequently than every turn"), err) require.Equal(t, errors.New("royale game can't shrink more frequently than every turn"), err)

View file

@ -1,12 +1,12 @@
package rules package rules
var soloRulesetStages = []string{ var soloRulesetStages = []string{
StageGameOverSoloSnake,
StageMovementStandard, StageMovementStandard,
StageStarvationStandard, StageStarvationStandard,
StageHazardDamageStandard, StageHazardDamageStandard,
StageFeedSnakesStandard, StageFeedSnakesStandard,
StageEliminationStandard, StageEliminationStandard,
StageGameOverSoloSnake,
} }
type SoloRuleset struct { type SoloRuleset struct {
@ -19,6 +19,11 @@ func (r SoloRuleset) Execute(bs *BoardState, s Settings, sm []SnakeMove) (bool,
return NewPipeline(soloRulesetStages...).Execute(bs, s, sm) return NewPipeline(soloRulesetStages...).Execute(bs, s, sm)
} }
func (r *SoloRuleset) CreateNextBoardState(prevState *BoardState, moves []SnakeMove) (*BoardState, error) {
_, nextState, err := r.Execute(prevState, r.Settings(), moves)
return nextState, err
}
func (r *SoloRuleset) IsGameOver(b *BoardState) (bool, error) { func (r *SoloRuleset) IsGameOver(b *BoardState) (bool, error) {
return GameOverSolo(b, r.Settings(), nil) return GameOverSolo(b, r.Settings(), nil)
} }

View file

@ -14,12 +14,12 @@ type StandardRuleset struct {
} }
var standardRulesetStages = []string{ var standardRulesetStages = []string{
StageGameOverStandard,
StageMovementStandard, StageMovementStandard,
StageStarvationStandard, StageStarvationStandard,
StageHazardDamageStandard, StageHazardDamageStandard,
StageFeedSnakesStandard, StageFeedSnakesStandard,
StageEliminationStandard, StageEliminationStandard,
StageGameOverStandard,
} }
func (r *StandardRuleset) Name() string { return GameTypeStandard } func (r *StandardRuleset) Name() string { return GameTypeStandard }

View file

@ -1,12 +1,12 @@
package rules package rules
var wrappedRulesetStages = []string{ var wrappedRulesetStages = []string{
StageGameOverStandard,
StageMovementWrapBoundaries, StageMovementWrapBoundaries,
StageStarvationStandard, StageStarvationStandard,
StageHazardDamageStandard, StageHazardDamageStandard,
StageFeedSnakesStandard, StageFeedSnakesStandard,
StageEliminationStandard, StageEliminationStandard,
StageGameOverStandard,
} }
type WrappedRuleset struct { type WrappedRuleset struct {