如何替换主网格(数组的数组)的特定位置?
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;
}
我正在编写一个扫雷程序,我得到了 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;
}