You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复includesArray函数,验证操作数组是否包含获胜组合

修复includesArray函数以正确检测获胜组合

你当前的includesArray函数要求玩家的操作数组与获胜组合完全匹配(顺序、长度一致),但实际需要的是玩家的操作数组包含某一获胜组合的所有元素(不管顺序、不管是否有额外元素)。

修复思路

遍历所有获胜组合,检查每个组合的全部元素是否都存在于玩家的操作数组中——只要有一个组合满足这个条件,就判定玩家获胜。

修改后的代码

// 获胜组合
const winMoves = [
  // 横向
  ['1', '2', '3'],
  ['4', '5', '6'],
  ['7', '8', '9'],

  // 纵向
  ['1', '4', '7'],
  ['2', '5', '8'],
  ['3', '6', '9'],

  // 对角线
  ['1', '5', '9'],
  ['3', '5', '7']
];

// 修复后的检查函数
function includesArray(data, arr) {
  // 转成Set提升查找性能(可选,但推荐)
  const moveSet = new Set(arr);
  // 遍历每个获胜组合,检查是否所有元素都在玩家操作中
  return data.some(winCombo => winCombo.every(move => moveSet.has(move)));
};

// 回合逻辑(无需修改)
switch (turn) {
  // 玩家回合
  case player:
    turn = opponent;
    player.moves.push(m.customId);
    console.log(`${player.player.displayName}: ${player.moves}`);

    // 检查玩家是否获胜
    if (includesArray(winMoves, player.moves)) {
      // 这里写获胜后的逻辑,比如弹窗提示、结束游戏等
    };
    break;

  // 对手回合
  case opponent:
    turn = player;
    opponent.moves.push(m.customId);
    console.log(`${opponent.player.displayName}: ${opponent.moves}`);

    // 检查对手是否获胜
    if (includesArray(winMoves, opponent.moves)) {
      // 对手获胜逻辑
    };
    break;
};

为什么这样修改?

  1. Set优化:把玩家的操作数组转成Set,查找元素的时间复杂度从O(n)降到O(1),当操作次数多的时候性能更好。
  2. 逻辑调整:
    • data.some(...):只要有一个获胜组合满足条件就返回true
    • winCombo.every(move => moveSet.has(move)):检查当前获胜组合的每一个元素,是否都能在玩家的操作集合中找到

测试示例

比如玩家的操作数组是['2','5','1','9'],函数会检测到它包含['1','5','9']这个获胜组合,返回true,正确判定玩家获胜。

内容的提问来源于stack exchange,提问作者Shaurya Chauhan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 20:30:43