Простая игра в догадки в Clojure не работает должным образом - PullRequest
0 голосов
/ 07 декабря 2018

Я новичок в Clojure.Как часть практики, я написал простую игру на угадывание, в которой пользователь должен угадать случайное число, выбранное программой в диапазоне от 1 до 100.У меня работает базовая версия (фрагмент кода 1).Теперь я хочу улучшить это, позволив пользователю вводить целое число от 1 до 100. Однако код, который я написал, чтобы пользователь не вводил строку, не работает (фрагмент кода 2), но код не работает, нетчто бы я ни пытался.

Фрагмент кода 1 (работает)

(ns guessing-game2.core
     (:gen-class))

(defn -main []
  (let [my-number (inc (rand-int 100))]
    (println "I have a number between 1 and 100, guess it: ")
    (loop [times 1]
      (let [guess (Integer/parseInt (read-line))]
        (if (= guess my-number)
          (do
            (println "You have found it in " times " tries!")
            times)

          (do
            (cond
            (< guess my-number) (println "My number is bigger, guess again: ")
            (> guess my-number) (println "My number is smaller, guess again: "))
        (recur (inc times))))))))

Фрагмент кода 2 (не работает)

(ns guessing-game.core
  (:gen-class))

(defn -main []
  (let [my-number (inc (rand-int 100))]
    (println "I have a number between 1 and 100, guess it: ")
    (loop [times 1]
      (let [guess (Integer/parseInt (read-line))]
      (if (and (integer? guess) 
              (< guess 100))
        (if (= guess my-number)
          (do
            (println "You have found it in " times " tries!")
            times)

          (do
            (cond
              (< guess my-number) (println "My number is bigger, guess again: ")
              (> guess my-number) (println "My number is smaller, guess again: "))))

      (print "Please enter a number")
      (recur (inc times))

    )
    ))))      

1 Ответ

0 голосов
/ 09 декабря 2018

вам нужно recur вне if

(ns guessing-game.core
  (:gen-class))

(defn -main []
  (let [my-number (inc (rand-int 100))]
    (println "I have a number between 1 and 100, guess it: ")
    (loop [times 1]
      (let [guess (Integer/parseInt (read-line))]
      (if (and (integer? guess) 
              (< guess 100))
        (if (= guess my-number)
          (do
            (println "You have found it in " times " tries!")
            times)

          (do
            (cond
              (< guess my-number) (println "My number is bigger, guess again: ")
              (> guess my-number) (println "My number is smaller, guess again: "))))

      (print "Please enter a number")) ;; <-- moved bracket to here 
    (recur (inc times))  
    )))) 
...