以下代码是尝试使用lodash fp制作我的2048版本(游戏)的开始。我习惯了普通的洛达斯,但这是我第一次接触fp口味。
它使用两个功能实现将一行的瓷砖向右推的操作:
幻灯片
将该行向右推,前提是有空格(由值0表示)。实际上,这相当于把所有的零放在左边。合并
合并成对的相同值的连续磁贴,生成一个空空间和一个值加倍的新磁贴。(从那一步)。这些函数使用_。减少右
方法,该方法从右向左遍历磁贴。
import _ from "lodash/fp";
let game = [[2, 2, 0, 0], [4, 0, 4, 0], [8, 0, 0, 8], [16, 16, 0, 0]]; // Sample state
let slide = _.flow(
_.reduceRight(
(v, acc) =>
v === 0 ? [_.concat(acc[0], v), acc[1]] : [acc[0], _.concat(v, acc[1])],
[[], []]
),
_.flatten
);
let merge = _.flow(
_.reduceRight(
(v, acc) => {
acc[0].unshift(v);
if (acc[0].length === 2) {
if (acc[0][0] === acc[0][1]) {
acc[1] = _.concat(0, _.concat(acc[0][0] + acc[0][1], acc[1]));
acc[0] = [];
} else {
acc[1] = _.concat(acc[0].pop(), acc[1]);
}
}
return acc;
},
[[], []]
),
_.flatten
);
// Moves one line
let moveLine = _.flow(
slide,
merge,
slide
);
// Moves the 4 lines
let moveBoard = _.map(moveLine);
moveLine
似乎工作正常。例如,moveLine(游戏[0])
将[2,2,0,0]
转换为[0,0,4]
。
奇怪的是,moveBoard(游戏)
(将moveLine
映射到4行上)给出了一个奇怪的结果,每次迭代都会变长,就好像前面步骤的结果被追加了一样:
[
[0,0,0,4],
[0,0,0,0,0,0,8,4],
[0,0,0,0,0,0,0,0,0,16,8,4],
[0,0,0,0,0,0,0,0,0,0,0,0,32,16,8,4]
]
我看到问题来自于合并
,但我真的看不出这里发生了什么。
我已经打开了一个GitHub问题,问题的简化版本是:https://github.com/lodash/lodash/issues/4287.
lodash创始人John David Dalton给出的简短回答:
对于fp合成,累加器不会为每个合成的还原函数创建新的累加器。这就是为什么要用fp创建一个无突变的累加器版本。concat()可以工作。
更改move
方法以删除前4个元素。
因为一些奇怪的原因,每次合并
的迭代
ReduceRight的acc[1]与其中的前一个数组相同
这个补丁可以修复它
let take = arr => arr.slice(0,4);
// Moves one line
let moveLine = _.flow(
slide,
merge,
take
);
这里是一个Runkit与实现
https://runkit.com/naor-tedgi/5ccf0862b0da69001a7db546
如果我们使用<code>系统使用本机库。loadLibrary()然后<code>SupportMapFragment。它在没有任何stacktrace的情况下实现了这一点。这是我能收集到的最好的日志: 我花了几天时间试图了解导致它的原因,似乎如果我们删除调用,即不使用我们的本机lib,那么就可以正常工作。有什么方法可以在不删除我们的本机lib的情况下解决它吗? 编辑:我创建了一个示例应用程序来重
我有以下代码来解析一个JSON文件: 要处理以下JSON文件: 如果我执行此代码,我将收到以下错误: 所以我开始一步一步地调试应用程序,看看part processing()中的哪个代码部分抛出了这个异常。令人惊讶的是,那里的所有代码都正常执行:没有抛出异常,也没有返回结果I except。 更让我惊讶的是,当我稍微改变第一种方法的代码时,它可以在不产生异常的情况下工作。 我不知道println方
我在http://www.nodebeginner.org上读了一篇教程,我在数据输出中有一个奇怪的行为。我知道,Stackoverflow也有类似的问题,但没有答案。所以我有这个Web-Server的代码: 调用RequestHandler.Upload的Router.js代码-我的buggy函数 和RequestHandler.Upload的代码 假设POST数据中有一个字符串。该函数的第一行
这个程序打印00,但是如果我注释掉a.store和b.store,而取消注释a.fetch_add和b.fetch_add,这做了完全相同的事情,即都设置了a=1,b=1的值,我永远不会得到00。 是我错过了什么,还是“00”按标准永远不会出现? 下面打印00。 下图从不打印00 再看看这个,多线程原子a b打印00 for memory_order_refield
我正在编写一个DocumentFilter,它将输入JTextField的所有单词“top”替换为逻辑top符号。 使用此代码很好,但是它很烦人,因为用户必须重新键入他们的空间,他们可以这样做,并且文本继续在同一行上 当用户继续键入文本时,使用此代码并在空格中添加替换符会导致顶部符号和JTextField中的所有文本稍微向上推,然后转到下面并开始一行新的内容 有人能解释一下这种行为,并希望能提供一
我在做Maven项目。我用log4j做了一个日志。但它在给定的文件中显示了一些starnge日志。我试图理解,为什么会出现这种奇怪的日志,但我不明白。请帮助我,为什么这些不需要的行会进入日志文件。 请帮我把这个拿开。 log.properties 我通过阅读这个链接创建了这个文件。 代码是 日志txt-(log.txt的一些起始行)