有限状态机实现

This commit is contained in:
kercylan98 2023-05-26 10:49:16 +08:00
parent 005586b64a
commit 3d60ac6485
5 changed files with 110 additions and 0 deletions

2
.gitignore vendored
View File

@ -164,3 +164,5 @@ Network Trash Folder
Temporary Items Temporary Items
.apdisk .apdisk
.refer
.refer/*

49
game/builtin/fsm.go Normal file
View File

@ -0,0 +1,49 @@
package builtin
import (
"fmt"
"github.com/kercylan98/minotaur/game"
)
func NewFSM[State comparable, Data any](data Data) *FSM[State, Data] {
return &FSM[State, Data]{
states: map[State]game.FSMState[State, Data]{},
data: data,
}
}
type FSM[State comparable, Data any] struct {
current State
data Data
states map[State]game.FSMState[State, Data]
}
func (slf *FSM[State, Data]) Update() {
state := slf.states[slf.current]
state.Update(slf.data)
}
func (slf *FSM[State, Data]) Register(state game.FSMState[State, Data]) {
slf.states[state.GetState()] = state
}
func (slf *FSM[State, Data]) Unregister(state State) {
delete(slf.states, state)
}
func (slf *FSM[State, Data]) HasState(state State) bool {
_, has := slf.states[state]
return has
}
func (slf *FSM[State, Data]) Change(state State) {
current := slf.states[slf.current]
current.Exit(slf.data)
next := slf.states[state]
if next == nil {
panic(fmt.Errorf("FSM object is attempting to switch to an invalid / undefined state: %v", state))
}
next.Enter(slf.data)
}

34
game/builtin/fsm_state.go Normal file
View File

@ -0,0 +1,34 @@
package builtin
import "github.com/kercylan98/minotaur/game"
func NewFSMState[State comparable, Data any](state State, enter game.FSMStateEnterHandle[Data], update game.FSMStateUpdateHandle[Data], exit game.FSMStateExitHandle[Data]) *FSMState[State, Data] {
return &FSMState[State, Data]{
enter: enter,
update: update,
exit: exit,
}
}
type FSMState[State comparable, Data any] struct {
state State
enter game.FSMStateEnterHandle[Data]
update game.FSMStateUpdateHandle[Data]
exit game.FSMStateExitHandle[Data]
}
func (slf *FSMState[State, Data]) GetState() State {
return slf.state
}
func (slf *FSMState[State, Data]) Enter(data Data) {
slf.enter(data)
}
func (slf *FSMState[State, Data]) Update(data Data) {
slf.update(data)
}
func (slf *FSMState[State, Data]) Exit(data Data) {
slf.exit(data)
}

10
game/fsm.go Normal file
View File

@ -0,0 +1,10 @@
package game
// FSM 有限状态机
type FSM[State comparable, Data comparable] interface {
Update()
Register(state FSMState[State, Data])
Unregister(state State)
HasState(state State) bool
Change(state State)
}

15
game/fsm_state.go Normal file
View File

@ -0,0 +1,15 @@
package game
type (
FSMStateEnterHandle[Data any] func(data Data)
FSMStateUpdateHandle[Data any] func(data Data)
FSMStateExitHandle[Data any] func(data Data)
)
// FSMState 有限状态机状态
type FSMState[State comparable, Data any] interface {
GetState() State
Enter(data Data)
Update(data Data)
Exit(data Data)
}