我正在嘗試在 Haskell 中實作具有多個級別的游戲。每個級別都有不同但概括的游戲狀態。我們可以像下面這樣定義游戲狀態 -
type Player = (Float, Float) -- Player coordinates
data State a = State Player a Bool
這里,a是環境。在一個級別中,它被定義為String,而在另一個級別中,它被定義為([Int], [Int])。布林值確定關卡是否完整。
我實作了兩個使用playfrom 的不同功能Graphics.Gloss.Interface.Pure.Game。我可以將任何這些功能注入main并單獨播放它們。例如-
lv1 = play window black 90 (State (0,0) "Hello" False) drawLv1 handleLv1 updateLv1
lv2 = play window black 90 (State (0,0) ([1,2,3,4], [0,0,0,0]) False) drawLv2 handleLv2 updateLv2
main :: IO()
main = lv1
-- main = lv2
但是,我想以某種方式從 lv1 轉到 lv2。我知道 Haskell 函式可以作為值傳遞,顯然有一種方法可以將 main 函式從lv1to更改,lv2但我無法弄清楚。
一個解決方案或者一個關于如何正確概括和處理問題的想法會非常好。
uj5u.com熱心網友回復:
當您說關卡可以有不同的型別時,您播放關卡的游戲代碼必須以某種方式解釋和修改此狀態值。所以你的游戲中必須有從aString到某些型別的函式,以及從a([Int], [Int])到相同型別的等效函式。
如果是這樣,那么您需要將這些函式放在一個類中:
class MyGameState a where
someFunction :: a -> Int
someOtherFunction :: a -> Thing
updateGameState :: Int -> a -> a
instance MyGameState String where
someFunction str = .....
someOtherFunction str = ......
updateGameState n oldState = ......
同樣對于instance MyGameState ([Int],[Int]). someFunction然后您可以使用和定義您的游戲功能someOtherFunction。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/498431.html
