我是c的初学者。 Lisp,实际上我的第一个代码遇到了一些问题。主题是随机数字的“dicegame”。如果你得到两个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个数字的结果是零,我得到的结果为前。 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))))
我的问题是:为什么第一个不工作,第二个工作。
谢谢!
答案 0 :(得分:0)
首先,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)))