2013-12-17 4 views
2

Я действительно зацикливаюсь на чем-то, и я постараюсь правильно рассказать о своих вопросах, надеюсь, вы поймете. Это может быть немного долго, поэтому прежде всего спасибо вам, чтобы тратить время на это.Достижение определенного элемента в 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 дней, и все же я ничего не мог сделать.

Я не должен использовать изменяемые структуры

+1

BTW, ваш 'color' функция должна называть' (случайные х) 'только один раз и хранить его значение (используя 'let' или внутреннее' define'), и не вызывать '(random x)' несколько раз. Таким образом: '(define (color) (let ((value (random 500))) (cond ((<значение 100) 'синий) ((<значение 200)" фиолетовый) ((<значение 300)' желтый) ((<значение 400) 'red) (else' green)))) ' –

+1

Вы уже используете' top-color' и 'top-coord' в своем коде. Что заставляет вас думать, что они не сработают для этого? – molbdnilo

+0

Также функция 'color' не должна принимать аргумент. Странно, что вызывающий абонент должен поставить магическое значение '500' для того, чтобы оператор' cond' работал. Это деталь 'color' должна храниться сама по себе. Вероятно, его также следует переименовать в «random-color». –

ответ

3

Структура поставляется со встроенными аксессорами:

> (define my-top (make-top (make-posn 20 20) 'yellow)) 
> (top-color my-top) 
'yellow 
> (top-coord my-top) 
(make-posn 20 20) 
> (top? my-top) 
true 
+0

Спасибо за этот ответ. Я даже не знаю, как я пропустил это. Однако у меня все еще много проблем. У меня есть 'my-top', это нормально, но я до сих пор не знаю, как я буду сравнивать его со смежными дисками ... Например,' if (equal?my-top my-top2) удалить их ... Я буду содержать все диски в разных переменных, таких как 'my-top',' my-top2', 'my-top3' ... Думаю, я должен использовать' row 'list здесь, но я не могу понять, как я это сделаю. – sedooe

+0

Подумайте о представлении всего состояния с одной переменной - простой список для всех позиций на доске (200 элементов). Это может быть затруднено. Используйте вспомогательную функцию, которая возвращает текущие строки. Список из 20 списков из десяти элементов. Функция draw рисует их как строки. Каждая функция игры создает новый 200-элементный список, который будет служить новым мировым состоянием. Игры по своей сути управляются событиями, поэтому после каждой функции вызывается новое мировое состояние. Учебный пакет htdp2/universe является хорошей моделью в Racket. –

Смежные вопросы