物品收集计数 - Racket/Sceme

Item collection count - Racket/Sceme

我正在设计一个使用球拍的小型 MUD 游戏。在我的游戏中,玩家收集的 gems 用于贿赂守卫。目前如果玩家拥有超过1个gem,游戏不会让他们贿赂守卫

相关代码如下:

;; This code processes the bribe command.
((equal? cmd 'bribe)
 (if (get-area-item rid 'guard)
     (begin
       (if (eq? (user-attribute 'gem) 1)
           (begin
             (hash-table-set! areasdb rid (replace-area-item (get-area rid) 'guard '(guard #f)))
             (user-add-value 'gem -1))
           (describe 'bribe-no-gem))
       (describe 'bribe))
     (describe 'bribe-blank)))

(eq? (user-attribute 'gem) 1) 改为:

(>= (user-attribute 'gem) 1)

顺便说一句,不要用eq?来比较数字。使用 = 或(如果您需要与通用对象进行比较)eqv?.


OP 询问如果没有宝石,如何抑制 bribe 消息。下面是它可能如何完成的(我打算对现有代码进行最少的更改,而不是为了最好的风格):

((equal? cmd 'bribe)
 (if (get-area-item rid 'guard)
     (if (>= (user-attribute 'gem) 1)
         (begin
           (hash-table-set! areasdb rid (replace-area-item (get-area rid) 'guard '(guard #f)))
           (user-add-value 'gem -1)
           (describe 'bribe))
         (describe 'bribe-no-gem))
     (describe 'bribe-blank)))

顺便说一下,如果您使用 (describe 'bribe-blank) 的唯一原因是因为 if 需要一个 else 分支,您可以使用 when 代替,就像这样:

((equal? cmd 'bribe)
 (when (get-area-item rid 'guard)
   (if (>= (user-attribute 'gem) 1)
       (begin
         (hash-table-set! areasdb rid (replace-area-item (get-area rid) 'guard '(guard #f)))
         (user-add-value 'gem -1)
         (describe 'bribe))
       (describe 'bribe-no-gem))))