【问题标题】:Simple guessing game in Clojure not working properlyClojure 中的简单猜谜游戏无法正常工作
【发布时间】:2019-05-09 09:18:35
【问题描述】:

我是 Clojure 的新手。作为练习的一部分,我编写了一个简单的猜谜游戏,用户必须猜出程序选择的 1-100 之间的随机数。我得到了一个基本版本(代码 sn-p 1)。现在我想通过允许用户输入从 1 到 100 的整数来改进这一点。但是,我为避免用户输入字符串而编写的代码不起作用(代码 sn-p 2)但代码不起作用,无论我尝试什么。

代码 sn-p 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))))))))

代码 sn-p 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))

    )
    ))))      

【问题讨论】:

  • 什么不起作用?这很模糊。
  • 虽然运行这个,我在parseInt 下的线上得到Too many arguments to if。您的printlnrecur 调用是if 的一部分。我认为您希望他们在if 之后出现。
  • 您将printrecur 调用传递给if,这是太多的参数。尝试将您的各种ifs 和cond 合并为一个cond 块。这应该让事情更清楚。接下来,Integer/parseInt 将抛出异常。将我们纳入其自己的错误处理函数中,使其与您的新 cond 语义相匹配。

标签: clojure functional-programming lisp


【解决方案1】:

你需要在 if 之外 recur

(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))  
    )))) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多