javascript - 2048 : Strange behaviour of reduceRight in map with lodash/fp

标签 javascript functional-programming lodash 2048

以下代码是尝试使用 lodash-fp 制作我的 2048(游戏)版本的开始。习惯了普通的 lodash,但这是我第一次接触 fp flavor 。

它实现了将一行的tile向右推的 Action ,使用了两个函数:

  • slide 将行推到右边,前提是有空格(用值 0 表示)。实际上,这相当于将所有零放在左边。
  • merge 合并成对的具有相同值的连续图 block ,生成一个空白空间和一个具有双倍值的新图 block 。 (在 merge 之后第二次调用 slide 以清除该步骤可能产生的零)。

这些函数使用 _.reduceRight 方法,该方法从右到左遍历图 block 。

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,但我真的看不出这里发生了什么。

最佳答案

更改 move 方法以删除前 4 个元素。

对于 merge 的每次迭代都有一些奇怪的原因

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

关于javascript - 2048 : Strange behaviour of reduceRight in map with lodash/fp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55993497/

相关文章:

scala - scala 编译器对类型系统内的单元类型有什么特殊的规则

javascript - 从嵌套对象数组中获取具有空值的对象

javascript - javascript 函数表达式是否类似于或基于 s 表达式?

javascript - 如果具有相同的 id,如何将数组对象值合并到数组

javascript - 如何根据父id和级别[ag-grid]对行类别数据进行排序

javascript - 永久夜间模式切换

JavaScript:显示图形,如 rect()、triangle()、ellipse() 等

javascript - 如何在不重新编译的情况下使用 ASP.NET 捆绑和缩小?

javascript - 无法管理我网站上的 Facebook 评论

haskell - 如何结合二元和一元函数来获得折叠的阶跃函数?