Как заменить определенную позицию основной сетки (массива массивов)?

Я кодирую тральщик, у меня есть пользовательский интерфейс, и я не могу его изменить. Я сделал сетку для разных размеров, но теперь мне нужно впихнуть в нее мины, я создал функцию, которая дает мне массив мин в разных позициях, взяв в качестве параметра размер доски, но я не могу понять, как впихнуть этот массив мин в сетку, заменяя ячейки, если они совпадают с позицией мин

Вот код:

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
}

Я очень ценю, если кто-то может помочь, спасибо

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
37
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Прокрутите мины и измените соответствующую плитку доски:

const mines = getMinePositions();

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

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

Я не знаю, как вы настроили свою доску, но обычно у меня это y в виде строк и x в виде столбцов, поэтому я использовал board[y][x] здесь.

Хорошо, я понял, этот цикл должен быть записан после возврата платы, я имею в виду, следуя этой логике, плата должна быть завершена, и после этого я мог бы сделать цикл по минам с платы, верно?

Kevin Hernandez 06.05.2022 18:06

@KevinHernandez Да, я так думаю. Вы также можете сделать это другой функцией, если вам нужно использовать ее более одного раза.

catgirlkelly 06.05.2022 18:08
Ответ принят как подходящий

У вас проблема с вашим 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;
}

Другие вопросы по теме