2012-03-06 86 views
1

我試圖爲用戶玩的每一個擲骰吐出隨機生成的骰子。用戶每回合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

您不能讓實現函數的代碼與函數的名稱保持同步。換句話說,你需要在函數內的'do'語句之後縮進每一行。 – 2012-03-06 04:54:07

+0

我沒有縮進它,上面沒有正確顯示。無論如何,我克服了主要的縮進問題(儘管我仍然有它的元組列表),我現在得到:「異常:Prelude.read:沒有解析」錯誤,當我鍵入「roll」。 – rexbelia 2012-03-06 04:59:04

+0

爲獲得最大程度的幫助,請務必張貼您實際使用的代碼,包括縮進。 – 2012-03-06 05:29:00

回答

8

在這段代碼中實際存在着很多錯誤,這表明我試圖一次性構建整件事情。這是災難的祕訣;你應該構建非常小的東西,並通過ghci進行測試。

講座不談,你可能會發現有趣的下面的事實(在相關錯誤的順序在你的代碼):

  • List被棄用;您應該使用Data.List
  • 沒有let是頂級定義所必需的。
  • 變量名稱必須以小寫字母開頭。
  • 通過=>將類的先決條件從類型中分離出來。
  • 頂層模塊應該主要有定義;您應該將每個where子句(特別是randomList附近的子句)與定義關聯起來,方法是將其定義爲不在模塊塊中作爲新行,或保留在與您希望與其關聯的定義相同的行上。
  • do介紹塊;塊中的那些東西應該平等地縮進,並且超過它們的上下文。
  • doYahtzee是聲明和使用,好像它有三個參數,但似乎被定義爲它只有一個。
  • read函數用於解析String。除非您知道它的作用,否則使用read來解析String可能不是您想要執行的操作 - 尤其是在用戶輸入時。
  • putStrLn只需要一個參數,而不是四個,該參數必須是String。但是,猜測您想要的內容,您可能會喜歡(!!)print函數。
  • dieRoll似乎沒有被定義在任何地方。

也有可能還有其他錯誤。在風格上,我建議您查看replicateMrandomRsforever。您可以使用hoogle來搜索他們的名字並閱讀更多關於他們的信息;在將來,您還可以使用它來搜索您希望按其類型存在的函數。

+0

感謝Daniel的輸入。我修復了代碼並編譯完成! (我編輯了我的文章)我仍然想知道如何打印顏色而不是數字。 – rexbelia 2012-03-06 06:32:18

+1

@rexbelia請將此問題歸還給舊問題,並用新問題開一個新問題。堆棧溢出旨在成爲問題和答案的長期歸檔,因此改變問題太多以至於使所有答案無效都是不好的方式。 – 2012-03-06 17:54:03