如何替换主网格(数组的数组)的特定位置?

How to replace a specific position of a main grid (array of arrays)?

我正在编写一个扫雷程序,我得到了 UI,但我无法修改它。我已经制作了不同尺寸的网格,但现在我需要将地雷推入其中,我创建了一个函数,该函数为我提供了一系列位于不同位置的地雷,并将板尺寸作为参数,但我无法弄清楚如何推动这一系列地雷如果它与地雷位置匹配,则进入网格替换单元格

代码如下:

import { CellEnum } from "../types";
import { CellComponentType } from "../UI/components/CellComponentType";
import { getMinePositions, positionMatch } from "./mines";

export function def(boardSize: number, minesInGame: number) {
let board: CellEnum[][] = [];
const minePosition = getMinePositions(boardSize, minesInGame);
for (let xAxis = 0; xAxis < boardSize; xAxis++) {
const row = [];

for (let yAxis = 0; yAxis < boardSize; yAxis++) {
  let tile: CellEnum = CellEnum.Hidden

  

  row.push(tile);
}
board.push(row);
}
return board;
}

这是地雷生成器的代码

import { CellComponentType } from "../UI/components/CellComponentType";
import { CellEnum } from "../types";

function randomNumber(size: number) {
return Math.floor(Math.random() * size);
}

function positionMatch(a: CellComponentType, b: CellComponentType) {
return a.position === b.position;
}
function getMinePositions(boardSize: number, minesInGame: number) {
const positions: CellComponentType[] = [];

while (positions.length < minesInGame) {
let position: CellComponentType = {
  position: [randomNumber(boardSize), randomNumber(boardSize)],
  cell: CellEnum.Mine
};

if (!positions.some(positionMatch.bind(null, position))) {
  positions.push(position);
}
}

return positions;
}

export { getMinePositions, positionMatch };

CellComponentType 具有以下属性:

type CellComponentType = {
position: [number, number];
cell: CellEnum;
};

最后这些是可能有一个单元格的不同状态

enum CellEnum {
Hidden = -1,
Cero = 0,
One = 1,
Two = 2,
Three = 3,
Four = 4,
Five = 5,
Six = 6,
Seven = 7,
Eight = 8,
Flag = 9,
Mine = 10,
ClickedMine = 11
}

如果有人能提供帮助,我将不胜感激,谢谢

遍历地雷并更改相应的棋盘图块:

const mines = getMinePositions();

mines.forEach((mine) => {
    const [x, y] = mine.position;

    board[y][x] = mine.cell;
});

我不知道你是怎么设置你的电路板的,但通常我把它设置为 y 行和 x 列,所以我使用 board[y][x]这里。

您的 positionMatch 方法有问题。当您真正想要比较数组的内容时,您正在比较数组本身。像这样改变你的方法:

function positionMatch(a: CellComponentType, b: CellComponentType) {
    return a.position[0] === b.position[0]
        && a.position[1] === b.position[1];
}

要将地雷添加到字段中,您可以遍历地雷位置并在返回棋盘之前覆盖匹配的隐藏字段:

for(let mine of minePosition) {
    board[mine.position[1], mine.position[0]] = mine.cell;
}