Racket 棋盘程序,将方块的大小(行 x 列)和大小作为参数,并使用 DrRacket 构建红黑棋盘

Racket checkerboard program that takes the size (row x column) and size of squares as args and builds a red and black checkerboard with DrRacket

您好,我正在为这个问题苦苦挣扎,我不知道如何添加正方形图块的数量并将其合并为用户输入值,我只知道如何增加图块的大小。所以我可以把方块变大,但我不能增加它们的数量。主要问题是交替使用红色和黑色的正方形颜色并让用户输入电路板尺寸。如果你能用圆圈或其他任何东西告诉我如何接受用户输入以添加更多内容,我将不胜感激任何帮助,这将在三天内完成,我已经研究了一段时间。

编辑:在我的 class 中,我们还没有学习球拍中的 for 循环,所以如果有 iterative/recursive 方法可以帮助我。

这是我多次尝试的代码:

#lang slideshow

(define (square n) (filled-rectangle n n))
(define (redblock n) (colorize(square) "red"))
(define (blackblock n) (colorize(square) "black"))

;slideshow
(define (series n)
  [hc-append (* square n)]) ; contract violation, expected: number?, given: #<procedure:square>

;slideshow
(define (rb-series mk)
  (vc-append
   (series [lambda (sz) (colorize (mk sz) "red")])
   (series [lambda (sz) (colorize (mk sz) "black")])))

(define (checker p1 p2) ;makes 2x2
  (let ([p12 (hc-append p1 p2)]
        [p21 (hc-append p2 p1)])
    (vc-append p12 p21)))

(define (four p) ;can we get the parameter of this as any number instead of the shape?
  (define two-p (hc-append p p))
  (vc-append two-p two-p))

