2012-03-06 10 views
1

私は、ランダムに生成されたサイコロを、ユーザーがプレイするごとに吐き出しようとしています。ユーザーは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'ステートメントの後のすべての行を関数内でインデントする必要があります。 –

+0

私はそれを字下げしましたが、上に正しく表示されていません。とにかく、メインの字下げ問題を解決しましたが(まだタプルのリストのためにそれを持っていますが)、 "roll:"と入力すると "Exception:Prelude.read:no parse"エラーが発生します。 – rexbelia

+0

最大限の助力を得るには、実際に使用するコード、字下げを投稿してください。 –

答えて

8

このコード全体に振りかけエラーの多くは、一度に全部を構築しようとしたことを私に示唆している、本当にあります。これは災害のレシピです。あなたは非常に小さなものを作り、ghciで頻繁にテストするべきです。

講義はさておき、あなたは(あなたのコード内の関連するエラーのために)面白い、以下の事実を見つけるかもしれない:

  • Listが廃止されました。代わりにData.Listを使用してください。
  • いいえletは最上位レベルの定義に必要です。
  • 変数名は、小文字で始まる必要があります。
  • クラスの前提条件は、タイプと=>で区切られています。
  • トップレベルのモジュールブロックには、主に定義が必要です。すべてのwhere節(特にrandomListに近いもの)を、モジュールブロックの新しい行にならないようにインデントするか、または関連付ける定義と同じ行に保持するかのいずれかで、定義に関連付ける必要があります。
  • doはブロックを導入します。ブロック内のそれらのものは、それらのコンテキストよりも等しくインデントされるべきです。
  • doYahtzeeは3つの引数を持つかのように宣言され、使用されますが、あたかも1つの引数しか持たないかのように定義されています。
  • read関数は、Stringの解析に使用されます。あなたが何をしているのか分からない限り、Stringを別のStringから解析するためにreadを使用することは、おそらくあなたのやりたいことではないでしょう。
  • putStrLnは、4つではなく1つの引数をとり、その引数はStringでなければなりません。しかし、あなたがここで望んでいたものを推測すると、(!!)printの機能が好きかもしれません。
  • dieRollはどこにも定義されていないようです。

他にもエラーがある可能性があります。文体的には、replicateMrandomRsforeverをチェックアウトすることをおすすめします。 hoogleを使用すると、名前を検索して詳細を読むことができます。将来的には、そのタイプによって存在したい機能を検索するためにも使用することができます。

+0

ダニエル入力をありがとう。コードを修正してコンパイルしました! (私は私の投稿を編集しました)私はまだ数字の代わりに色を印刷する方法を知りたいと思います。 – rexbelia

+1

@rexbeliaこの問題を古い問題に戻して、新しい問題を新しい質問にしてください。スタックオーバーフローは、質問と回答の長期的なアーカイブであることが意図されています。そのような質問を変更してすべての回答を無効にするのは悪いスタイルです。 –