Переключение пользователей в игре крестики-нолики

В настоящее время я работаю над проектом крестики-нолики с использованием 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>

Вы ничего не назначаете currentPlayer

0stone0 08.08.2024 16:27

@mplungjan спасибо за преобразование во фрагмент, иначе я бы, наверное, даже не начал писать ответ.

Lajos Arpad 08.08.2024 18:18
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В качестве отправной точки я использовал фрагмент @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 09.08.2024 08:39

@mplungjan сейчас я очень занят. Я постараюсь вернуться к этому позже сегодня, если не забуду. Пожалуйста, не стесняйтесь редактировать ответ, если его качество не ухудшится, и если вы захотите это сделать. Если нет, то (надеюсь) я вернусь к нему :)

Lajos Arpad 09.08.2024 09:46

Хорошо, я немного провел рефакторинг, так как предпочитаю делегирование. Еще я упростил переключение игроков

mplungjan 09.08.2024 10:06

@mplungjan спасибо за редактирование. Я заметил, что если нажать на квадраты, то к ним больше не добавляется 0 и X, что раньше работало. Сегодня сумасшедший день, но я исправлю это, когда у меня будет время.

Lajos Arpad 09.08.2024 11:12

Скрипт работает. Вам нужно добавить двух игроков, прежде чем он запустится

mplungjan 09.08.2024 11:43

@mplungjan ааа, ты имеешь в виду нажатие кнопки «Добавить». Раньше достаточно было заполнить входные данные. Я исправился, спасибо.

Lajos Arpad 09.08.2024 12:08

Вам нужно было сначала щелкнуть имена добавлений, чтобы настроить игроков.

mplungjan 09.08.2024 12:14

@mplungjan на самом деле вы могли нажать где угодно, и тогда игра началась. Неважно. Теперь это выглядит хорошо, и спасибо за редактирование.

Lajos Arpad 09.08.2024 12:47

Другие вопросы по теме