@Maxim_Samburskiy

Как изменять state с разной продолжительностью?

Необходимо придумать алгоритм, переключающий state с разной переодичностью. Счётчик доходит до некого лимита steps и переключается на следующий state, а затем, дойдя до последнего, переключается на первый и начинает всё сначала. Должно работать примерно так:

// state=1, 4 steps
update()
update()
update()
update()
// state=2, 2 steps
update()
update()
// state=3, 3 steps
update()
update()
update()
// state=1, 4 steps
update()
update()
update()
update()
// ...

Такое решение не рассматривается:

states := []int{1, 1, 1, 1, 2, 2, 3, 3, 3} // 1, 2 и 3 состояния

for i := 0; ; i++ {
    state := states[i%9]
}

Из-за переполнения счётчика и большого объема массива states (в примере сильно сокращён)
  • Вопрос задан
  • 242 просмотра
Решения вопроса 1
uvelichitel
@uvelichitel Куратор тега Go
habrahabr.ru/users/uvelichitel
Наверное что нибудь такое? Оно работает play.golang.org/p/Zo3jD2T8j8
type State struct {
	state  int
	step   int
	states []int
}
func NewState(states []int) *State {
	return &State{
		0,
		states[0],
		states,
	}
}
func (s *State) update() {
	if s.step > 0 {
		s.step--
		fmt.Println("step=", s.step) //do something
	} else {
		s.changestate()
		fmt.Println("state=", s.state) //do something else
	}
}
func (s *State) changestate() {
	if s.state < len(s.states)-1 {
		s.state++
	} else {
		s.state = 0
	}
	s.step = s.states[s.state]
}
func main() {
	st := NewState([]int{4, 2, 3, 4})
	st.update()
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
bitver
@bitver
Вы сами же описали два цикла, один (что шаги считает) внутри другого (что крутит бесконечно по состояниям).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы