Estoy haciendo tic-tac-toe desde TOP, no estoy buscando a alguien que haga mi tarea, solo creo que estoy malinterpretando gravemente las matrices o el alcance. Tengo un módulo "Juego" donde guardo la información del juego.
const Game = (()=>{ //Beginning state of the board, what I want to reset after every win/draw let board = [null, null, null, null, null, null, null, null, null]; const add = (value, index) =>{ board[index] = value; } const reset = () => { board = [null, null, null, null, null, null, null, null, null] } return {board, add, reset} })();Todo se controla desde un módulo controlador, que configura a los jugadores, juega la ronda, cambia el turno, etc. Para la primera ronda después de actualizar funciona perfectamente, el problema surge cuando necesito borrar todo para la próxima ronda.
El Game.reset() actual es solo una de las formas en que intenté hacerlo, traté de hacer referencia a él con un argumento de función, que llamaría más adelante, pensé en llamarlo directamente en el módulo Game, usando métodos de matriz , Probé con seguridad 10 formas en las que pude pensar y ninguna funcionó, algunas restablecieron la matriz a todos los valores nulos, otras no, pero en cada una no puedo volver a jugar la ronda.
Si se restablece con éxito, simplemente permanece vacío, independientemente de si presiono otro campo o no, supongo que tiene que ver con el hecho de que defino la matriz al comienzo del módulo, pero no estoy seguro. Básicamente, mi pregunta es cómo poder "llamar" al módulo del juego cada vez desde el principio si quiero reiniciar el juego, o por qué se bloquea así.
Aquí está mi repositorio https://github.com/krisboz/tic-tac-toe Sé que es un completo caos porque en index2.js casi lo hice funcionar, luego decidí refactorizarlo para index3.js y ahora estoy atascado nuevamente en el mismo problema, aunque se ve un poco más limpio tal vez jaja.
Las referencias no son dueñas de sus datos.
Su declaración de devolución crea una nueva referencia a la misma matriz, pero aunque inicialmente ambas variables de la placa apuntan a la misma dirección de memoria, cambiar la que muestra una matriz diferente (que existirá en una dirección de memoria separada, no sobrescribirá la original ), no afectará a la otra variable, porque todavía apunta a la misma dirección que antes.
Lo que le gustaría hacer aquí es cambiar el tablero del objeto actual con this palabra clave.
Naturalmente, intentarías algo como
const reset = () => { this.board = [null, null, null, null, null, null, null, null, null] }pero eso lo llevará a una madriguera de confusión diferente, que es la diferencia entre los ámbitos de función y función de flecha.
el uso de la palabra clave this en la función de flecha se referiría a la ventana global, porque está vinculada en la creación de la función.
En su lugar, podrías usar
function reset() { this.board = [null, null, null, null, null, null, null, null, null] } donde this se evalúa en el momento en que se llama (a menos que vincule la función manualmente).
Es de esperar que todo este problema desaparezca una vez que comience a escribir clases para sus objetos.