2012-10-02 26 views
1

我正在寫一個Cardguess遊戲,用戶在這裏設置答案並讓PC猜測。對於我的項目,輸入卡號爲2.Haskell Cardguess遊戲

然後,我需要編寫cardguess算法。 我已經創建了卡模塊。

data Suit = Club | Diamond | Heart | Spade 
     deriving (Eq, Ord, Bounded, Enum) 

suitchars = "CDHS" 

data Rank = 
    R2 | R3 | R4 | R5 | R6 | R7 | R8 | R9 | R10 | 
    Jack | Queen | King | Ace 
     deriving (Eq, Ord, Bounded, Enum) 

rankchars = "23456789TJQKA" 

data Card = Card {suit::Suit, rank::Rank} 
     deriving (Eq, Bounded) 

instance Ord Card where 
    compare (Card s1 r1) (Card s2 r2) = 
     let suitorder = compare s1 s2 
      in if suitorder == EQ then compare r1 r2 else suitorder 

instance Enum Card where 
    fromEnum (Card s r) = (fromEnum s)*13 + (fromEnum r) 
    toEnum n = (Card s r) 
    where s = toEnum (n `div` 13) 
      r = toEnum (n `mod` 13) 

而我的策略是將Suit和Rank分成兩部分。最初的猜測可能是Card Club R5,Card Heart Jack

然後我會給出反饋,並據此,我會嘗試nextGuess,等到目前爲止,直到得到正確的答案。

我寫了initialGuess函數。

我把其餘的卡在GameState。我想寫nextGuess的代碼。

nextGuess :: ([Card],GameState) -> (Int,Int,Int,Int,Int) ->([Card],GameState) 

(Int,Int,Int,Int,Int)是反饋值。 我怎麼能代表第一個參數([Card],GameState),這意味着以前的猜測卡和以前的GameState

+0

你問*「我怎麼能代表第一個參數'([卡],遊戲狀態)'」 * 。我不明白你的意思。請澄清。第一個參數是*「先前的猜測牌和先前的」GameState「*的表示。 – dave4420

+0

我怎麼能得到以前的卡和gamestate ..好像是遞歸的 – Chwa

+0

這將是一段代碼,調用'nextGuess'的關注。就「nextGuess」而言,它只是一個參數,與'card_number'相同的是'initialGuess'。你的問題真的是關於如何調用nextGuess? – dave4420

回答

1

因爲我不明白你的問題,你是初學者,我會挑選你的文章的其他領域。

  1. 你有

    initialGuess card_number 
        | card_number == 2 = ((Card Club R5):(Card Heart J),cardDeck) 
    

    接受,你只需要initialGuess 2爲現在的工作,你有列表語法錯誤。你的意思是要麼

    initialGuess card_number 
        | card_number == 2 = (Card Club R5 : Card Heart J : [], cardDeck) 
    

    initialGuess card_number 
        | card_number == 2 = ([Card Club R5, Card Heart J], cardDeck) 
    

    它們的意思是一樣的東西,但後者更清晰。

  2. 你有

    instance Ord Card where 
        compare (Card s1 r1) (Card s2 r2) = 
         let suitorder = compare s1 s2 
          in if suitorder == EQ then compare r1 r2 else suitorder 
    

    如果import Data.Monoid,你可以這樣寫更多的只是作爲

    instance Ord Card where 
        compare (Card s1 r1) (Card s2 r2) = compare s1 s2 `mappend` compare r1 r2 
    

    但更好的是要離開它,並要求編譯器把它寫了你,而不是:

    data Card = Card {suit::Suit, rank::Rank} 
         deriving (Eq, Ord, Bounded) 
    

    生成的Ord實例使用le按照您的要求,採用xicographical排序。

+0

我的意思是,我可以在哪裏獲得以前的紙牌和遊戲狀態,我應該創建另一個功能嗎? – Chwa

+0

是的,你需要創建一個函數來顯示你的猜測,收集你的反饋,並協調用適當的參數調用'initialGuess'和'nextGuess'。 – dave4420

1

這裏很難了解你的心思,但也許你想是這樣的:

startGuessing guesses state = do 
    feedBack <- readFeedback 
    let (newGuess, newState) = nextGuess (guesses, state) feedback 
    startGuessing (guesses ++ newGuess) newState 

main = do 
    let (guesses, state) = initialGuess 2  
    startGuessing guesses state