Estoy creando un juego de ruleta que muestra elementos aleatorios de diferentes matrices cuando la rueda cae en una categoría específica. Hasta ahora todo funciona excepto cuando la rueda aterriza en una categoría, selecciona el mismo elemento aleatorio de la matriz correcta una y otra vez. Estoy tratando de usar math.random y el método de empalme para seleccionar aleatoriamente un elemento de una matriz y eliminar ese elemento para que solo se puedan mostrar elementos nuevos y aleatorios de la matriz, pero no ha funcionado.
No sé cómo es el resto del código, pero si siempre obtienes el mismo valor una y otra vez, es posible que no estés volviendo a ejecutar el código que obtiene los valores.
Intente envolver la lógica para recuperar las zonas de símbolos en una función:
function getSymbolZones() { const symbolZones = []; symbolZones[1] = a[Math.floor(Math.random()*a.length)]; symbolZones[2] = b[Math.floor(Math.random()*b.length)]; symbolZones[3] = c[Math.floor(Math.random()*c.length)]; symbolZones[4] = d[Math.floor(Math.random()*d.length)]; symbolZones[5] = e[Math.floor(Math.random()*e.length)]; symbolZones[6] = f[Math.floor(Math.random()*f.length)]; symbolZones[7] = g[Math.floor(Math.random()*g.length)]; symbolZones[8] = h[Math.floor(Math.random()*h.length)]; return symbolZones; } y luego utilícelo en la función handleWin .
const handleWin = (actualDeg) => { const symbolZones = getSymbolZones(); const winningSymbolNr = Math.ceil(actualDeg / zoneSize); display.innerHTML = symbolZones[winningSymbolNr]; } PD Entiendo que comienzas la matriz en el índice 1 porque esa es la zona más pequeña que puedes obtener de la operación 45/45. Pero si yo fuera tú, comenzaría el índice desde 0 y simplemente restaría 1 al acceder a la matriz: symbolZones[winningSymbolNr - 1] . De esta manera, no obtiene errores extraños cuando intenta recorrer una matriz que tiene un primer índice vacío.
Además de usar array , le sugiero que use object y un bucle for para que el código sea más fácil de ejecutar. Este código debería funcionar:
let deg = 0; // The 360 degree wheel has 8 zones, so each zone is 45 degrees let zoneSize = 45; let symbol = { a: ["a", "b", "c", "d", "e"], b: ["f", "g", "h", "i", "j"], c: ["a", "b", "c", "d", "e"], d: ["f", "g", "h", "i", "j"], e: ["a", "b", "c", "d", "e"], f: ["f", "g", "h", "i", "j"], g: ["a", "b", "c", "d", "e"], h: ["f", "g", "h", "i", "j"], } // zones for each 8 categories let ran = Math.floor(Math.random() * Object.keys(symbol).length) console.log(Object.values(symbol)[ran]) //Random select a zone from above 8 let selectedzone = Object.values(symbol)[ran] //Random select an item from selected zone let index = Math.floor(Math.random() * selectedzone.length) let symbolZones = selectedzone[index] console.log(symbolZones) const handleWin = (actualDeg) => { const winningSymbolNr = Math.ceil(actualDeg / zoneSize); display.innerHTML = symbolZones[winningSymbolNr]; }Reorganicé las matrices de entrada en una matriz de matrices (5 matrices de 9 elementos = 45). Supongo que quieres que todo se mezcle.
const log = data => console.log(JSON.stringify(data)); let zones = [ ["🎁", "🎆", "🎯", "🌈", "🌛", "💩", "💰", "🍒", "🌴"], ["🌞", "🍀", "💀", "💘", "💣", "🎲", "🎰", "🎈", "🗿"], ["🎁", "🎆", "🎯", "🌈", "🌛", "💩", "💰", "🍒", "🌴"], ["🌞", "🍀", "💀", "💘", "💣", "🎲", "🎰", "🎈", "🗿"], ["🎁", "🎆", "🎯", "🌈", "🌛", "💩", "💰", "🍒", "🌴"] ]; let zoneSize = zones.length * zones[0].length; let symbolZones = []; for (let i = zoneSize; i > 0; i--) { let deg = zones.flatMap(z => z.splice(Math.floor(Math.random() * z.length), 1)); if(deg.length > 0) { symbolZones.push(deg); } } log(`Original Array zones`); log(zones); log(`New Array symbolZones`); log(symbolZones); .as-console-row-code { display: block; width: 100%; overflow-wrap: anywhere; } .as-console-row::after { content: ''!important }