我正在尝试为用户播放的每个掷骰子随机生成骰子。用户每回合有3个卷,他可以玩5个回合(我还没有实现这个部分,我会很感激建议)。
我也想知道如何随机显示颜色。我有元组列表,但我认为我需要一些使用随机和该列表来匹配这些颜色的函数。我正在苦苦思索如何。
module Main where
import System.IO
import System.Random
import Data.List
diceColor = [("Black",1),("Green",2),("Purple",3),("Red",4),("White",5),("Yellow",6)]
{-
randomList :: (RandomGen g) -> Int -> g -> [Integer]
random 0 _ = []
randomList n generator = r : randomList (n-1) newGenerator
where (r, newGenerator) = randomR (1, 6) generator
-}
rand :: Int -> [Int] -> IO ()
rand n rlst = do
num <- randomRIO (1::Int, 6)
if n == 0
then doSomething rlst
else rand (n-1) (num:rlst)
doSomething x = putStrLn (show (sort x))
main :: IO ()
main = do
--hSetBuffering stdin LineBuffering
putStrLn "roll, keep, score?"
cmd <- getLine
doYahtzee cmd
--rand (read cmd) []
doYahtzee :: String -> IO ()
doYahtzee cmd = do
if cmd == "roll"
then rand 5 []
else do print "You won"
答案 0 :(得分:8)
在这段代码中真的出现了很多错误,这告诉我你曾经尝试过整个构建过程。这是灾难的秘诀;你应该建立非常小的东西并经常在ghci中测试它们。
除了讲座外,您可能会发现以下事实很有趣(按照代码中的相关错误顺序):
List
已弃用;你应该使用Data.List
代替。let
。=>
的类型分开。where
子句(尤其是randomList
附近的子句)与一个定义相关联,或者将它缩进到模块块中的新行,或者将它与你的定义保持在同一行希望它与之相关联。do
引入了一个块;块中的那些东西应该平均缩进,而不是它们的上下文。doYahtzee
,好像它有三个参数,但似乎被定义为只有一个参数。read
函数用于解析String
。除非您知道它的作用,否则使用read
从另一个String
解析String
可能不是您想要做的 - 尤其是在用户输入上。putStrLn
只接受一个参数,而不是四个,并且该参数必须是String
。但是,在这里猜测您想要的内容,您可能会喜欢(!!)
和print
函数。dieRoll
似乎无法在任何地方定义。可能还有其他错误。从风格上讲,我建议您查看replicateM
,randomRs
和forever
。您可以使用hoogle搜索他们的名字并详细了解他们的名字;在将来,您还可以使用它来搜索您希望按类型存在的功能。