Cómo conseguir que los jugadores tomen turnos en el proyecto JavaScript (tic-tac-toe)
Estoy tratando de que los dos jugadores tomen turnos en mi proyecto tic-tac-toe. En mi playerContols
Función He intentado poner a cada jugador en una variable de carcasa "current PLayer" que se apagará dependiendo de si un jugador ya fue pero se queda atascado en el jugador 2 y marca cada celda con O's. No estoy completamente seguro de lo que está mal.
mi código
const playgame = (() => {
const playerOne = {
Name: 'playerOne',
Marking: 'X'
};
const playerTwo = {
Name: 'PlayerTwo',
Marking: 'O'
};
function playerControls(e) {
let currentPlayer;
currentPlayer = playerOne;
e.target.textContent = currentPlayer.Marking;
if (currentPlayer === playerOne) {
currentPlayer = playerTwo;
e.target.textContent = currentPlayer.Marking;
} else {
currentPlayer = playerOne;
e.target.textContent = currentPlayer.Marking;
}
}
return {
playerControls
}
})();
const gameBoard = (() => {
const makeBoard = (rows, cols) => {
const theBoard = document.getElementById("GameBoard");
theBoard.style.gridTemplateColumns = `repeat(${cols}, 1fr)`;
theBoard.style.gridTemplateRows = `repeat(${rows}, 1fr)`;
for (i = 0; i < (rows * cols); i++) {
let gameDivs = document.createElement("div");
gameDivs.addEventListener("click", playgame.playerControls)
theBoard.appendChild(gameDivs).classList.add("newdivgrid");
}
};
makeBoard(3, 3);
})();
#GameBoard {
width: 600px;
height: 350px;
border: 1px solid darkblue;
margin-left: 27%;
text-align: center;
font-size: 500%;
font-family: cursive, sans-serif;
display: grid;
}
.newdivgrid {
border: 1px solid black;
grid-row-gap: 50px;
}
.newdivgrid:hover {
background-color: aqua;
}
html
Tic-Tac-Toe game
Tic-Tac-Toe Project
Select Players
Player 1
Player 2
Results
Player 1 Results
Player 2 Results
Pregunta hecha hace 3 años, 5 meses, 0 días - Por syntaxsorcerer
3 Respuestas:
-
El problema es que tu
currentPlayer
declaración variable e inicialización necesita vivir afuera elplayerControls
función o si no lo estás restableciendoplayerOne
cada vez.let currentPlayer; currentPlayer = playerOne; function playerControls(e){...}
Aquí está la solución en acción:
const playgame = (()=> { const playerOne = { Name: 'playerOne', Marking: 'X' }; const playerTwo = { Name: 'PlayerTwo', Marking: 'O' }; let currentPlayer; currentPlayer = playerOne; function playerControls(e){ e.target.textContent = currentPlayer.Marking; if(currentPlayer === playerOne) { currentPlayer = playerTwo; e.target.textContent = currentPlayer.Marking; }else{ currentPlayer = playerOne; e.target.textContent = currentPlayer.Marking; } } return{playerControls} })(); const gameBoard = (() => { const makeBoard = (rows, cols) => { const theBoard = document.getElementById("GameBoard"); theBoard.style.gridTemplateColumns = `repeat(${cols}, 1fr)`; theBoard.style.gridTemplateRows = `repeat(${rows}, 1fr)`; for (i=0; i<(rows * cols); i++){ let gameDivs = document.createElement("div"); gameDivs.addEventListener("click", playgame.playerControls) theBoard.appendChild(gameDivs).classList.add("newdivgrid"); } }; makeBoard(3,3); })();
#GameBoard{ width: 600px; height: 350px; border: 1px solid darkblue; margin-left: 27%; text-align: center; font-size: 500%; font-family: cursive, sans-serif; display: grid; } .newdivgrid{ border: 1px solid black; grid-row-gap: 50px; } .newdivgrid:hover{ background-color: aqua; }
html
Tic-Tac-Toe game Tic-Tac-Toe Project
Select Players
Player 1
Player 2
Results
Player 1 Results
Player 2 Results
Respondida el Dec 18, 2020 a las 03:31 - por codealchemy
Votos positivos: 0 | Votos negativos: 0 -
El problema en tu código radica en cómo estás manejando la variable
currentPlayer
dentro de la funciónplayerControls
. En cada llamada a la función, estás reasignandocurrentPlayer
aplayerOne
, por lo que nunca cambia efectivamente de un jugador a otro.Para solucionar esto, puedes mover la variable
currentPlayer
fuera de la funciónplayerControls
y utilizarla para alternar entre los jugadores. Aquí te muestro cómo podrías modificar tu código:javascript const playgame = (() => { const playerOne = { Name: 'playerOne', Marking: 'X' }; const playerTwo = { Name: 'PlayerTwo', Marking: 'O' }; let currentPlayer = playerOne; function playerControls(e) { if (e.target.textContent === "") { e.target.textContent = currentPlayer.Marking; currentPlayer = currentPlayer === playerOne ? playerTwo : playerOne; } } return { playerControls } })();
En este código, he movido la declaración de
currentPlayer
fuera de la funciónplayerControls
y he actualizado la lógica dentro de la función para alternar entreplayerOne
yplayerTwo
de forma adecuada.Con estos cambios, cada vez que se haga clic en una celda del tablero, la función
playerControls
cambiará correctamente entre los jugadores. Espero que esta solución te ayude a lograr que los jugadores tomen turnos en tu juego tic-tac-toe. ¡Déjame saber si tienes alguna otra pregunta!Respondida el Dec 19, 2020 a las 03:30 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
El problema con tu código es que siempre estableces
currentPlayer
enplayerOne
al comienzo de la funciónplayerControls
. Esto hace que el jugador 1 siempre vaya primero y el jugador 2 nunca tenga la oportunidad de jugar.Para solucionar este problema, debes alternar entre
playerOne
yplayerTwo
cada vez que se hace clic en una celda. Puedes hacer esto usando un operador ternario:js function playerControls(e) { let currentPlayer = currentPlayer === playerOne ? playerTwo : playerOne; e.target.textContent = currentPlayer.Marking; }
Esto alternará entre
playerOne
yplayerTwo
cada vez que se haga clic en una celda.Aquí está el código completo con la solución:
```js const playgame = (() => { const playerOne = { Name: 'playerOne', Marking: 'X' }; const playerTwo = { Name: 'PlayerTwo', Marking: 'O' };
let currentPlayer = playerOne;
function playerControls(e) { currentPlayer = currentPlayer === playerOne ? playerTwo : playerOne; e.target.textContent = currentPlayer.Marking; }
return { playerControls } })(); const gameBoard = (() => { const makeBoard = (rows, cols) => { const theBoard = document.getElementById("GameBoard"); theBoard.style.gridTemplateColumns =
repeat(${cols}, 1fr)
; theBoard.style.gridTemplateRows =repeat(${rows}, 1fr)
; for (i = 0; i < (rows * cols); i++) { let gameDivs = document.createElement("div"); gameDivs.addEventListener("click", playgame.playerControls) theBoard.appendChild(gameDivs).classList.add("newdivgrid"); } }; makeBoard(3, 3); })(); ```Espero que esto ayude. ¡Déjame saber si tienes alguna otra pregunta!
Respondida el Dec 19, 2020 a las 03:40 - por Gemini
Votos positivos: 0 | Votos negativos: 0