Комментарии 6
s — это переменная, отвечающая за цвет. Переход в другое состояние можно представить
следующей конструкцией
(define (traffic-light-next s) (cond [(string=? "red" s) "green"] [(string=? "green" s) "yellow"] [(string=? "yellow" s) "red"]))
Но ведь светлофор работает в режиме
Зеленый => Желтый => Красный => Желтый => повторить
А не в режиме
Зеленый => Желтый => Красный => повторить
То есть Зеленый и Красный переходят в Желтый. А вот Желтый может перейти и в Зеленый и в Красный.
Выглядит, словно вы подгоняете реальность под ограничения архитектуры. Ведь функцию только от текущего состояния написать легче, чем от текущего+предыдущего. И это на столь легком примере!
0
Кстати, я, конечно, понимаю, что в данном конкректном примере это очень легко пофиксить введя два разных «желтых»: «yellow-before-red» и «yellow-before-green» и машина состояний останется такой же простой, но это ведь абстрактный пример, а в играх очень редко бывает возможность обойтись таким простым решением.
0
Следующее состояние светофора основывается на нескольких предыдущих, поэтому нужно хранить список (хотя бы двух предыдущих) состояний и явно передавать его в функцию:
(define (next-state prev-states)
(let ((curr-state (first prev-states)))
(cond
((eqv? curr-state 'red) 'yellow)
((eqv? curr-state 'yellow)
(if (eqv? (second prev-states) 'red)
'green
'red))
((eqv? curr-state 'green) 'red)))
)
> (next-state '(yellow green))
;Value: red
> (next-state '(yellow red))
;Value: green
+1
Наверно правильнее именно иметь два разных желтых, поскольку для каждого состояния светофора нужно иметь разные паузы. Вполне возможно, что они для разных желтых бывают разные. Так что все в коде будет выглядеть красиво.
0
Почитать про Lisp и Scheme очень приятно, спасибо.
0
Любопытная статья. Вспомнилась замечательная игра Abuse, где в движок был встроен интерпретатор, а вся внутриигровая логика была реализована на лежащем в почти открытом видел LISP-е. Отдельные товарищи переписывали скролл-шутер в тетрис :)
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Публикации
Изменить настройки темы
Игры на Scheme(Lisp) в среде DrRacket