【问题标题】:Haskell - Loops in a ListHaskell - 列表中的循环
【发布时间】: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


【解决方案1】:

一个粗略的计划是这样的:

  1. 识别每个Moviment 更新的所有状态。大概是Game,但我不是 100% 确定。

  2. 编写一个函数,根据Moviment更新所有状态;假设您将其命名为update,这样

     update :: Game -> Moviment -> Game
    
  3. 您可以使用scanl 获取与[Moviment] 的每个前缀相对应的Games 列表。

  4. 您现在可以遍历这个[Game] 寻找两个相等的状态。有多种方法可以做到这一点,但请查看nub 的来源,了解有关其中一种方法的一些提示。

一旦你让它工作起来,你就可以开始考虑重构它以提高效率。从nub 中的想法切换到ordNub 中的想法将是一个很好的第一步。您还可以考虑是否每次都需要比较整个Mapa,或者是否可以以某种方式减少在那里进行的比较量。我怀疑你也可以提出自己的想法。

【讨论】:

    猜你喜欢
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    • 2013-10-05
    • 1970-01-01
    相关资源
    最近更新 更多