Пытаюсь сделать симулятор двери. С помощью ключей я могу изменить состояние двери, я посмотрел документацию в Racket. В основном речь идет о некоторых общих клавишах, таких как «вверх», «вниз», «влево», «вправо». Я хочу спросить, как я могу настроить ключи. Вот мои коды:
(define DOOR-OPEN-iamge)
(define DOOR-CLOSED-image)
(define DOOR-LOCKED-image)
(define DS-OPEN "open")
(define DS-CLOSED "closed")
(define DS-LOCKED "locked")
(define (door-simulator initial-ds)
(big-bang initial-ds
[to-draw draw-ds]
[on-key change]))
(check-expect (draw-ds DS-OPEN) DOOR-OPEN)
(check-expect (draw-ds DS-CLOSED) DOOR-CLOSED)
(check-expect (draw-ds DS-LOCKED) DOOR-LOCKED)
(define (draw-ds ds)
(cond
[(string=? ds DS-OPEN) DOOR-OPEN]
[(string=? ds DS-CLOSED) DOOR-CLOSED]
[(string=? ds DS-LOCKED) DOOR-LOCKED]))
;ключ для состояния двери
;"o"-ДВЕРЬ-ЗАКРЫТА => ДВЕРЬ-ОТКРЫТА
;"c"-ДВЕРЬ-ОТКРЫТА => ДВЕРЬ-ЗАКРЫТА
;"l"-DOOR-CLOSED => ДВЕРЬ-ЗАБЛОКИРОВАНА
;"u"-DOOR-LOCKED => DOOR-OPT
(check-expect (change DOOR-CLOSED) DOOR-OPEN)
(check-expect (change DOOR-OPEN) DOOR-CLOSED)
(check-expect (change DOOR-CLOSED) DOOR-LOCKED)
(check-expect (change DOOR-LOCKED) DOOR-OPEN)
(define (change w a-key)
(cond
[(key=? a-key "o") (draw-ds w)]
[(key=? a-key "c") (draw-ds w)]
[(key=? a-key "l") (draw-ds w)]
[(key=? a-key "u") (draw-ds w)]))
Кроме того, ключевая часть проверки ожидания не работала. Какие функции или переменные я должен использовать для этой части.
Пожалуйста, используйте форматирование кода Stack Overflow, и вам не нужны все эти пустые строки. Это значительно облегчит чтение.





Требовать эти библиотеки (planetcute просто содержит некоторые картинки для рисования, вы можете удалить их позже):
(require 2htdp/planetcute)
(require 2htdp/universe)
(require 2htdp/image)
Первые шесть определений не изменятся, я просто добавил несколько изображений из planetcute:
(define door-open chest-open)
(define door-closed chest-closed)
(define door-locked chest-lid)
(define ds-open "open")
(define ds-closed "closed")
(define ds-locked "locked")
Определение door-simulator не изменится:
(define (door-simulator initial-ds)
(big-bang initial-ds
[to-draw draw-ds]
[on-key change]))
draw-ds преобразует состояние в изображение и рисует его на фоне с помощью place-image:
(define (ds->image ds)
(cond ((string=? ds ds-open) door-open)
((string=? ds ds-closed) door-closed)
((string=? ds ds-locked) door-locked)
(#true door-open)))
(define bg (rectangle 500 500 "solid" "white"))
(define (draw-ds state)
(place-image (ds->image state) 50 50 bg))
Функция change не будет вызывать draw-ds, а просто вернет новое состояние на основе текущего состояния и ключа:
(define (change state a-key)
(cond
[(and (key=? a-key "o")
(string=? state ds-closed))
ds-open]
[(and (key=? a-key "c")
(string=? state ds-open))
ds-closed]
[(and (key=? a-key "l")
(string=? state ds-closed))
ds-locked]
[(and (key=? a-key "u")
(string=? state ds-locked)) ds-open]
(#true state)))
Возможно, вам придется изменить порядок этих определений, затем запустить анимацию с помощью (door-simulator ds-closed) и нажать несколько клавиш (o, c...).
changeпринимает аргументы WorldState и KeyEvent (т.е. String) и создает WorldState (значение «DS-»). Так чтоchangeне звонитdraw-ds(толькоbig-bangзвонитdraw-ds). Чек-ожидание изменений выглядит так:(check-expect (change DS-CLOSED "o") DS-OPEN)