下面的代码是尝试使用 lodash- fp制作我的 2048 版本(游戏)的开始。我习惯了常规的 lodash,但这是我第一次接触 fp 的味道。
它使用两个函数实现将一行的瓷砖向右推的动作:
slide
如果有空格(由值 0 表示),则将行向右推。实际上,这相当于把所有的零都放在左边。merge
合并成对的相同值的连续图块,生成一个空白空间和一个新的值加倍的图块。(在清除该步骤可能产生的零slide
之后第二次调用)。merge
这些函数使用_.reduceRight
从右到左迭代图块的方法。
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(game[0])
转换[2, 2, 0, 0]
为[0, 0, 0, 4]
.
奇怪的是,moveBoard(game)
(映射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]
]
我看到问题来自merge
,但我真的看不到这里发生了什么。