Scheme 到达定义结构中的特定项

Scheme 到达定义结构中的特定项,scheme,racket,Scheme,Racket,我真的被一些事情卡住了,我会尽量正确地回答我的问题,希望你能理解。它可能有点长,所以首先感谢你花时间阅读这篇文章 我正在尝试在Racket 5.0.2版本中创建一个名称为“相同”的游戏 下面是对游戏的解释: 我创建了一个带有磁盘的表并绘制了它: a: width b: height r: radius (define (color x) ///for random colors (cond [(< (random x) 100) 'blue]

我真的被一些事情卡住了,我会尽量正确地回答我的问题,希望你能理解。它可能有点长,所以首先感谢你花时间阅读这篇文章

我正在尝试在Racket 5.0.2版本中创建一个名称为“相同”的游戏

下面是对游戏的解释:

我创建了一个带有磁盘的表并绘制了它:

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))
我希望你有一些更简单的替代方法,因为它看起来非常具有挑战性

2)如何在多个列表中比较磁盘的颜色?很难说出我的问题,但我会努力的。

    (define table (board 20 20))      
    (define row1 (list-ref table 0))
    (list-ref row1 0)
它将返回:

(make-top (make-posn 20 20) 'yellow)
我怎样才能到达这里的黄色?如果我够到了,我怎么能把它和其他颜色相比呢

任何想法都很好!我已经想了两天这些问题,但我还是什么都做不了


我不应该使用可变结构

内置访问器的结构:

> (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

顺便说一句,您的
color
函数应该只调用
(随机x)
一次并存储其值(使用
let
或内部
define
),而不是多次调用
(随机x)
。因此:
(定义(颜色)(let((值(随机500))(cond(
您已经在代码中使用了
顶色
顶坐标
。是什么让您认为它们不适用于此?另外,
color
函数不应接受参数。奇怪的是,调用方必须提供魔法值
500
,才能使
cond
语句工作。这是一个细节,
颜色
应该自己保留。它可能也应该改名为随机色。@ChrisJester-Young和@GregHendershott,我知道了。在学习
let
之前,我接受了这项作业。多亏了你,我修改了代码@molbdnilo,我想,我不能理解
定义结构
,但我现在清楚地看到了一切。谢谢你的评论!如果你对第二个问题有什么想法,请写下来。谢谢你的回答。我甚至不知道我怎么会错过这个。然而,我仍然有很多问题。我有
my-top
,这没问题,但我仍然不知道如何将其与相邻磁盘进行比较…例如,
如果(相等?my-top my-top2)删除它们
…我将在不同的变量中包含每个磁盘,如
my-top
my-top2
my-top3
。。。我想我应该在这里使用
列表,但我不知道该怎么做。考虑一下用一个变量来表示所有状态-一个简单的列表,用于板上的所有位置(200个元素)。这件事可能会出错。使用返回当前行的辅助函数。由20个元素组成的列表。draw函数将这些绘制为行。每个游戏功能创建一个新的200元素列表作为新的世界状态。游戏本质上是事件驱动的,因此在调用每个函数后都会有一个新的世界状态。htdp2/universe教学包是球拍中的一个很好的模型。
> (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