Крестики-нолики – популярная настольная игра. Если вы хотите научиться создавать игры с использованием языка JavaScript, то разработка игры «Крестики-Нолики» с ботом может быть отличным началом. В этой статье мы рассмотрим, как создать простую версию игры «Крестики-Нолики» на JavaScript с встроенным ботом в качестве противника. Мы научимся создавать игровое поле, обрабатывать ходы игроков и бота, а также проверять победу или ничью.

В этой версии игры добавлен простой бот, который случайным образом выбирает свободную ячейку и делает ход за «O». Ходы бота осуществляются с небольшой задержкой (500 миллисекунд) для создания иллюзии игры против реального соперника. Если игрок победил или наступила ничья, выводится соответствующее сообщение.

Я представлю вам код игры змейка на JS с подробными комментариями, вы можете скопировать его и поэкспериментировать.

HTML

<h1>Крестики-нолики</h1>
<div class="board"></div>

CSS

@import url("https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap");
body {
  background: linear-gradient(45deg, #08041d, #200852);
  background-attachment: fixed;
  font-family: "Roboto", sans-serif;
  display: flex;
  flex-direction: column;
  align-items: center;
  color: #fff;
}

h1 {
  margin-top: 50px;
  margin-bottom: 50px;
  color: #fff;
}

.board {
  display: flex;
  flex-wrap: wrap;
  width: 300px;
  border: 3px solid #3db1ff;
  box-shadow: 0 0 100px 1px #3db1ff;
}

.board .cell {
  box-sizing: border-box;
  width: 100px;
  height: 100px;
  border: 3px solid #3db1ff;
  display: flex;
  justify-content: center;
  align-items: center;
  font-size: 48px;
  cursor: pointer;
}

JavaScript

// Создаем игровое поле
const board = document.querySelector(".board");
const cells = [];
let currentPlayer = "X";
let gameOver = false;

// Создаем ячейки на игровом поле
for (let i = 0; i < 9; i++) {
  const cell = document.createElement("div");
  cell.classList.add("cell");
  cells.push(cell);
  board.appendChild(cell);

  // Обработчик клика по ячейке
  cell.addEventListener("click", () => {
    if (cell.textContent === "" && currentPlayer === "X" && !gameOver) {
      cell.textContent = currentPlayer;
      cell.style.cursor = "not-allowed";

      if (checkWin(currentPlayer)) {
        alert("Игрок " + currentPlayer + " победил!");
        gameOver = true;
      } else if (checkDraw()) {
        alert("Ничья!");
        gameOver = true;
      } else {
        currentPlayer = "O";
        setTimeout(makeBotMove, 500);
      }
    }
  });
}

// Ход бота
function makeBotMove() {
  const emptyCells = cells.filter((cell) => cell.textContent === "");

  if (emptyCells.length > 0 && currentPlayer === "O") {
    const randomIndex = Math.floor(Math.random() * emptyCells.length);
    const botCell = emptyCells[randomIndex];
    botCell.textContent = currentPlayer;
    botCell.style.cursor = "not-allowed";

    if (checkWin(currentPlayer)) {
      alert("Игрок " + currentPlayer + " победил!");
      gameOver = true;
    } else if (checkDraw()) {
      alert("Ничья!");
      gameOver = true;
    } else {
      currentPlayer = "X";
    }
  }
}

// Проверка победы
function checkWin(player) {
  const winCombinations = [
    [0, 1, 2],
    [3, 4, 5],
    [6, 7, 8], // горизонтальные линии
    [0, 3, 6],
    [1, 4, 7],
    [2, 5, 8], // вертикальные линии
    [0, 4, 8],
    [2, 4, 6], // диагональные линии
  ];

  return winCombinations.some((combination) => {
    return combination.every((index) => cells[index].textContent === player);
  });
}

// Проверка ничьей
function checkDraw() {
  return cells.every((cell) => cell.textContent !== "");
}

Идеи для улучшения игры

  • Анимации: Добавьте анимации при установке крестика или нолика, чтобы сделать игру более интерактивной и зрелищной.
  • Счетчик побед: Выводите на экран счетчик побед для каждого игрока, чтобы игроки могли отслеживать свои результаты.
  • Уровни сложности для бота: Реализуйте несколько уровней сложности для бота. Например, начальный уровень может делать случайные ходы, а более высокий уровень может использовать стратегию для победы или блокировки игрока.
  • Адаптивный дизайн: Сделайте игру адаптивной, чтобы она выглядела и работала хорошо на разных устройствах, таких как мобильные телефоны и планшеты.
  • История ходов: Добавьте функцию, которая сохраняет и отображает историю ходов игры, чтобы игроки могли просмотреть, как развивалась игра.
  • Многопользовательский режим: Реализуйте возможность игры с другими игроками онлайн через интернет.
  • Персонализация: Позвольте игрокам выбирать символы (например, крестик и нолик) или настраивать внешний вид игрового поля.
  • Улучшенный UI: Создайте более привлекательный пользовательский интерфейс с использованием графических элементов, цветовой схемы и анимаций.
  • Звуковые эффекты: Добавьте звуковые эффекты при установке символов или при объявлении победы.
 

Один комментарий