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

JS骰子游戏开发问题:重复检测逻辑异常排查

JS骰子游戏重复判定问题的修复方案

核心问题分析

你的代码出现"当前掷骰数组与历史数组始终相同"的问题,根源在于几个基础的JS引用类型和变量操作错误:

  • 数组引用复用:current始终是同一个数组对象,每次修改它的元素时,prevs中存储的数组也会同步变化(因为存的是引用),导致每次比对都判定为重复。
  • 数组长度未重置:每次循环只修改current[0]并push新元素,导致current长度越来越长,和历史记录的数组结构不一致。
  • 变量初始化遗漏:breaker未初始化为数值,导致紧急停止逻辑失效;prevs初始包含空数组,属于无效历史记录。
  • 随机数范围错误:dice()函数生成的是0-8的数,而非预期的1-9。

修正后的完整代码

var cnt = 0; // 成功计数
var prevs = []; // 存储唯一掷骰记录的二维数组
var breaker = 0; // 循环紧急 stopper,初始化为0
var goal = 5;

function compare(current) {
    // 遍历历史记录,检查是否存在完全匹配的数组
    for (var i = 0; i < prevs.length; i++) {
        if (compareArrays(current, prevs[i])) {
            return 0; // 找到重复,返回0
        }
    }
    prevs.push([...current]); // 存入当前数组的副本,避免引用问题
    return 1; // 无重复,返回1
}

function compareArrays(a, b) {
    // 先检查长度是否一致,再比对内容
    if (a.length !== b.length) return false;
    for (var i = 0; i < a.length; i++) {
        if (a[i] !== b[i]) return false;
    }
    return true;
}

function dice() {
    // 生成1-9的随机整数
    var min = 1;
    var max = 9;
    return Math.floor(Math.random() * (max - min + 1)) + min;
}

function main() {
    while (cnt < goal) {
        breaker++;
        if (breaker > 50) {
            console.log("触发紧急停止");
            break;
        }
        // 每次循环创建新的current数组,避免引用复用
        var current = [dice(), dice()];
        
        var unique = compare(current);
        if (unique) {
            console.log(`Rolled unique: ${current},当前计数:${++cnt}`);
        } else {
            console.log(`Rolled duplicate: ${current},重试中`);
        }
    }
}

main();

关键修改说明

  1. 数组引用问题修复:

    • 每次循环创建新的current数组(var current = [dice(), dice()]),不再复用同一个数组。
    • 存入prevs时使用数组扩展运算符[...current]创建副本,确保历史记录不会被后续修改影响。
  2. 数组长度与初始化修复:

    • 删除prevs初始的空数组,改为prevs=[]。
    • breaker初始化为0,确保紧急停止逻辑正常工作。
  3. 比对函数优化:

    • compareArrays先检查数组长度是否一致,再逐个元素比对,比JSON.stringify更高效且避免特殊值的序列化问题。
    • compare函数改为接收current参数,逻辑更清晰。
  4. 随机数范围修正:

    • dice()调整公式,生成1-9的随机整数,符合常规骰子的数值范围。
  5. 冗余代码清理:

    • 删除重复声明的cnt变量,简化变量定义。

内容的提问来源于stack exchange,提问作者ze hai liu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 07:32:12