gpt4 book ai didi

haskell - 在纯函数式编程构建的游戏中,一个玩家如何对另一个玩家造成伤害(改变状态)?

转载 作者:行者123 更新时间:2023-12-04 10:52:43 25 4
gpt4 key购买 nike

关闭。这个问题需要更多 focused .它目前不接受答案。












想改进这个问题?更新问题,使其仅关注一个问题 editing this post .


8年前关闭。







Improve this question




除了纯函数的概念,我对函数式编程知之甚少。在 John Carmack 的 2013 Quakecon 演讲中,他提到了与游戏相关的函数式编程经常被问到的一个问题:如果您无法访问状态,您如何开枪并对其他玩家造成伤害? (意译)在提到事件系统的一些事情时,我不太明白,因为在我看来,事件系统仍然需要状态?

如何用一种纯粹的函数式语言来实现这一点?

最佳答案

重复我最喜欢的一句话

... takes in the state of the world and returns a new world, thus remaining pure.



这是在谈论 Clean,Haskell 的表弟,但它仍然是相关的。它的要点是,你是对的,你需要某种状态,但它不必是可变的。考虑
myFun :: StateOfTheWorld -> a -> (StateOfTheWorld, b)

所以我们不修改状态,我们只是产生一个新的。这是参照透明的,因为给定相同的世界状态和相同的 Action ,您将得到相同的东西。

对你来说,你可能有类似的东西
 killPlayer :: Game -> Event -> Game
killPlayer g (Kill x) = g { isDead = x : isDead g }

这只是对记录使用功能更新。这有点笨拙,所以我们可能会做类似的事情
 killPlayer :: Game -> Event -> Action
killPlayer (PlayerDamaged x amount) = if playerHealth g x <= amount
then KillPlayer x
else ReduceHealth x amount

所以我们只返回差异,而不是完整的游戏状态。

这有效,但很难看。所以我们用 do 美化它表示法和 Control.Monad.State。这听起来很可怕,但这正是我们在上面所做的,只是有更多的句法抽象。其实这就是 IO也在 GHC 上。我不知道你是否了解过 Monads,但 State monad 通常是一个鼓舞人心的例子。

最后回到游戏,我见过的许多游戏框架都是这样的:一堆东西监听事件,然后建议对游戏状态进行一些小的增量更改并返回不同的,最后框架本身进行适当的 openGL 调用或任何实现这些更改的方法。

关于haskell - 在纯函数式编程构建的游戏中,一个玩家如何对另一个玩家造成伤害(改变状态)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18031977/

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