簡體   English   中英

Haskell-戰爭紙牌游戲

[英]Haskell- War card Game

我試圖編程的規則之一是:

當兩個玩家打出相同等級的牌時,就會觸發“戰爭”。 每個玩家放下三張牌,然后再翻轉一張牌。 在這最后兩張翻轉的卡片之間獲勝的人將獲得該回合中的所有卡片,包括每個玩家放下的 3 張卡片。 如果翻出的卡片再次匹配,則觸發另一場戰爭,以同樣的方式解決。

我可以在我的代碼中實現第一輪戰爭,但是我堅持的部分是當兩個玩家再次獲得相同的卡片時啟動第二輪戰爭。 我遇到的問題是,當第二輪戰爭開始時,兩個玩家將第一次戰爭的卡放在一邊,第二次戰爭時誰將獲得第二次戰爭和第一次戰爭的所有卡。 我不知道如何讓我的戰爭功能存儲第一輪卡片,正如你在我的中看到的那樣,否則我只是從第一輪丟棄了卡片。

war :: ([Int], [Int]) -> ([Int], [Int])
war (x:xs,y:ys)
 | head(drop 3 xs) > head(drop 3 (ys))  = (drop 4 (xs) ++ player1Pot (x:xs) ++ player2Pot (y:ys), drop 4 (ys))
 | head(drop 3 xs) < head(drop 3 (ys))  = (drop 4 (xs), drop 4 (ys) ++ player2Pot (y:ys) ++ player1Pot (x:xs))
 | otherwise  = war (drop 4 (xs),drop 4 (ys))

standardRound :: ([Int], [Int]) -> ([Int], [Int])
standardRound ([],y:ys) = ([],y:ys)
standardRound (x:xs,[]) = (x:xs,[])
standardRound (x:xs,y:ys)
 | x > y            = (xs ++ [y] ++ [x], ys)
 | y > x            = (xs, ys ++ [x] ++ [y])
 | otherwise        = war (x:xs,y:ys)

war函數添加另一個參數。

war :: ([Int],[Int]) -> ([Int],[Int]) -> ([Int],[Int])
war (px,py) (x,y) = let
  [(xp',(xc:xr)),(yp',(yc:yr))] = map (splitAt 3) [x,y]
  in case xc `compare` yc of
    GT -> (xr ++ px ++ xp' ++ [xc] ++ py ++ yp' ++ [yc], yr)
    LT -> (xr, yr ++ py ++ yp' ++ [yc] ++ px ++ xp' ++ [xc])
    EQ -> war (px ++ xp' ++ [xc], py ++ yp' ++ [yc]) (xr,yr)

在來自standardRound函數的調用中:第一個參數應該是([],[]) ,在遞歸調用中它應該是卡片列表。

您可以使用let ... in來提取元組的值

| otherwise = let (newxs,newys) = war (drop 4 xs, drop 4 ys) in
              (take 3 xs ++ newxs, take 3 ys ++ newys)

以便您可以返回修改后的版本。 隨心所欲地在之前或之后添加掉落的卡片。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM