Я действительно зацикливаюсь на чем-то, и я постараюсь правильно рассказать о своих вопросах, надеюсь, вы поймете. Это может быть немного долго, поэтому прежде всего спасибо вам, чтобы тратить время на это.Достижение определенного элемента в define-struct
Я пытаюсь создать игру, имя которой «То же» в версии Racket 5.0.2.
Вот объяснение игры: http://download.racket-lang.org/docs/5.0.2/html/games/same.html?q=games
Я создал таблицу с дисками и нарисовать его:
a: width
b: height
r: radius
(define (color x) ///for random colors
(cond [(< (random x) 100) 'blue]
[(< (random x) 200) 'purple]
[(< (random x) 300) 'yellow]
[(< (random x) 400) 'red]
[else 'green]))
(define-struct top (coord color))
(define (row x y)
(if (> x (- a r)) empty
(cons (make-top (make-posn x y)(color 500)) (row (+ x (* 2 r)) y))))
(define (draw-row L)
(if (empty? L) #f
(and
(draw-solid-disk (top-coord (first L)) r (top-color (first L)))
(draw-row (rest L)))))
(define (board x y)
(if (> y (- b r)) empty
(cons (row x y) (board x (+ y (* 2 r))))))
(for-each draw-row (board 20 20))
Так что я имею 200 дисков со случайными цветами ... (Есть 20 дисков в каждой строке)
Вот мои самые большие проблемы:
1) Для того, чтобы удалить диск, игрок будет вводить конкретную строку d столбец. Будут ли у меня условия для каждого выбора?
if line=1 and column=1, delete this disk and its same colored adjacent disks
if line=5 and column=7, delete that disk and its same colored adjacent disks
Я надеюсь, что у вас есть какие-то проще, альтернативные пути, потому что это выглядит чрезвычайно сложной задачей.
2) Как сравнить цвета дисков во многих списках? Трудно сказать мою проблему, но я попробую.
(define table (board 20 20))
(define row1 (list-ref table 0))
(list-ref row1 0)
Он вернется:
(make-top (make-posn 20 20) 'yellow)
Как я могу достичь «желтый в здесь? И если я дойду, как я могу сравнить его с другими цветами?
Любая идея была бы замечательной! Я думал об этих вопросах в течение 2 дней, и все же я ничего не мог сделать.
Я не должен использовать изменяемые структуры
BTW, ваш 'color' функция должна называть' (случайные х) 'только один раз и хранить его значение (используя 'let' или внутреннее' define'), и не вызывать '(random x)' несколько раз. Таким образом: '(define (color) (let ((value (random 500))) (cond ((<значение 100) 'синий) ((<значение 200)" фиолетовый) ((<значение 300)' желтый) ((<значение 400) 'red) (else' green)))) ' –
Вы уже используете' top-color' и 'top-coord' в своем коде. Что заставляет вас думать, что они не сработают для этого? – molbdnilo
Также функция 'color' не должна принимать аргумент. Странно, что вызывающий абонент должен поставить магическое значение '500' для того, чтобы оператор' cond' работал. Это деталь 'color' должна храниться сама по себе. Вероятно, его также следует переименовать в «random-color». –