reorder built-in ruleset stages so game over is checked first (#79)
This commit is contained in:
parent
f0dc0bcb38
commit
426da8ac5e
7 changed files with 17 additions and 43 deletions
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
||||||
7
solo.go
7
solo.go
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 }
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue