Pull to refresh

Comments 6

s — это переменная, отвечающая за цвет. Переход в другое состояние можно представить
следующей конструкцией
(define (traffic-light-next s)
  (cond
    [(string=? "red" s) "green"]
    [(string=? "green" s) "yellow"]
    [(string=? "yellow" s) "red"]))

Но ведь светлофор работает в режиме
Зеленый => Желтый => Красный =>  Желтый => повторить

А не в режиме
Зеленый => Желтый => Красный => повторить


То есть Зеленый и Красный переходят в Желтый. А вот Желтый может перейти и в Зеленый и в Красный.

Выглядит, словно вы подгоняете реальность под ограничения архитектуры. Ведь функцию только от текущего состояния написать легче, чем от текущего+предыдущего. И это на столь легком примере!
Кстати, я, конечно, понимаю, что в данном конкректном примере это очень легко пофиксить введя два разных «желтых»: «yellow-before-red» и «yellow-before-green» и машина состояний останется такой же простой, но это ведь абстрактный пример, а в играх очень редко бывает возможность обойтись таким простым решением.

Следующее состояние светофора основывается на нескольких предыдущих, поэтому нужно хранить список (хотя бы двух предыдущих) состояний и явно передавать его в функцию:


(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
Наверно правильнее именно иметь два разных желтых, поскольку для каждого состояния светофора нужно иметь разные паузы. Вполне возможно, что они для разных желтых бывают разные. Так что все в коде будет выглядеть красиво.
Почитать про Lisp и Scheme очень приятно, спасибо.
Любопытная статья. Вспомнилась замечательная игра Abuse, где в движок был встроен интерпретатор, а вся внутриигровая логика была реализована на лежащем в почти открытом видел LISP-е. Отдельные товарищи переписывали скролл-шутер в тетрис :)
Sign up to leave a comment.

Articles