mi único problema hasta ahora es que cuando los barcos tienen el mismo valor, recibo un mensaje de error si estoy usando VSC. TypeError: Asignación a variable constante. Estaba tratando de llegar a diferentes valores usando la condición, pero creo que no funciona.
let grid = [[]]; const letters = "abc".toUpperCase(); // create the Grid const createGrid = (size) => { let row; let col = 0; for (row = 0; row < size; row++) { grid[row] = []; for (col = 0; col < size; col++) { grid[row][col] = `${letters[row]}${col + 1}`; } } }; createGrid(letters.length); console.table(grid); // Start the game //create ships const flatArray = grid.reduce((acc, curr) => { return [...acc, ...curr]; }, []); function getRandomNumber(len) { return Math.floor(Math.random() * len); } const randomNumber1 = getRandomNumber(flatArray.length); const randomNumber2 = getRandomNumber(flatArray.length); while(randomNumber1 == randomNumber2) { getRandomNumber(); } var shipOne = flatArray[randomNumber1]; var shipTwo = flatArray[randomNumber2]; console.log(shipOne); console.log(shipTwo);
Creé un fragmento de su código de ejemplo y se ejecuta para siempre en el caso de error que está describiendo.
Un problema es que tienes un bucle while que se ejecutará para siempre:
while(randomNumber1 == randomNumber2) { getRandomNumber(); }
Ejecuta este código siempre que randomNumber1
y randomNumber2
sean iguales, pero no actualiza ninguno de ellos en el ciclo para que nunca sea falso.
Prueba esto:
while(randomNumber1 == randomNumber2) { randomNumber2 = getRandomNumber(flatArray.length); }
También puede hacer que su código sea un poco más inteligente y eliminar elementos de la matriz flatArray
que ya ha elegido.
Dentro de tu ciclo while, si los dos números aleatorios fueran iguales, estarías atrapado dentro de un ciclo infinito. Como dijo Pedro.
Para solucionar esto, use el código que Peter indicó, pero no olvide que aún necesita pasar la longitud de la matriz a esta función. De lo contrario, tendrá un error:
while(randomNumber1 == randomNumber2) { randomNumber2 = getRandomNumber(flatArray.length); }
¡¡Gracias!!
Otro enfoque que podría intentar es crear una función pickRandomEntries()
que seleccionará N entradas aleatorias de una matriz, sin seleccionar nunca las mismas.
Para hacer esto, barajamos una copia de tu flatArray()
, luego elegimos los dos primeros elementos.
De esta forma nunca tendremos que comprobar si los barcos tienen el mismo valor:
let grid = [[]]; const letters = "abc".toUpperCase(); const createGrid = (size) => { let row; let col = 0; for (row = 0; row < size; row++) { grid[row] = []; for (col = 0; col < size; col++) { grid[row][col] = `${letters[row]}${col + 1}`; } } }; createGrid(letters.length); const flatArray = grid.reduce((acc, curr) => { return [...acc, ...curr]; }, []); // Shuffle an array into a random order (using Fisher-Yates) function shuffle(arr) { for(let i = arr.length - 1; i > 0; i--) { let index = Math.floor(Math.random() * (i + 1)); [arr[index], arr[i]] = [arr[i], arr[index]]; } return arr; } // Pick count random items from the array function pickRandomEntries(arr, count) { let shuffled = shuffle([...arr]); return shuffled.slice(0, count); } let [shipOne, shipTwo] = pickRandomEntries(flatArray, 2); console.log( { shipOne, shipTwo });