Создание игры «Змейка» на JavaScript с использованием HTML5 Canvas.





Создание игры «Змейка» на JavaScript с использованием HTML5 Canvas

Игра «Змейка» является одной из самых классических и популярных компьютерных игр, известных еще с эпохи первых мобильных телефонов. Простота правил и захватывающий игровой процесс делают ее отличным проектом для тех, кто хочет освоить базовые навыки программирования в вебе. В данной статье подробно рассмотрим, как создать собственную версию «Змейки» с использованием языка JavaScript и HTML5 Canvas.

HTML5 Canvas предоставляет мощный и гибкий инструмент для рисования графики прямо в браузере, что позволяет легко визуализировать игровые объекты и взаимодействовать с ними. Мы шаг за шагом создадим рабочую игру, разберем структуру кода, а также основные концепции, включая управление, логику роста змейки и обработку столкновений.

Подготовка среды и создание HTML-шаблона

Для начала необходимо подготовить минимальную HTML-страницу, которая будет содержать элемент canvas, где будет рендериться игра. HTML5 Canvas – это прямоугольная область, на которой JavaScript может рисовать и обновлять графику в реальном времени. В нашем случае размер канваса задаст игровое поле.

Вот простой шаблон, который мы будем развивать дальше. Объявим канвас с фиксированными размерами и подключим скрипт, в котором постепенно напишем всю логику «Змейки»:

<!DOCTYPE html>
<html lang="ru">
<head>
  <meta charset="UTF-8">
  <title>Игра Змейка</title>
</head>
<body>
  <canvas id="gameCanvas" width="400" height="400" style="border:1px solid #000"></canvas>

  <script src="snake.js"></script>
</body>
</html>

Почему Canvas?

Canvas идеально подходит для разработки 2D игр: он быстро обновляется, поддерживает различные методы рисования и хорошо взаимодействует с событиями пользователя. Кроме того, он кроссплатформенный и не требует дополнительных библиотек, что упрощает развертывание игры.

Размер 400×400 пикселей выбран как удобный для управления и отображения, но его можно изменить в зависимости от желаемой сложности или визуального стиля.

Основные переменные и структура игры

После подготовки HTML-подложки приступим к написанию игрового кода. В файле snake.js опишем ключевые компоненты, необходимые для работы «Змейки». К ним относятся: змейка, еда (пища), направление движения, скорость обновления и состояние игры.

Для удобства будем использовать сетку клеток – каждый элемент змейки занимает одну ячейку, а ход змейки заключается в перемещении головы на одну клетку в заданном направлении и сдвиге хвоста.

Основные переменные

  • canvas и context: объекты для рисования.
  • gridSize: размер одной клетки сетки (например, 20 пикселей).
  • snake: массив объектов с координатами частей змейки.
  • direction: текущая скорость или направление движения (например {x:1,y:0}).
  • food: объект с координатами еды.
  • score: количество съеденной еды.
  • gameLoop: функция, которая циклично обновляет игровой экран.

Инициализация переменных

const canvas = document.getElementById('gameCanvas');
const ctx = canvas.getContext('2d');

const gridSize = 20; // размер клетки
const tileCount = canvas.width / gridSize;

let snake = [
  { x: 9, y: 9 },
  { x: 8, y: 9 },
  { x: 7, y: 9 }
];

let direction = { x: 1, y: 0 }; // движение вправо изначально
let food = { x: 15, y: 15 };
let score = 0;

Таким образом, змейка изначально состоит из трех сегментов, расположенных горизонтально в центре игрового поля, а еда случайно появляется на клетке с координатой {15, 15}.

Рисование игровых объектов на Canvas

Чтобы визуализировать змейку и еду, необходимо создать функции отрисовки. 簡単に вызывая эти функции каждую итерацию, мы будем отображать текущее состояние игрового поля.

Функция очистки поля

Сначала нужно очистить холст, чтобы рисунок не накладывался друг на друга. Для этого используем метод clearRect:

function clearScreen() {
  ctx.fillStyle = 'black';
  ctx.fillRect(0, 0, canvas.width, canvas.height);
}

Отрисовка змейки

Змейка состоит из прямоугольников, которые рисуются в соответствии с координатами сегментов:

function drawSnake() {
  ctx.fillStyle = 'lime';
  snake.forEach(part => {
    ctx.fillRect(part.x * gridSize, part.y * gridSize, gridSize, gridSize);
  });
}

Отрисовка еды

function drawFood() {
  ctx.fillStyle = 'red';
  ctx.fillRect(food.x * gridSize, food.y * gridSize, gridSize, gridSize);
}

Эти базовые функции позволят нам увидеть змейку и пищу на игровом поле.

Логика движения и управление змейкой

Игровой процесс состоит из регулярного обновления положения змейки, реагирования на пользовательский ввод и проверки столкновений. Движение реализуется добавлением нового сегмента головы и удалением последнего сегмента хвоста (если змейка не растет).

Обновление положения змейки

На каждом тике игры создаём новую позицию головы, смещая текущую на вектор направления. Если змейка съедает еду, хвост не удаляется — тем самым змейка становится длиннее.

function updateSnake() {
  const head = { x: snake[0].x + direction.x, y: snake[0].y + direction.y };
  
  // Проверка выхода за границы игрового поля (с зацикливанием)
  head.x = (head.x + tileCount) % tileCount;
  head.y = (head.y + tileCount) % tileCount;

  // Проверка столкновения с телом змейки
  for (let part of snake) {
    if (part.x === head.x && part.y === head.y) {
      alert('Игра окончена! Ваш счет: ' + score);
      resetGame();
      return;
    }
  }

  snake.unshift(head);

  // Съедание еды
  if (head.x === food.x && head.y === food.y) {
    score++;
    placeFood();
  } else {
    snake.pop();
  }
}

