gpt4 book ai didi

f# - 功能响应式(Reactive) F# - 在游戏中存储状态

转载 作者:行者123 更新时间:2023-12-03 11:28:07 25 4
gpt4 key购买 nike

我是一名学生,目前正在使用 F# 学习功能 react 范式。这对我来说是全新的观点。昨天我学习了使用这种范例创建一个简单的乒乓球游戏。到目前为止,我掌握的想法是:我们认为值(value)是时间的函数。就其纯粹的形式而言,它是无国籍的。但是,我需要记住球(或状态)的位置。所以我总是将球的当前位置作为全局函数的参数传递。

如果我们谈论稍微复杂一点的游戏,比如 Space Invaders,我们有很多状态(外星人的位置、外星人当前的 HP、剩余的炸弹数量等)

有没有一种优雅/最好的方法来解决这个问题?我们总是将状态存储在顶层吗?是否应该将所有当前状态作为全局函数的附加输入参数给出?

任何人都可以使用 F# 上的简单示例来解释这一点吗?
非常感谢。

最佳答案

做 FRP 的方法不止一种,而且它是一个活跃的研究领域。什么是最好的很大程度上取决于事物如何相互作用的细节, future 可能会出现新的更好的技术。

从广义上讲,这个想法是让行为成为时间的函数,而不是普通的值(value)观(如你所说)。行为可以根据其他行为来定义,并且可以定义为在特定事件发生时在其他行为之间交换。

在您的示例中,您通常不需要通过参数记住球的位置(但对于某些类型的 FRP,您可能会这样做)。相反,你可以有一个行为:
ballPos : time -> (float * float)这可能具有全局范围,或者对于更大的程序,最好有一个本地范围,在该范围内使用它。

随着事情变得越来越复杂,您将以越来越复杂的方式定义行为,依赖于其他行为和事件 - 包括在不同 FRP 框架中以不同方式处理的递归依赖项。在 F# 中,对于递归依赖项,我希望您需要一个 let rec包括所有涉及的行为。这些仍然可以组织成结构 - 在顶层你可能有:

type alienInfo =  { pos : float*float; hp : float }
type playerInfo = { pos : float*float; bombs : int }
let rec aliens : time -> alienInfo array = // You might want laziness here.
let behaviours = [| for n in 1..numAliens ->
(alienPos player n, alienHP player n) |]
fun t -> [| for (posBeh, hpBeh) in behaviours ->
{pos=posBeh t; hp=hpBeh t} |] // You might want laziness here.
and player : time -> playerInfo = fun t ->
{ pos=playerPos aliens t; bombs=playerBombs aliens t}

然后可以定义alienPos,alienHP的行为,依赖玩家,而playerPos,playerBombs可以定义依赖外星人。

无论如何,如果你能提供更多关于你正在使用哪种 FRP 的详细信息,那么提供更具体的建议会更容易。 (如果你想知道哪种类型的建议——我个人建议阅读: http://conal.net/papers/push-pull-frp/push-pull-frp.pdf)

关于f# - 功能响应式(Reactive) F# - 在游戏中存储状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3350644/

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