Pergunta

Ok, pergunta final e eu terei meu número de adivinhação de número no Common Lisp! : D Sempre que o jogo começa (ou um novo jogo começa após o primeiro jogo), a seguinte função é chamada.

;;; Play the game
(defun play ()
    ;; If it's their first time playing this session,
    ;; make sure to greet the user.
    (unless (> *number-of-guesses* 0)
        (welcome-user))
    ;; Reset their remaining guesses
    (setq *number-of-guesses* 0)
    ;; Set the target value
    (setq *target*
        ;; Random can return float values,
        ;; so we must round the result to get
        ;; an integer value.
        (round
            ;; Add one to the result, because
            ;; (random 100) yields a number between
            ;; 0 and 99, whereas we want a number
            ;; from 1 to 100 inclusive.
            (+ (random 100) 1)))
    (if (eql (prompt-for-guess) t)
        (play)
        (quit)))

Então, supostamente, cada vez que o jogador inicia um jogo, *target* deve ser definido como um novo número inteiro aleatório entre 1-100. No entanto, cada vez, *target* padrão para 82. Como faço para fazer (random) aja ... aleatoriamente?

Foi útil?

Solução

Você precisa semear o estado aleatório no início do programa.

(setf *random-state* (make-random-state t))
;; # this initializes the global random state by
;;   "some means" (e.g. current time.)

Outras dicas

Penso que, se você definir uma função com um número aleatório, ela não é chamada quando você chama a função, na verdade, ela será determinada quando você carregar no arquivo e, quando executar essa definição, ela será fixada para esse valor. Então você está chamando a função a cada vez, o número sempre será o mesmo. Quando passei em uma variável para a função com um aleatório cada vez que era chamado, ela era aleatória a cada vez. Pelo menos, que eu experimentei no meu programa

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top