物品收集计数 - 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))))
我正在设计一个使用球拍的小型 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))))