如何修复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; };
为什么这样修改?
- Set优化:把玩家的操作数组转成
Set,查找元素的时间复杂度从O(n)降到O(1),当操作次数多的时候性能更好。 - 逻辑调整:
data.some(...):只要有一个获胜组合满足条件就返回truewinCombo.every(move => moveSet.has(move)):检查当前获胜组合的每一个元素,是否都能在玩家的操作集合中找到
测试示例
比如玩家的操作数组是['2','5','1','9'],函数会检测到它包含['1','5','9']这个获胜组合,返回true,正确判定玩家获胜。
内容的提问来源于stack exchange,提问作者Shaurya Chauhan
相关产品推荐
相关产品推荐

