1

我正在使用球拍设计一个小型 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)))
4

1 回答 1

2

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

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

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


bribeOP询问如果没有宝石,如何抑制消息。以下是它的完成方式(我打算对现有代码进行最小的更改,而不是最好的样式):

((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))))
于 2015-04-26T21:06:36.483 回答