From 426da8ac5e909ded2a26c377afcc7473788baf85 Mon Sep 17 00:00:00 2001 From: Rob O'Dwyer Date: Wed, 1 Jun 2022 15:21:27 -0700 Subject: [PATCH] reorder built-in ruleset stages so game over is checked first (#79) --- constrictor.go | 2 +- constrictor_test.go | 36 ------------------------------------ royale.go | 2 +- royale_test.go | 9 +++++++-- solo.go | 7 ++++++- standard.go | 2 +- wrapped.go | 2 +- 7 files changed, 17 insertions(+), 43 deletions(-) diff --git a/constrictor.go b/constrictor.go index 883140f..6f0a28f 100644 --- a/constrictor.go +++ b/constrictor.go @@ -1,6 +1,7 @@ package rules var constrictorRulesetStages = []string{ + StageGameOverStandard, StageMovementStandard, StageStarvationStandard, StageHazardDamageStandard, @@ -8,7 +9,6 @@ var constrictorRulesetStages = []string{ StageEliminationStandard, StageSpawnFoodNoFood, StageModifySnakesAlwaysGrow, - StageGameOverStandard, } type ConstrictorRuleset struct { diff --git a/constrictor_test.go b/constrictor_test.go index 37df6bc..6befbd7 100644 --- a/constrictor_test.go +++ b/constrictor_test.go @@ -2,48 +2,12 @@ package rules import ( "testing" - - "github.com/stretchr/testify/require" ) func TestConstrictorRulesetInterface(t *testing.T) { 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 // also checks: // - food removed diff --git a/royale.go b/royale.go index ddec548..806f7b6 100644 --- a/royale.go +++ b/royale.go @@ -5,13 +5,13 @@ import ( ) var royaleRulesetStages = []string{ + StageGameOverStandard, StageMovementStandard, StageStarvationStandard, StageHazardDamageStandard, StageFeedSnakesStandard, StageEliminationStandard, StageSpawnHazardsShrinkMap, - StageGameOverStandard, } type RoyaleRuleset struct { diff --git a/royale_test.go b/royale_test.go index 52d3174..d3e28e1 100644 --- a/royale_test.go +++ b/royale_test.go @@ -13,9 +13,14 @@ func TestRoyaleRulesetInterface(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} - _, err := r.CreateNextBoardState(boardState, []SnakeMove{{"", ""}}) + _, err := r.CreateNextBoardState(boardState, []SnakeMove{{"1", "right"}, {"2", "right"}}) require.Error(t, err) require.Equal(t, errors.New("royale game can't shrink more frequently than every turn"), err) diff --git a/solo.go b/solo.go index bf8b969..7ddbaea 100644 --- a/solo.go +++ b/solo.go @@ -1,12 +1,12 @@ package rules var soloRulesetStages = []string{ + StageGameOverSoloSnake, StageMovementStandard, StageStarvationStandard, StageHazardDamageStandard, StageFeedSnakesStandard, StageEliminationStandard, - StageGameOverSoloSnake, } 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) } +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) { return GameOverSolo(b, r.Settings(), nil) } diff --git a/standard.go b/standard.go index 28804e5..5bef8d7 100644 --- a/standard.go +++ b/standard.go @@ -14,12 +14,12 @@ type StandardRuleset struct { } var standardRulesetStages = []string{ + StageGameOverStandard, StageMovementStandard, StageStarvationStandard, StageHazardDamageStandard, StageFeedSnakesStandard, StageEliminationStandard, - StageGameOverStandard, } func (r *StandardRuleset) Name() string { return GameTypeStandard } diff --git a/wrapped.go b/wrapped.go index d2d7070..0b5a4c1 100644 --- a/wrapped.go +++ b/wrapped.go @@ -1,12 +1,12 @@ package rules var wrappedRulesetStages = []string{ + StageGameOverStandard, StageMovementWrapBoundaries, StageStarvationStandard, StageHazardDamageStandard, StageFeedSnakesStandard, StageEliminationStandard, - StageGameOverStandard, } type WrappedRuleset struct {