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