(define (checkerboard n sz)
  (let* ([redblock (colorize(square sz)"red")]
         [blackblock (colorize(square sz)"black")])
    (define (blackred-list n)
      ;(define (string lst)) ;is there a way to construct an empty string to add to?
      (for ([i n])
        (if (even? i)
            (hc-append blackblock)
            (else
             (hc-append (redblock)))))) ; this else part throws an error saying no hc-append
     (define (redblack-list n)
      (for ([i n])
        (if (even? i)
            (hc-append redblock)
            (else (hc-append blackblock))))) ;another else with the same issue
     (define (row-list n)
       (for ([i n])
         (if (even? i)
             (vc-append blackred-list)
             (else
              (vc-append redblack-list)))))
    (checkerboard 5 20))) ;this is just to test it, but how would I get user input?```


让我们一步步分解:

  • 定义名为 checkerboard:
  • 的函数
(define (checkerboard n sz) ...
  • 使用 redblockblackblock 的本地定义...
(let ([redblock (colorize (filled-rectangle sz sz) "red")]
      [blackblock (colorize (filled-rectangle sz sz) "black")])
  • With函数blackred-list(我使用letrec进行递归局部定义)...
(letrec ([blackred-list
              (lambda (m) (cond ((zero? m) '())
                                ((even? m) (cons blackblock (blackred-list (sub1 m))))
                                (else (cons redblock (blackred-list (sub1 m))))))]
  • 具有与 blackred-list 非常相似的功能 redblack-list,因此我将其留作您的工作。
  • 有函数row-list:
[row-list (lambda (m) (map (lambda (i) (apply hc-append (reverse
                                                       (if (even? i)
                                                           (blackred-list m)
                                                           (redblack-list m)))))
                                    (range m)))]

然后在letrec里面写(apply vc-append (row-list n))

任务中没有提到用户输入,因为您只需在 REPL 中调用 (checkerboard 6 15)(或任何其他测试),但您肯定可以这样做:

> (checkerboard (read) (read))

如果可以自信地编写 assemble 小函数,那么建议 这个练习可能是产生解决方案所需要的全部。但如果这是一项技能 那个人正在学习,然后遵循系统的设计方法可能 帮助学习过程。

这里的设计方法是HtDF(How to Design Functions):写下stub签名用途,示例模板,然后编辑模板以生成所需的函数。

(此答案使用字符来代表块——例如用 hc-append 代替 list->string 表示图像)

(define redblock #\r)
(define blackblock #\b)
#;
(define (blackred-list m) ;; Natural -> ListOfBlock       ; *stub* ;; *signature*
  ;; produce list of m alternating blocks (last one red)  ; *purpose statement*
  empty)                                                  ; *stub body* (valid result)

(check-expect (blackred-list 0) empty )                   ; *minimal example*
#;
(define (fn n)                                            ; *template*
  (cond                                                   ;
    [(zero? n) ... ]                                      ;
    [else (.... n (fn (- n 1))) ]))                       ;

(check-expect (blackred-list 1) (list redblock) )         ; *examples* to guide .... edit
(check-expect (blackred-list 2) (list blackblock redblock) )

(define (blackred-list m) ;; Natural -> ListOfBlock       ; (edit template)
  ;; produce list of m alternating blocks (last one red)
  (cond
    [(zero? m) empty ]
    [else (cons
           (if (even? m)
               blackblock
               redblock)
           (blackred-list (- m 1))) ]))

(check-expect (blackred-list 3) (list redblock blackblock redblock) )

(define (redblack-list m) ;; Natural -> ListOfBlock
  ;; produce list of m alternating blocks (last one black)
  (cond
    [(zero? m) empty ]
    [else (cons
           (if (even? m)
               redblock
               blackblock)
           (redblack-list (- m 1))) ]))

(check-expect (redblack-list 3) (list blackblock redblock blackblock) )
#;
(define (row-list m) ;; Natural -> ListOfString           ; *stub*
  ;; produce list of m alternating strings of blocks (last one ends in red)
  empty)

(check-expect (row-list 0) empty)                         ; *examples* (same template)
(check-expect (row-list 1) (list "r") )
(check-expect (row-list 2) (list "rb" "br") )

(define (n-strings-of-length m n) ;; Natural Natural -> ListOfString
  ;; produce list of n alternating length m strings of blocks (last one ends in red)
  (cond
    [(zero? n) empty ]
    [else (cons
           (if (even? n)
               (list->string (redblack-list m))
               (list->string (blackred-list m)))
           (n-strings-of-length m (- n 1))) ]))

(define (row-list m) ;; Natural -> ListOfString
  ;; produce list of m alternating length m strings of blocks (last one ends in red)
  (n-strings-of-length m m))

(define (display-rows los) ;; ListOfString ->             ; (from natural list recursion template)
  ;; display los, one element per line
  (cond
    [(empty? los) (void) ]
    [else (begin
            (display (car los))
            (newline)
            (display-rows (cdr los))) ]))

(define (checkerboard m) ;; Natural ->
  ;; display checkerboard with side m
  (display-rows (row-list m)))
Welcome to DrRacket, version 8.4 [cs].
Language: Advanced Student.
All 8 tests passed!
> 

现在可以重新排序函数以生成指定 local 形式的解决方案:

(define redblock #\r)
(define blackblock #\b)

(define (checkerboard m) ;; Natural ->
  ;; display checkerboard with side m
  (local [
    (define (blackred-list m) ;; Natural -> ListOfBlock
      ;; produce list of m alternating blocks (last one red)
      (cond
        [(zero? m) empty ]
        [else (cons
               (if (even? m)
                   blackblock
                   redblock)
               (blackred-list (- m 1))) ]))
    (define (redblack-list m) ;; Natural -> ListOfBlock
      ;; produce list of m alternating blocks (last one black)
      (cond
        [(zero? m) empty ]
        [else (cons
               (if (even? m)
                   redblock
                   blackblock)
               (redblack-list (- m 1))) ]))
    (define (n-strings-of-length m n) ;; Natural Natural -> ListOfString
      ;; produce list of n alternating length m strings of blocks (last one ends in red)
      (cond
        [(zero? n) empty ]
        [else (cons
               (if (even? n)
                   (list->string (redblack-list m))
                   (list->string (blackred-list m)))
               (n-strings-of-length m (- n 1))) ]))
    (define (row-list m) ;; Natural -> ListOfString
      ;; produce list of m alternating length m strings of blocks (last one ends in red)
      (n-strings-of-length m m))
    (define (display-rows los) ;; ListOfString ->
      ;; display los, one element per line
      (cond
        [(empty? los) (void) ]
        [else (begin
                (display (car los))
                (newline)
                (display-rows (cdr los))) ]))  ])
  (display-rows (row-list m)))
Welcome to DrRacket, version 8.4 [cs].
Language: Advanced Student.
> (checkerboard 5)
rbrbr
brbrb
rbrbr
brbrb
rbrbr
>