【发布时间】:2022-01-22 02:56:43
【问题描述】:
我在 Haskell 做一个小项目,我很难检查 [Moviment] 中是否有循环。
data Moviment = goLeft | goRight | Jump | Box
deriving (Show, Read, Eq, Ord)
goLeft -> 使玩家向左移动 goRight -> 使 玩家向右移动 Jump -> 让玩家跳一个盒子或一个 Block Box -> 让玩家加载或卸载 Box
data Piece = Block | Box | Door | Empty
deriving (Show, Read, Eq, Ord)
起初我创建了一个代码,用于查看[goRight, goLeft, goRight] 或 [goLeft, goRight, goLeft]是否在Moviment的列表中。
verificaEliminar :: [Moviment] -> [Moviment] -> Bool
verificaEliminar (x:y:z:[]) l = if(length l < 3)
then False
else if(x == head l && y == head (tail l) && z == head (tail (tail l)))
then True
else verificaEliminar (x:y:z:[]) (tail l)
verificaEliminar _ _ = False
eliminaLoops :: [[Moviment]] -> [Moviment] -> [[Moviment]]
eliminaLoops (h:t) m = if(verificaEliminar m h == True)
then eliminaLoops t m
else h : eliminaLoops t m
eliminaLoops _ _ = []
但我很快意识到我可以有一个地图,我需要查看玩家的第 1 和第 3 位置是否相同。意思是他没有摔倒。
x :: Mapa
x = [[Bloco, Vazio, Vazio, Vazio, Vazio, Vazio],
[Vazio, Bloco, Vazio, Vazio, Vazio, Vazio],
[Vazio, Vazio, Vazio, Bloco, Vazio, Vazio],
[Vazio, Vazio, Vazio, Bloco, Vazio, Vazio],
[Vazio, Vazio, Bloco, Vazio, Vazio, Vazio],
[Vazio, Vazio, Vazio, Vazio, Vazio, Vazio],
[Vazio, Vazio, Vazio, Vazio, Vazio, Vazio],
[Vazio, Vazio, Vazio, Vazio, Porta, Vazio],
[Bloco, Bloco, Bloco, Bloco, Bloco, Bloco]]
如果需要更多信息:
data Direction = West | East
deriving (Show, Read, Eq, Ord)
data Player = Player Coordinates Direction Bool
deriving (Show, Read, Eq, Ord)
data Game = Game Map Player
deriving (Read, Eq)
type Coordinates = (Int, Int)
【问题讨论】:
-
您好,感谢您提供有关当前代码的详细信息。您能否进一步详细说明您遇到的问题到底是什么?目前尚不清楚您在这个问题中需要什么帮助
-
嘿,我在检查 [Moviment] 中是否存在循环时遇到问题,向右走,向左走,然后再次返回到相同的运动并重复 N 次。例如,我给了 10 个最大机会来解决游戏(玩家走到门口)并且代码生成 Jump、goRight、goRight、go Left、goRight、go Left、goRight、go Left 意味着玩家总是返回到特定位置
标签: list loops haskell project