В настоящее время я работаю над проектом крестики-нолики с использованием javascript html css. Проблема в том, что я установил конструкторы по вводу пользователя, но Я не могу переключить пользователя, когда играю в игру
Я ожидаю, что смогу сменить пользователя, когда вы играете свой ход. Я попробовал, если еще, назначив текущего игрока игроку 1, если игрок 1 - я хочу изменить его на игрока2
const gameBoard = (function() {
// Select DOM elements
const playerInput1 = document.querySelector("#player-select1");
const playerButton = document.querySelector(".add-player");
const playerInput2 = document.querySelector("#player-select2");
const playerPara1 = document.querySelector(".player1");
const playerPara2 = document.querySelector(".player2");
const showPlayers = document.querySelector(".player-shows");
const boxes = document.querySelectorAll(".box");
// Game markers
const gameMarker = ["O", "X"];
let currentPlayer;
let player1, player2;
// Player factory function
const playerSelection = (name, marker) => {
let score = 0;
return {
name,
marker,
getScore: function() {
return score;
},
scorePlus: function() {
score++;
return score;
}
};
};
// Initialize players
player1 = playerSelection("Name", gameMarker[0]);
player2 = playerSelection("Name", gameMarker[1]);
// Event listener for player names
playerButton.addEventListener("click", () => {
player2.name = playerInput2.value.trim();
player1.name = playerInput1.value.trim();
if (player1.name === "" || player2.name === "") {
alert("Please enter a name");
} else {
playerPara1.textContent = `First Player is: ${player1.name} (${player1.marker})`;
playerPara2.textContent = `Second Player is: ${player2.name} (${player2.marker})`;
showPlayers.innerHTML = "";
showPlayers.append(playerPara1);
showPlayers.append(playerPara2);
// Start the game by setting the initial player
playGame();
}
});
// Add event listeners to boxes
boxes.forEach((element) => {
element.addEventListener("click", () => {
if (element.textContent === "" && currentPlayer) { // Ensure box is empty and a player is set
element.textContent = currentPlayer.marker; // Mark the box with the current player's marker
playGame(); // Switch to the next player
}
});
});
// Function to switch current player
const playGame = () => {
if (currentPlayer === player1) {
player1
} else if (currentPlayer === player2) {
player2
}
};
// Return public methods
return {
playerSelection,
playGame
};
})();
<input type = "text" id = "player-select1">
<buttton class = "add-player">Add</button>
<input type = "text" id = "player-select2">
<p class = "player1"></p>
<p class = "player2"></p>
<div class = "player-shows"></div>
<div id = "board">
<div class = "box"></div>
<div class = "box"></div>
<div class = "box"></div>
<br>
<div class = "box"></div>
<div class = "box"></div>
<div class = "box"></div>
<br>
<div class = "box"></div>
<div class = "box"></div>
<div class = "box"></div>
<br>
</div>
Я сделал вам фрагмент. Пожалуйста, нажмите изменить , прокрутите вниз и нажмите «изменить фрагмент выше» и добавьте СООТВЕТСТВУЮЩИЙ HTML и CSS, чтобы получить минимально воспроизводимый пример
@mplungjan спасибо за преобразование во фрагмент, иначе я бы, наверное, даже не начал писать ответ.
В качестве отправной точки я использовал фрагмент @mplungjan. Во-первых, я исправил CSS, чтобы мы действительно могли что-то увидеть. Далее я понял, что вы проверяете, равен ли текущий игрок игроку1, и в этом случае вы оцениваете значение игрока1 вместо того, чтобы устанавливать для текущего игрока значение игрока2, и наоборот. Во-вторых, вы пропустили начальную инициализацию, вам нужно обработать случай, когда текущий игрок все еще не определено, наконец, вы вызываете игру при любом щелчке мыши, а также при нажатии на квадрат, поэтому вы переключаете игрока дважды, когда кто-то нажимает на поле, потому что это щелчок на поле, а также щелчок за се.
const gameBoard = (function() {
// Select DOM elements
const playerInput1 = document.querySelector("#player-select1");
const playerButton = document.querySelector(".add-player");
const playerInput2 = document.querySelector("#player-select2");
const playerPara1 = document.querySelector(".player1");
const playerPara2 = document.querySelector(".player2");
const showPlayers = document.querySelector(".player-shows");
const boxes = document.querySelectorAll(".box");
// Game markers
const gameMarker = ["O", "X"];
let currentPlayer;
let player1, player2;
// Player factory function
const playerSelection = (name, marker) => {
let score = 0;
return {
name,
marker,
getScore: function() {
return score;
},
scorePlus: function() {
score++;
return score;
}
};
};
// Initialize players
player1 = playerSelection("Name", gameMarker[0]);
player2 = playerSelection("Name", gameMarker[1]);
// Event listener for player names
playerButton.addEventListener("click", () => {
showPlayers.innerHTML = "";
player2.name = playerInput2.value.trim();
player1.name = playerInput1.value.trim();
if (player1.name === "" || player2.name === "") {
showPlayers.innerHTML = "Please add two players to start";
return;
}
playerPara1.textContent = `First Player is: ${player1.name} (${player1.marker})`;
playerPara2.textContent = `Second Player is: ${player2.name} (${player2.marker})`;
showPlayers.append(playerPara1);
showPlayers.append(playerPara2);
currentPlayer = player1; // initialise
});
// Add an event listener to the board
board.addEventListener("click", (e) => {
let element = e.target.closest('.box'); // handle nested elements
if (!element || !currentPlayer || element.textContent.trim() !== "") return;
element.textContent = currentPlayer.marker;
playGame();
});
// Function to switch current player - using a ternary
const playGame = () => currentPlayer = (currentPlayer === player2) ? player1 : player2;
// Return public methods
return {
playerSelection,
playGame
};
})();
#board {
display: table;
}
#board .row {
display: flex;
}
.box {
background-color: gray;
font-size: xx-large;
width: 100px;
height: 100px;
border: 1px solid black;
display: flex;
justify-content: center;
align-items: center;
}
<input type = "text" id = "player-select1" placeholder = "please enter a name">
<button class = "add-player">Add</button>
<input type = "text" id = "player-select2" placeholder = "please enter a name">
<p class = "player1"></p>
<p class = "player2"></p>
<div class = "player-shows">Please add two players to start</div>
<div id = "board">
<div class = "row">
<div class = "box"></div>
<div class = "box"></div>
<div class = "box"></div>
</div>
<div class = "row">
<div class = "box"></div>
<div class = "box"></div>
<div class = "box"></div>
</div>
<div class = "row">
<div class = "box"></div>
<div class = "box"></div>
<div class = "box"></div>
</div>
</div>
Пожалуйста, делегируйте: board.addEventListener("click", (e) => { let element = e.target.closest('.box'); if (!element || !currentPlayer || element.textContent.trim() !== "") return; element.textContent = currentPlayer.marker; playGame(); });
@mplungjan сейчас я очень занят. Я постараюсь вернуться к этому позже сегодня, если не забуду. Пожалуйста, не стесняйтесь редактировать ответ, если его качество не ухудшится, и если вы захотите это сделать. Если нет, то (надеюсь) я вернусь к нему :)
Хорошо, я немного провел рефакторинг, так как предпочитаю делегирование. Еще я упростил переключение игроков
@mplungjan спасибо за редактирование. Я заметил, что если нажать на квадраты, то к ним больше не добавляется 0 и X, что раньше работало. Сегодня сумасшедший день, но я исправлю это, когда у меня будет время.
Скрипт работает. Вам нужно добавить двух игроков, прежде чем он запустится
@mplungjan ааа, ты имеешь в виду нажатие кнопки «Добавить». Раньше достаточно было заполнить входные данные. Я исправился, спасибо.
Вам нужно было сначала щелкнуть имена добавлений, чтобы настроить игроков.
@mplungjan на самом деле вы могли нажать где угодно, и тогда игра началась. Неважно. Теперь это выглядит хорошо, и спасибо за редактирование.
Вы ничего не назначаете currentPlayer