gpt4 book ai didi

list - Haskell - 我如何迭代和比较?

转载 作者:行者123 更新时间:2023-11-30 23:49:10 24 4
gpt4 key购买 nike

我有一个问题。我目前正在学习 Haskell,并尝试构建一个地牢游戏。

目前我正在尝试为玩家实现一个移动功能。在移动到新位置之前,我必须检查玩家的新位置是否会与游戏 map 上物体的位置发生碰撞。

我脑海中的代码(Java/C 语言)相当简单,但我无法想象它如何跨入 Haskell。我很确定有一种使用 Haskell 代码的替代方法,但这是粗略的想法 (Java/C):-

让我们假设玩家对象有 x 和 y 坐标。我们还假设我们将玩家可能会碰撞的其他对象的列表存储在一个数组中(我假设这将存储在 Haskell 的列表中)。此外,假设每个对象都有一个 x 和 y 坐标。如果碰撞将发生,则 bool 函数返回 true,否则返回 false

   Boolean detectCollision(Player p, Object[] o)
{
for(int i=0; i < o.length; i++){
if(p.x==o[i].x && p.y==o[i].y){
return true;
}
} return false;
}

如果有人能帮我解决这个问题,我将不胜感激。

最佳答案

即使这是 Java/C,我也建议您编写一个函数来检测玩家和单个对象是否会发生碰撞,所以让我们在这里这样做:

collidesWith :: Player -> Object -> Bool
collidesWith player object =
playerX player == objectX object && playerY player == objectY object

这有点罗嗦,您可以使用 lens 库缩短它,让它看起来像

collidesWith player object
= player^.x == object^.x && player^.y == object^.y

但这超出了这个问题的范围,只要知道它在 Haskell 中是完全可能的。

对于 Haskell 中的列表“循环”,您可以使用递归

detectCollision player [] = False  -- No objects, no collisions
detectCollision player (o:objects)
= player `collidesWith` o || detectCollision player objects

由于 Haskell 是惰性的,第一次 player `collidesWith` o 评估为 True 时它将停止检查。但这实际上已经作为名为 any 的标准内置函数存在:

any :: (a -> Bool) -> [a] -> Bool

可以用作

detectCollision player objects = any (collidesWith player) objects

Haskell 甚至允许您通过减少 eta 删除 objects 参数,因此它可以简单地写成

detectCollision :: Player -> [Object] -> Bool
detectCollision player = any (collidesWith player)

就是这样!

注意:这是假设 PlayerObject 定义为

data Player = Player
{ playerX :: Int
, playerY :: Int
} deriving (Eq, Show)

data Object = Object
{ objectX :: Int
, objectY :: Int
} deriving (Eq, Show)

关于list - Haskell - 我如何迭代和比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33621855/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com