Haskell 哈斯克尔的骰子游戏

Haskell 哈斯克尔的骰子游戏,haskell,Haskell,我试着为用户玩的每一个骰子吐出随机生成的骰子。用户每回合有3个骰子,他可以玩5个回合(我还没有实现这一部分,我希望得到建议) 我还想知道如何随机显示颜色。我已经准备好了元组列表,但是我想我需要一些函数来使用random和该列表来匹配这些颜色。我正在努力想办法 module Main where import System.IO import System.Random import Data.List diceColor = [("Black",1),("Green",2),("Purple

我试着为用户玩的每一个骰子吐出随机生成的骰子。用户每回合有3个骰子,他可以玩5个回合(我还没有实现这一部分,我希望得到建议)

我还想知道如何随机显示颜色。我已经准备好了元组列表,但是我想我需要一些函数来使用random和该列表来匹配这些颜色。我正在努力想办法

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
语句后缩进每一行。我确实缩进了它,但上面没有正确显示。不管怎样,我克服了压痕问题