Внутри l oop, когда вы создаете корабль, подумайте о создании строки, представляющей координаты. Например, для newCoords
из 1, 3
создайте строку 1_3
. Чтобы проверить местоположение, проверьте, существует ли эта строка в массиве (или множестве) местоположений проверенных кораблей. В конце внутреннего l oop, после того как все позиции по длине корабля будут проверены, объедините возможные местоположения в массив проверенных местоположений:
placeShips = () => {
const placedPosition = [];
const board = this.state.board.slice();
const validatedPositionStrings = []; // <---- Create this array
for (const ship of this.state.ships) {
const thisShipLength = ship.getLength();
tryShip:
while (true) {
const thisBoatPossiblePositionStrings = [];
// Generate ship positions until valid
const xcoord = Math.floor(Math.random() * 10);
const ycoord = Math.floor(Math.random() * 10);
const potentialBoat = [];
for (let j = 0; j < thisShipLength; j++) {
// Then check to see if the below position is already in it
const thisCoordinateString = `${x}_${y}`;
if (validatedPositionStrings.includes(thisCoordinateString)) {
// Invalid
continue tryShip;
}
thisBoatPossiblePositionStrings.push(thisCoordinateString);
// If this point is reached, then this particular coordinate is valid
// do whatever you need to do:
const newCoords = [xcoord, ycoord + j];
potentialBoat.push(newCoords);
}
// All positions for ship are valid
// do something with potentialBoat here?
// push positions to placedPosition?
validatedPositionStrings.push(...thisBoatPossiblePositionStrings);
break;
}
}
}
Это можно сделать меньше вычислительно сложный, используя Set вместо массива, но это, вероятно, не имеет значения, если нет очень большого количества итераций.
Также можно было бы искать в вашем массиве массивов, чтобы увидеть, если позиция уже размещен, но это потребует ненужного количества кода IMO.
Если возможно, вы можете рассмотреть возможность изменения структуры данных таким образом, чтобы вместо массива массивов у вас был только один объект, представляющий координаты, значения которых указывают корабль в этой позиции (и, возможно, другие атрибуты, необходимые для конкретной точки), например:
{
1_3: { ship: 'destroyer', 'attackedYet': 'false' }
// ...
Такой объект, вероятно, будет легче найти и проработать, чем массив массивы пар XY.