Haskell 哈斯克尔的骰子游戏
我试着为用户玩的每一个骰子吐出随机生成的骰子。用户每回合有3个骰子,他可以玩5个回合(我还没有实现这一部分,我希望得到建议) 我还想知道如何随机显示颜色。我已经准备好了元组列表,但是我想我需要一些函数来使用random和该列表来匹配这些颜色。我正在努力想办法Haskell 哈斯克尔的骰子游戏,haskell,Haskell,我试着为用户玩的每一个骰子吐出随机生成的骰子。用户每回合有3个骰子,他可以玩5个回合(我还没有实现这一部分,我希望得到建议) 我还想知道如何随机显示颜色。我已经准备好了元组列表,但是我想我需要一些函数来使用random和该列表来匹配这些颜色。我正在努力想办法 module Main where import System.IO import System.Random import Data.List diceColor = [("Black",1),("Green",2),("Purple
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"
modulemain其中
导入系统.IO
导入系统。随机
导入数据。列表
颜色=[(“黑色”,1),(“绿色”,2),(“紫色”,3),(“红色”,4),(“白色”,5),(“黄色”,6)]
{-
randomList::(RandomGen g)->Int->g->[Integer]
随机0=[]
随机列表n生成器=r:randomList(n-1)newGenerator
式中(r,newGenerator)=randomR(1,6)generator
-}
兰德::Int->[Int]->IO()
rand n rlst=do
num这段代码中确实散布了很多错误,这向我表明,您试图立即构建整个过程。这是灾难的秘诀;您应该构建非常小的东西,并经常在ghci中进行测试
除了讲座,您可能会发现以下有趣的事实(按代码中相关错误的顺序排列):
列表
已弃用;您应该使用Data.List
- 顶级定义不需要
let
- 变量名必须以小写字母开头
- 类先决条件通过
=>
与类型分开
- 顶层模块块主要有定义;您应该将每个
where
子句(尤其是randomList
附近的子句)与定义相关联,方法是将其缩进到不成为模块块中的新行的程度,或者将其与要关联的定义保持在同一行
do
引入一个块;块中的这些内容应该比上下文中的内容缩进得更多
doYahtzee
被声明和使用,就像它有三个参数一样,但似乎被定义为只有一个参数
read
函数用于解析字符串
。除非您知道它的功能,否则使用read
从另一个String
解析字符串可能不是您想要做的事情——尤其是在用户输入时
putStrLn
只接受一个参数,而不是四个,并且该参数必须是字符串。但是,在这里猜测您想要什么,您可能会喜欢(!!)
和打印功能
dieRoll
似乎在任何地方都没有定义
可能还有其他错误。就风格而言,我建议您查看replicItem
、randomRs
、以及forever
。您可以使用搜索他们的姓名并阅读更多关于他们的信息;将来,您还可以使用它按类型搜索您希望存在的函数。这段代码中确实散布了很多错误,这向我表明您试图一次构建整个过程。这是灾难的秘诀;您应该构建非常小的东西,并经常在ghci中进行测试
除了讲座,您可能会发现以下有趣的事实(按代码中相关错误的顺序排列):
列表
已弃用;您应该使用Data.List
- 顶级定义不需要
let
- 变量名必须以小写字母开头
- 类先决条件通过
=>
与类型分开
- 顶层模块块主要有定义;您应该将每个
where
子句(尤其是randomList
附近的子句)与定义相关联,方法是将其缩进到不成为模块块中的新行的程度,或者将其与要关联的定义保持在同一行
do
引入一个块;块中的这些内容应该比上下文中的内容缩进得更多
doYahtzee
被声明和使用,就像它有三个参数一样,但似乎被定义为只有一个参数
read
函数用于解析字符串
。除非您知道它的功能,否则使用read
从另一个String
解析字符串可能不是您想要做的事情——尤其是在用户输入时
putStrLn
只接受一个参数,而不是四个,并且该参数必须是字符串。但是,在这里猜测您想要什么,您可能会喜欢(!!)
和打印功能
dieRoll
似乎在任何地方都没有定义
可能还有其他错误。就风格而言,我建议您查看replicItem
、randomRs
、以及forever
。您可以使用搜索他们的姓名并阅读更多关于他们的信息;将来,您还可以使用它按类型搜索您希望存在的函数。您不能让实现函数的代码与函数名齐平。换句话说,您需要在函数中的do
语句后缩进每一行。我确实缩进了它,但上面没有正确显示。无论如何,我已经克服了main的缩进问题(尽管我仍然在元组列表中使用它),现在我在键入“roll”时出现了“Exception:Prelude.read:no parse”错误。为了获得最大的帮助,请务必发布您实际使用的代码,包含缩进。不能将实现函数的代码与函数名保持齐平。换句话说,您需要在函数中的do
语句后缩进每一行。我确实缩进了它,但上面没有正确显示。不管怎样,我克服了压痕问题