gpt4 book ai didi

list - F#:存储和映射函数列表

转载 作者:行者123 更新时间:2023-12-05 01:29:56 30 4
gpt4 key购买 nike

我有许多在游戏中发生的事件。我想控制这些事件发生的时间和顺序。

例如:

事件 1:在屏幕上显示一些文本 N 帧并播放声音效果

事件2:清除屏幕上的文字

我的解决方案(也许有更好的解决方案)是有一个包含事件的函数列表。事件执行它们的行为,然后返回在游戏中发生的下一个事件。我想到了使用 List.map 或 List.collect,因为我实际上是在执行一些行为代码时将事件列表映射到新的事件列表。

在上面的例子中,Event1 可以由两个函数组成:一个显示文本,一个播放声音(因此需要一个列表)。显示文本的函数将返回 N-1 帧的自身副本,然后返回 Event2 清除文本。播放声音函数将返回相当于无操作。

如果这是一个好的解决方案,我可能会在 C++ 或 C# 中完成。我的目标是在 F# 中做一个等效或更好的解决方案。

最佳答案

你的意思是这样的吗?

let myActions =
[fun () -> printfn "You've woken up a dragon."
fun () -> printfn "You hit the dragon for 0 points of damage."
fun () -> printfn "The dragon belches."
fun () -> printfn "You have died."]

let actionBuilder actionList =
let actions = ref actionList
fun () ->
match !actions with
| [] -> ()
| h::t -> h(); actions := t

用法(F# 交互):

> let doSomething = actionBuilder myActions;;

val doSomething : (unit -> unit)

> doSomething();;
You've woken up a dragon.
val it : unit = ()
> doSomething();;
You hit the dragon for 0 points of damage.
val it : unit = ()
> doSomething();;
The dragon belches.
val it : unit = ()
> doSomething();;
You have died.
val it : unit = ()
> doSomething();;
val it : unit = ()
>

**编辑:**如果您希望能够添加 Action ,也许最好制作一个在内部使用队列的 Action 分配器,因为附加是 O(N) 与列表和 O(1) 与队列:

type actionGenerator(myActions: (unit->unit) list) =
let Q = new System.Collections.Generic.Queue<_>(Seq.ofList myActions)

member g.NextAction =
fun () ->
if Q.Count = 0 then ()
else Q.Dequeue()()

member g.AddAction(action) = Q.Enqueue(action)

关于list - F#:存储和映射函数列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1779859/

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