【问题标题】:Accessing the world-state from Big-Bang in Racket from a preset function通过预设功能从 Racket 中的 Big-Bang 访问世界状态
【发布时间】:2015-12-13 20:45:51
【问题描述】:

我正在 Racket 中创建一个带有 big bang 功能和四个结构的小游戏。我的结构如下:

(define-struct game_main (tank missile UFO))
(define-struct tank (x aim-x aim-y))
(define-struct missile (x y vel))
(define-struct UFO (x y))
(define a-game 
  (make-game_main 
  (make-tank 370 100 100)
  (make-missile 500 500 1)
  (make-UFO 100 100)))

在为大爆炸函数创建键事件处理程序时,我使用 a 将坦克的 x 位置向左移动,d 将其向右移动,就像这样。包含大爆炸功能以供参考:

(define (controls a-game a-key)
  (cond
    [(key=? a-key "a")
     (struct-copy game_main a-game [tank (make-tank (- (tank-x (game_main-tank a-game)) 7)
                                                    (tank-aim-x (game_main-tank a-game))
                                                    (tank-aim-y (game_main-tank a-game)))])]
    [(key=? a-key "d")
     (struct-copy game_main a-game [tank (make-tank (+ (tank-x (game_main-tank a-game)) 7)
                                                    (tank-aim-x (game_main-tank a-game))
                                                    (tank-aim-y (game_main-tank a-game)))])]
    )
  )

(big-bang a-game (to-draw game_init) (on-key controls)) 

这很好用;但是,它很冗长。我想定义一个函数,例如“move-tank-left”,它只包含世界状态更改器,但在事件处理程序之外定义。但是,它不是直接编辑被 big-bang 操作的结构,而是返回到我全局设置的 a-game game_main 结构并恢复它开始时的 x 值。 如何引用当前的 big-bang 函数世界状态,以便您可以在 big-bang 函数之外建立函数来编辑临时状态?

这是有问题的函数:

(define move-tank-left
(make-tank
(- (tank-x (game_main-tank a-game)) 5)
(tank-aim-x (game_main-tank a-game))
(tank-aim-y (game_main-tank a-game))))

【问题讨论】:

    标签: scheme racket


    【解决方案1】:

    您不能引用当前的“大爆炸”状态,因为它在 big-bang 之外不存在。
    (即使big-bang 也不会真正编辑当前状态——

    (struct-copy game_main a-game ...
    

    不会修改a-game 参数,而是创建一个新状态。)

    您可以通过controls 函数传递整个游戏状态:

    (define (controls a-game a-key)
      (cond
        [(key=? a-key "a")
         (struct-copy game_main a-game [tank (move-tank-left a-game)])]
        ... 
    
    (define (move-tank-left game-state)
        (make-tank
           (- (tank-x (game_main-tank game-state)) 5)
           (tank-aim-x (game_main-tank game-state))
           (tank-aim-y (game_main-tank game-state))))
    

    但只传递坦克会产生更少的依赖关系,让您更轻松地添加坦克:

    (define (controls a-game a-key)
      (cond
        [(key=? a-key "a")
         (struct-copy game_main 
                      a-game 
                     [tank (move-tank-left (game_main-tank a-game))])]
        ...
    
    (define (move-tank-left tank)
        (make-tank
           (- (tank-x tank) 5)
           (tank-aim-x tank)
           (tank-aim-y tank)))
    

    【讨论】:

    • 哦!非常感谢。我明白我的问题是什么了。创建 move-tank-left 函数时,我没有让它接受一个参数(坦克)。相反,我硬引用了 game_main 坦克。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多