【问题标题】:Common Lisp random dicesCommon Lisp 随机骰子
【发布时间】:2018-03-29 17:58:40
【问题描述】:

我是 c 的初学者。 Lisp,实际上我的第一个代码有一些问题。主题是一个带有随机数的“骰子游戏”。如果你得到两个 1,你就赢了,如果你得到两个 6,你也赢了。

首先我写下这段代码:

(defun dice ()
  (+ (random 6) 1))


(defun dicegame (dice dice)
  (and (and (or
              (equal (print (dice)) 1)
              (equal (print (dice)) 6))
            (or
              (equal (print (dice)) 1)
              (equal (print (dice)) 6)))
       (or (equal (print (dice)) (print (dice))))))

(dicegame (dice) (dice))

它不工作。我得到了 6 个数字的结果,这些数字是 nil,我得到了 ex 的结果。 3 5 4 5 3 4 这是真的。我不明白。

比我写了一个正在工作的新的:

(defun dicegame-s (dice dice)
  (or (and (equalp (print (dice)) 1)
           (equalp (print(dice)) 1))
      (and (equalp (print(dice)) 6)
           (equalp (print(dice)) 6))))

我的问题是:为什么第一个不工作而第二个工作。

谢谢!

【问题讨论】:

  • 如果你修正你的缩进,事情可能会变得很明显。 Emacs 可以提供帮助。
  • 在你的函数 DICEGAME 上:它有两个同名的参数。那有意义吗?此外,这些参数未使用。相反,您反复 (骰子) 。你认为(骰子)有什么作用?
  • 定义“工作”?
  • 不要将输出与计算混合。首先计算你的值,然后打印它们(或者只在你的 REPL 中查看它们而不打印)。

标签: random lisp common-lisp dice


【解决方案1】:

首先,dicegame-s 不是真的工作。您的代码存在一些问题:

  • dicegame 函数的所有参数名称完全相同

这应该会导致代码解析失败。您可以将它们命名为 (dice-1 dice-2)

  • 您不使用传递给函数的参数

在您的函数中,您使用(dice),这是一个函数调用。因此,您不必使用赋予函数的值,而是每次掷一个新骰子!

所以,当你写 (dicegame (dice) (dice)) 时,就是你在掷骰子的时候;该函数只检查值,并告诉你是否赢了。

  • print太多了

print 函数打印一个值并返回它;这就是为什么有时 dicegame 最多有 6 个值,因为每个 (print (dice)) 都会写入其输出。事实上,即使在dicegame-s,如果两个骰子都是6,也会打印3个结果。

您应该调用一次,而不是每次都调用print——在函数的开头或结尾,或者函数之外的某个地方。

一个工作示例

要纠正以前的错误,您可以这样做:

(defun dicegame (dice-1 dice-2)
  (or (and (equalp dice-1 1)
           (equalp dice-2 1))
      (and (equalp dice-1 6)
           (equalp dice-2 6))))

(dicegame (print (dice)) (print (dice)))

【讨论】:

  • 感谢您的回答!我知道有这么多“打印”,在这种情况下只适合我。就像一个控件。
  • 如果我想得到一个随机的骰子值。对于骰子游戏,我是否必须调用该函数?我的函数不需要这个参数“骰子”,因为我不能将函数作为参数调用,对吧?
  • 当你写(dicegame (dice) (dice))时,你掷了两个骰子,并将它们的值传递给函数;他们变成dice-1dice-2(或者你给的任何名字)
  • 而且是的!当然,您可以将函数作为参数传递并在另一个函数中调用它。但这可能不是你想在这里做的。
  • 如果我尝试像你告诉我的那样写它,我很抱歉。如果我写 (defun dicegame ((dice) (dice)) 我只会得到错误
猜你喜欢
  • 2011-05-01
  • 2014-10-07
  • 2013-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-10
  • 2014-05-30
  • 1970-01-01
相关资源
最近更新 更多