Escribí un algoritmo rápido que detecta una victoria en un juego de TicTacToe.
función game() recorre un tablero simulado de tres en ticTacToe , encuentra todos los índices de un valor dado, luego recorre todos los combos ganadores posibles, encuentra cualquier índice donde el valor real es igual al índice del primer ciclo, (lo sé: /) luego reemplaza el valor con el valor pasado a la función (ya sea x o o).
Luego, se ejecuta una función posterior que verifica si todos los valores dentro de cualquiera de las matrices anidadas dentro de los possibleWinCombos son todos iguales entre sí. Si es verdadero, se encuentra un ganador.
const possibleWinCombos = [ [0, 1, 2], //================ // [3, 4, 5], //== Horizontal == // [6, 7, 8], //=================// [0, 3, 6], //================ // [1, 4, 7], //== Vertical == // [2, 5, 8], //=================// [0, 4, 8], //=================// [2, 4, 6], //== Diagonal == // ] const ticTacToe = [ 'x', 'o', null, null, 'x', null, 'o', null, 'x', ] const game = (value) => { ticTacToe.forEach((cell, idxOfCell) => { if(cell === value){ for (winCombo of possibleWinCombos){ let idxToReplace = winCombo.indexOf(idxOfCell) winCombo.splice(idxToReplace, 1, value) } } }) checkForWinner(value) ? console.log(`${value}'s win`) : console.log('game still going') } const checkForWinner = (value) => { return possibleWinCombos.some((winCombo) => { return winCombo.every((winComboValue) => winComboValue === value); }) } game('x') // x's win game('o') // game still going Son solo dos funciones, por lo que no es muy pesado en código, pero creo que game() no obtendría una puntuación muy alta en las clasificaciones de rendimiento debido al bucle anidado. Cualquier recomendación sobre algunas mejoras sería genial.