物品收集计数 - 球拍/场景

时间:2015-04-26 21:02:43

标签: count functional-programming scheme racket mud

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

以下是相关代码:

;; 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)))

1 个答案:

答案 0 :(得分:2)

(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代替,例如:< / p>

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