2015-04-26 10 views
1

Я занимаюсь разработкой маленькой игры MUD с использованием ракетки. В моей игре драгоценные камни, собранные игроком, используются для подкупа охранников. В настоящее время, если игрок обладает более чем 1 драгоценным камнем, игра не позволит им подкупить охранника.Количество элементов коллекции - Racket/Sceme

Вот соответствующий код:

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

скажу, если вы делаете это в рэкете, ваш код немного шаткий для ракетка кода. Особенно 'require', который должен по крайней мере быть' (require srfi/69) 'вместо использования полного синтаксиса' lib'. Если вы пишете чистую схему, вы можете использовать '#lang r5rs' вместо' #lang racket'. –

ответ

2

Изменение (eq? (user-attribute 'gem) 1) на это, вместо того, чтобы:

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

Кстати, не используйте eq? для сравнения чисел. Используйте = или (если вам нужно сравнить с общими объектами) eqv?.


ОП спросил, как подавить 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)))) 
+0

Это отлично поработало, спасибо за вашу помощь. Еще один вопрос, знаете ли вы, как я могу только показать «У вас нет драгоценных камней, чтобы подкупить охранника!» если у пользователя нет драгоценных камней? В настоящее время он печатается с «Вы ищете себя за драгоценный камень ...» после него, что не имеет смысла :( – Oscar

+1

Lemme отформатируйте свой код (только первый, не успевайте переформатировать второй) и посмотрите если метод очевиден. :-D –

+0

@JamesPatterson Обновлено мое сообщение, чтобы ответить на ваш новый вопрос. –