Javascript 如何确保此函数返回的数组没有任何重复项,并且不减少元素数?

Javascript 如何确保此函数返回的数组没有任何重复项,并且不减少元素数?,javascript,Javascript,我正在尝试用Javascript构建扫雷舰。为此,我需要一个函数,该函数将返回一个“单元格”数组,然后我可以使用该数组作为ID声明为“已挖掘”。结果应该是这样的:[“4-27号单元格”、“14-18号单元格”、“9-13号单元格”…]。第一个随机数是单元格所在的行,第二个随机数是列。只有16行30列,这就是数字的原因 数组的长度必须为99且不包含任何重复项。但是,此函数纯粹由于随机性而返回一些重复值。我曾尝试删除重复的,但这减少了在董事会上地雷的数量 如何使“minedCells”的值在达到99

我正在尝试用Javascript构建扫雷舰。为此,我需要一个函数,该函数将返回一个“单元格”数组,然后我可以使用该数组作为ID声明为“已挖掘”。结果应该是这样的:[“4-27号单元格”、“14-18号单元格”、“9-13号单元格”…]。第一个随机数是单元格所在的行,第二个随机数是列。只有16行30列,这就是数字的原因

数组的长度必须为99且不包含任何重复项。但是,此函数纯粹由于随机性而返回一些重复值。我曾尝试删除重复的,但这减少了在董事会上地雷的数量

如何使“minedCells”的值在达到99之前不重复

function assignMines() {
    let randoms = {
        rows: [],
        columns: []
    };

    let minedCells = [];

    for (let i = 0; i < 99; i++) {
        randoms.rows.push(Math.floor((Math.random() * 16) + 1));
        randoms.columns.push(Math.floor((Math.random() * 30) + 1));
        minedCells.push("cell-" + randoms.rows[i] + "-" + randoms.columns[i])
    }

    return minedCells;

}
函数赋值(){
设随机数={
行:[],
列:[]
};
设minedCells=[];
for(设i=0;i<99;i++){
randoms.rows.push(Math.floor((Math.random()*16)+1));
randoms.columns.push(Math.floor((Math.random()*30)+1));
minedCells.push(“单元格-”+randoms.rows[i]+“-”+randoms.columns[i])
}
返回雷区;
}

推送之前,您可以检查该值是否已在数组中:

函数赋值(){
设随机数={
行:[],
列:[]
};
设minedCells=[];
for(设i=0;i<99;i++){
设el=“cell-”+Math.floor((Math.random()*16)+1)+“-”+Math.floor((Math.random()*30)+1);
若有(矿井井包括(el)){
我--;
}否则{
矿井井推进(el);
}
}
控制台日志(minedCells);
}

转让地雷()您可以在推送该值之前检查该值是否已在数组中:

函数赋值(){
设随机数={
行:[],
列:[]
};
设minedCells=[];
for(设i=0;i<99;i++){
设el=“cell-”+Math.floor((Math.random()*16)+1)+“-”+Math.floor((Math.random()*30)+1);
若有(矿井井包括(el)){
我--;
}否则{
矿井井推进(el);
}
}
控制台日志(minedCells);
}

转让地雷()我想你开始这件事的时候走错了方向

  • 确保可以定义单元格的所有状态:

    • 开采
    • 标记
    • 透露
    • 隐藏的
  • 确保可以显示这些状态(使用手动定义的映射进行测试)

  • 确保您可以在挖掘广场附近的显示广场上显示正确的数字

  • 在解决前三个问题之后,开始考虑如何使用挖掘的单元生成贴图

  • 目前,对于解决前三个问题,尤其是第三个问题,您使用的数据结构甚至都不接近最优

    我将数据结构作为一个二维数组/单元对象集合,每个单元对象都有一个定义其状态的属性(稍后,您可能希望将其优化为仅使用表示单元状态的数字)

    但如果您坚持使用迄今为止选择的数据结构:
    let randoms={
    行:[],
    列:[]
    };
    设minedCells=[];
    函数已定义(行、列){
    返回minedCells.indexOf(“单元格-”+行+“-”+列)>-1;
    }
    功能分配(行、列){
    randoms.rows.push(row);
    randoms.columns.push(列);
    minedCells.push(“单元格-”+行+“-”+列);
    }
    功能分配地雷(行、列、地雷搜索){
    var行、列;
    设i=0;
    
    然而(我我认为你开始这件事的时候走错了路

  • 确保可以定义单元格的所有状态:

    • 开采
    • 标记
    • 透露
    • 隐藏的
  • 确保可以显示这些状态(使用手动定义的映射进行测试)

  • 确保您可以在挖掘广场附近的显示广场上显示正确的数字

  • 在解决前三个问题之后,开始考虑如何使用挖掘的单元生成贴图

  • 目前,对于解决前三个问题,尤其是第三个问题,您使用的数据结构甚至都不接近最优

    我将数据结构作为一个二维数组/单元对象集合,每个单元对象都有一个定义其状态的属性(稍后,您可能希望将其优化为仅使用表示单元状态的数字)

    但如果您坚持使用迄今为止选择的数据结构:
    let randoms={
    行:[],
    列:[]
    };
    设minedCells=[];
    函数已定义(行、列){
    返回minedCells.indexOf(“单元格-”+行+“-”+列)>-1;
    }
    功能分配(行、列){
    randoms.rows.push(row);
    randoms.columns.push(列);
    minedCells.push(“单元格-”+行+“-”+列);
    }
    功能分配地雷(行、列、地雷搜索){
    var行、列;
    设i=0;
    
    而(i如评论中所述,创建一个包含所有值的数组,然后将其洗牌

    首先,看看关于洗牌数组的另一个问题

    …全部读取?很酷。您可以将数据结构更改为单个数组(而不是单独的行和列数组),以便轻松插入其中一个
    shuffle()
    函数

    这里也有人提到,您希望支持多个单元格状态。您不需要在一开始就全部定义它们,但您需要一些表示单元格的数据分组—最好将所有数据都放在代码中的一个位置。例如,请参阅下面代码段中的
    createCell()

    我看不出立即需要它,但您可能希望使用其行和/或列编号来标识单元格,因此我添加了一个名为
    buildTable()
    的额外示例函数来演示它