2014-08-30 3 views
0

Я новичок в Racket. Я задавал вопрос 1 от here. Ниже приведен код, который я мог бы сделать:Использование структуры в Racket

#lang racket 

(require 2htdp/image) 

(require rackunit) 
(require rackunit/text-ui) 
(require "extras.rkt") 

(define curr-dir "n") 
(define curr-x 30) 
(define curr-y 40) 

;; Structure that I thought about 
(define-struct robot (x y direction)) 
(define irobot (make-robot curr-x curr-y curr-dir)) 

(define MAX_HEIGHT 200) 
(define MAX_WIDTH 400) 

(define (render-robot) 
(place-image 
(crop 14 0 10 20 (circle 10 "solid" "blue")) 
19 10 
(circle 10 "solid" "red")) 
) 

(define (spawn-robot x y direction) 
(place-image 
(cond 
    [(string=? "n" direction) (rotate 90 (render-robot))] 
    [(string=? "e" direction) (render-robot)] 
    [(string=? "w" direction) (rotate 180 (render-robot))] 
    [(string=? "s" direction) (rotate 270 (render-robot))] 
    ) 
x y 
(empty-scene MAX_WIDTH MAX_HEIGHT) 
) 
) 

(define (initial-robot x y) 
(if (and (<= x (- MAX_HEIGHT 10)) (<= y (- MAX_WIDTH 10))) 
    (spawn-robot x y curr-dir) 
    (error "The placement of the robot is wrong!") 
    ) 
) 

(define robot1 (initial-robot curr-x curr-y)) 

;;-----------------------------------------------------;; 

;; Doubt Here (Make the robot turn left) 
(define (robot-left robot-obj) 
(set! curr-dir "w") ;; Hard coded for north direction 
(initial-robot curr-x curr-y) 
) 

;; Doubt Here (Function checks whether robot is facing north or not.) 
(define (robot-north? robot-obj) 
(if (string=? "n" curr-dir) (true) (false)) 
) 

В интерпретатором я попытался это:

Interpreter Snap

Я думал, что код, вероятно, будет хорошо, но все же некоторые сомнения возникли в мой ум:

  1. в коде по мне, используя структуры (сделать-структура) должна было хорошо, но Accordin g для объяснения вопроса, я думаю экземпляр робота является результатом функции initial-robot. Используется ли структура?

  2. В функциях robot-left и robot-north? как я должен использовать robot1 в качестве аргумента? Установка глобальной переменной, которая сохраняет текущее направление объекта, может использоваться для упомянутых функций . Что мне здесь делать?

Любые предложения приветствуются. Спасибо!

+0

Просто, чтобы вы знали, этот вопрос лучше подходит для http://codereview.stackexchange.com/ –

ответ

2

Вы правильно, что структура будет лучшим выбором:

1) Вы бы не быть ограничена одним роботом в вашем коде, и

2) Вы бы программирование в функциональном способ, которым это требует задание.

Таким образом, с помощью робота-структуры:

(define-struct robot (x y direction)) 

Убедитесь, что вы дать правильное определение данных для структуры.

;; A Robot is a (make-robot x y direction), where: 
;; - x is an integer 
;; - y is an integer 
;; - direction is a string 

Хотя, я бы рекомендовал использовать символы вместо строк для direction.


(robot-left):

;; Turns a robot to the left. 
;; Robot -> Robot 
(define (robot-left robot-obj) 
    (make-robot (robot-x robot-obj) 
       (robot-y robot-obj) 
       "w")) 

(robot-north?):

;; Does robot-obj face north? 
;; Robot -> Boolean 
(define (robot-north? robot-obj) 
    (string=? (robot-direction robot-obj) "n")) 

Теперь, чтобы включить эти функции в вашем коде, вы должны убедиться, что вы разделяете идею данных и выводить изображения, которых вы в настоящее время нет.

(initial-robot) не следует оказывать вообще. Он должен просто вернуть экземпляр робота, как определено в нашем определении данных.

Обратите внимание, что спецификация, приведенная в этом домашнем задании , не требует от вас визуализации вообще.Это было бы отдельным делом. Все функции, которые они просят вас определить, строго связаны с данными. После этого вы можете рассмотреть возможность визуализации, чтобы визуально проверить свои функции, а также дополнительные тесты модулей, которые вы также должны создавать для каждой функции.

Код, который я вам предоставил, должен стать хорошей отправной точкой для выяснения того, как вы планируете выполнять остальные функции. Не беспокойтесь о рендеринге до конца! Не забывайте, что каждая подпись, указанная в домашнем задании, которая упоминает Robot, ссылается на определение данных, которое мы создали для нашей роботизированной структуры.

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