哈斯克尔的骰子游戏

时间:2012-03-06 04:42:56

标签: haskell

我正在尝试为用户播放的每个掷骰子随机生成骰子。用户每回合有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"

1 个答案:

答案 0 :(得分:8)

在这段代码中真的出现了很多错误,这告诉我你曾经尝试过整个构建过程。这是灾难的秘诀;你应该建立非常小的东西并经常在ghci中测试它们。

除了讲座外,您可能会发现以下事实很有趣(按照代码中的相关错误顺序):

  • List已弃用;你应该使用Data.List代替。
  • 顶级定义不需要let
  • 变量名称必须以小写字母开头。
  • 类先决条件与=>的类型分开。
  • 顶级模块块应该主要有定义;你应该将每个where子句(尤其是randomList附近的子句)与一个定义相关联,或者将它缩进到模块块中的新行,或者将它与你的定义保持在同一行希望它与之相关联。
  • do引入了一个块;块中的那些东西应该平均缩进,而不是它们的上下文。
  • 声明并使用
  • doYahtzee,好像它有三个参数,但似乎被定义为只有一个参数。
  • read函数用于解析String。除非您知道它的作用,否则使用read从另一个String解析String可能不是您想要做的 - 尤其是在用户输入上。
  • putStrLn只接受一个参数,而不是四个,并且该参数必须是String。但是,在这里猜测您想要的内容,您可能会喜欢(!!)print函数。
  • dieRoll似乎无法在任何地方定义。

可能还有其他错误。从风格上讲,我建议您查看replicateMrandomRsforever。您可以使用hoogle搜索他们的名字并详细了解他们的名字;在将来,您还可以使用它来搜索您希望按类型存在的功能。