Функция размещения еды

Еда должна появляться на случайных позициях, которые не заняты сегментами змейки. Для этого будем генерировать координаты и проверять их пересечение:

function placeFood() {
  let newFoodPosition;
  while (true) {
    newFoodPosition = {
      x: Math.floor(Math.random() * tileCount),
      y: Math.floor(Math.random() * tileCount)
    };
    let collision = snake.some(part => part.x === newFoodPosition.x && part.y === newFoodPosition.y);
    if (!collision) break;
  }
  food = newFoodPosition;
}

Управление клавиатурой

Для смены направления движения добавим обработчик событий клавиатуры, при этом запретим разворачиваться змейке на 180 градусов:

window.addEventListener('keydown', function(e) {
  switch (e.key) {
    case 'ArrowUp':
      if (direction.y !== 1) direction = { x: 0, y: -1 };
      break;
    case 'ArrowDown':
      if (direction.y !== -1) direction = { x: 0, y: 1 };
      break;
    case 'ArrowLeft':
      if (direction.x !== 1) direction = { x: -1, y: 0 };
      break;
    case 'ArrowRight':
      if (direction.x !== -1) direction = { x: 1, y: 0 };
      break;
  }
});

Игровой цикл и обновление состояния

Основной движок игры — это функция, которая запускается с определенной периодичностью (например, 10 раз в секунду) и отвечает за обновление состояния и перерисовку экрана.

Функция игрового цикла

function gameLoop() {
  clearScreen();
  updateSnake();
  drawSnake();
  drawFood();
  drawScore();
}

Отображение счета

Для удобства игрока добавим счетчик в верхний левый угол:

function drawScore() {
  ctx.fillStyle = 'white';
  ctx.font = '20px Arial';
  ctx.fillText('Счет: ' + score, 10, 20);
}

Запуск цикла

Для запуска цикла воспользуемся функцией setInterval с интервалом в 100 миллисекунд (10 обновлений в секунду):

let gameInterval = setInterval(gameLoop, 100);

function resetGame() {
  clearInterval(gameInterval);
  snake = [
    { x: 9, y: 9 },
    { x: 8, y: 9 },
    { x: 7, y: 9 }
  ];
  direction = { x: 1, y: 0 };
  score = 0;
  placeFood();
  gameInterval = setInterval(gameLoop, 100);
}

Полный свод основных функций и переменных

Переменная / Функция Назначение Описание
canvas, ctx Игровое поле HTML-элемент Canvas и его контекст для рисования
gridSize Размер клетки Ширина и высота клетки сетки в пикселях
snake Змейка Массив координат сегментов змейки
direction Направление Вектор направления движения змейки
food Еда Координаты еды на игровом поле
score Счет Количество съеденной еды игроком
clearScreen() Очистка холста Заполнение игрового поля черным цветом
drawSnake() Отрисовка змейки Рисует все сегменты змейки на Canvas
drawFood() Отрисовка еды Рисует еду на Canvas
updateSnake() Обновление позиции Сдвигает змейку по направлению и обрабатывает съедание еды
placeFood() Размещение еды Выбирает случайную позицию еды, исключая занятые змейкой
drawScore() Отображение счета Показывает текущий счет в левом верхнем углу
gameLoop() Игровой цикл Основная функция обновления и отрисовки
resetGame() Перезапуск игры Сбрасывает все параметры и запускает игру заново

Полезные советы и возможные расширения

После создания базовой версии игры очень интересно попробовать расширить функционал и добавить новые возможности для улучшения игрового процесса.

  • Усложненные уровни: добавить препятствия, которые нельзя пересекать.
  • Повышение скорости: с ростом счета увеличивать скорость змейки.
  • Многоуровневая графика: добавить анимации, текстуры или звуковое сопровождение.
  • Поддержка мобильных устройств: реализовать управление свайпами или кнопками на экране.
  • Рекорды и таблица лидеров: хранить высокие баллы в localStorage и отображать их.
  • Разные режимы игры: например, классический, без зацикливания краев, с уменьшением длины змейки.

Заключение

Игра «Змейка» — отличный проект, позволяющий практически познакомиться с возможностями HTML5 Canvas и JavaScript. Создавая эту игру, вы учитесь работать с графикой в браузере, обрабатывать пользовательский ввод и реализовывать игровую логику. Благодаря своей простоте и понятности «Змейка» служит прекрасной базой для дальнейшего развития навыков веб-разработки и создания более сложных проектов.

Следуя пошаговому руководству, вы сможете не только создать полностью функционирующую игру, но и персонализировать ее, внедряя собственные идеи и улучшеия. Это отличный старт для начинающих программистов и увлекательная задача для опытных разработчиков, желающих освежить знания.



Вот пример HTML-таблицы с 10 LSI-запросами для статьи о создании игры «Змейка» на JavaScript с использованием HTML5 Canvas:

«`html

Запрос 1 Запрос 2 Запрос 3 Запрос 4 Запрос 5
Создание игры на JavaScript HTML5 Canvas для начинающих Как написать игру Змейка JavaScript и графика в браузере Примеры игр на JavaScript
Разработка игры с использованием Canvas Графическая визуализация на JavaScript Змейка на HTML5 Canvas Пошаговое руководство по JavaScript Создание анимации в Canvas

«`

Эта таблица содержит 10 LSI-запросов, которые могут помочь в написании и оптимизации статьи.