我正试图在Haskell中实现一个多层次的游戏。每个级别都有不同的但广义的博弈状态。我们可以定义游戏状态如下-
type Player = (Float, Float) -- Player coordinates
data State a = State Player a Bool在这里,a是环境。在一个级别上,它被定义为String,而在另一个级别,它被定义为([Int], [Int])。Bool确定级别是否完成。
我实现了两个不同的函数,它们使用来自play的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函数可以作为值传递,显然有一种方法可以将主函数从lv1更改为lv2,但我无法理解这一点。
一个解决方案,或者是一个关于如何推广和正确处理这个问题的想法,将是非常好的。
发布于 2022-07-06 13:57:39
我决定写我最后是如何解决这个问题的,因为其他人可能面临着和我一样的问题-
首先,我更改了State数据,使其成为一个更好地在不同级别之间进行转换的通用系统。因此,与当前的State a数据不同,我现在有了State,但是有了一个新的参数Level
type Player = (Float, Float) -- Player coordinates
-- data State a = State Player a Bool
data State = State {
getPlayer :: Player,
getLevel :: Level,
levelCompleted :: Bool
}
data Level = Lv1 String | Lv2 ([Int], [Int])然后,我需要相应地修复特定于级别的函数。例如-
updateLv1 :: Float -> State -> State
-- If com is true then level is complete
updateLv1 _ (State player (Lv1 st) com) =
if com then State (0,0) ([1,2,3,4], [0,0,0,0]) False
else
...
...
updateLv1 time state = commonUpdater time state绘图和事件处理程序也是如此。
最后我不得不修复那些普通的处理程序-
commonUpdater time state = case getLevel state of
Lv1 _ = updateLv1 time state
Lv2 _ = updateLv2 time state我还必须实现commonHandler和commonDrawer。这个过程几乎是一样的。
最后,游戏功能变得简单了。我只需初始化Lv1状态,rest将由公共函数处理-
game :: IO()
game = play window black 90 (State (0,0) (Lv2 "Hello") False) commonDrawer commonHandler commonUpdater
main :: IO()
main = game就这样!
发布于 2022-07-02 12:55:21
当您说级别可以有不同的类型时,您玩这些级别的游戏代码必须解释和修改此状态值。因此,游戏中必须有从String到某些类型的函数,以及从([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://stackoverflow.com/questions/72836446
复制相似问题