gpt4 book ai didi

javascript - 与玻璃钢战斗

转载 作者:数据小太阳 更新时间:2023-10-29 05:22:41 25 4
gpt4 key购买 nike

我读过有关 FRP 的文章,感到非常兴奋。它看起来很棒,所以你可以编写更多高级代码,一切都更可组合,等等。

然后我尝试用从普通 js 到 Bacon 的几百个 sloc 重写我自己的小游戏。

而且我发现,与其编写仅包含高级逻辑的代码,我实际上击败了 Bacon.js 及其对原则的遵守。

我遇到了一些主要干扰干净代码的头痛

  1. .take(1)

与其获取值(value),不如创建丑陋的结构。

  1. 循环依赖

有时他们应该符合逻辑。但是在 FRP 中实现它是可怕的

  1. 活跃状态

即使是 bacon.js 的创建者也有 troubles与它。


这里的例子是演示问题的代码和平:

任务是不允许两个玩家呆在同一个地方

用 bacon.js 实现

http://jsbin.com/zopiyarugu/2/edit?js,console

function add(a) {return function(b){return a + b}}
function nEq(a) {return function(b){return a !== b}}
function eq(a) {return function(b){return a === b}}
function always(val) {return function(){return val}}
function id(a){return a}

var Player = function(players, movement, initPos){
var me = {};
me.position = movement
.flatMap(function(val){
return me.position
.take(1)
.map(add(val))
})
.flatMap(function(posFuture){
var otherPlayerPositions = players
.filter(nEq(me))
.map(function(player){return player.position.take(1)})
return Bacon
.combineAsArray(otherPlayerPositions)
.map(function(positions){
return !positions.some(eq(posFuture));
})
.filter(id)
.map(always(posFuture))
})
.log('player:' + initPos)
.toProperty(initPos);
return me;
}

var moveA = new Bacon.Bus();
var moveB = new Bacon.Bus();

var players = [];
players.push(new Player(players, moveA, 0));
players.push(new Player(players, moveB, 10));

moveA.push(4);
moveB.push(-4);
moveA.push(1);
moveB.push(-1);
moveB.push(-1);
moveB.push(-1);
moveA.push(1);
moveA.push(-1);
moveB.push(-1);

我要演示的是:

  1. me.positions 有自己的依赖
  2. 理解这段代码并不容易。 Here是势在必行的执行。而且看起来更容易理解。我花了更多时间在培根实现上。结果我不确定它是否会按预期工作。

我的问题:

可能我错过了一些基本的东西。也许我的实现不是 FRP 风格?

也许这段代码看起来不错,只是不习惯新的编码风格?

还是这个众所周知的问题,我应该选择万恶之源?所以像描述的那样 FRP 的问题,或者 OOP 的问题。

最佳答案

在尝试使用 Bacon 和 RxJs 编写游戏时,我也有过类似的经历。具有独立性的事物(如玩家的位置)很难以“纯 FRP”方式处理。

例如,在我早期的 Worzone 游戏中,我包含了一个可变的 targets可以查询玩家和怪物位置的对象。

另一种方法是像 Elm 人员那样做:将完整的游戏状态建模为单个属性(或 Elm 中称为信号),并根据该完整状态计算下一个状态。

到目前为止,我的结论是 FRP 不太适合游戏编程,至少在“纯粹”的方式上是这样。毕竟,对于某些事情,可变状态可能是更可组合的方法。在一些游戏项目中,例如 Hello World Open 赛车,我使用了可变状态,例如用于存储状态的 DOM 和用于传递事件的 EventStreams。

因此,Bacon.js 不是 Elixir 。我建议你自己弄清楚,哪里应用FRP,哪里不应用!

关于javascript - 与玻璃钢战斗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29563960/

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