Создание веб-игры для回避блока

JavaScriptJavaScriptBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом проекте мы собираемся создать веселую и простую игру "Избегание блоков" с использованием HTML, CSS и JavaScript. В этой игре игрок должен двигать блоки, нажимая на черные блоки, чтобы заработать очки и избегать нажатия на белые блоки. Давайте начнем построение пошагово!

👀 Предпросмотр

Предпросмотр игры "Избегание блоков"

🎯 Задачи

В этом проекте вы научитесь:

  • Как проектировать макет игры с использованием HTML
  • Как добавить стилизацию к игре с использованием CSS
  • Как реализовать базовую игровую логику с использованием JavaScript
  • Как инициализировать игру и создать начальную группу блоков
  • Как реализовать функциональность игрового процесса, включая обнаружение нажатия на блоки, сценарии окончания игры, создание и движение блоков
  • Как завершить подсчет очков и управление скоростью игры

🏆 Достижения

После завершения этого проекта вы сможете:

  • проектировать веб-макеты с использованием HTML
  • применять методы стилизации с использованием CSS
  • реализовывать игровую логику с использованием JavaScript
  • манипулировать с Document Object Model (DOM)
  • обрабатывать события и взаимодействия с пользователем
  • создавать и управлять переменными состояния игры
  • динамически изменять и обновлять игровой экран
  • тестировать и отлаживать реализацию игры

проектирование игрового макета с использованием HTML

Требования:

  • Откройте файл index.html.
  • Знание HTML-тегов и структуры.

Функциональность:

  • Разместите главный игровой контейнер.
  • Отобразите счет игры.
  • Предоставьте кнопку "Старт", чтобы начать игру.

Шаги:

<!doctype html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>Избегайте белых блоков</title>
    <link rel="stylesheet" href="styles.css" />
  </head>
  <body>
    <h2>score</h2>
    <h2 id="score">0</h2>
    <div id="main">
      <div id="con"></div>
      <!-- Игровой контейнер -->
    </div>
    <div class="btn">
      <button class="start" onclick="start()">Start</button>
      <!-- Кнопка "Старт" -->
    </div>
  </body>
  <script src="script.js"></script>
</html>

В приведенном выше коде мы создали базовую структуру HTML для нашей игры. У нас есть div с id="main", который будет нашим игровым контейнером. Внутри игрового контейнера есть еще один div с id="con", который будет нашим игроком. Мы также создали button с class="start", который будет использоваться для запуска игры.

✨ Проверить решение и практиковаться

Добавление стилизации к игре

Требования:

  • Откройте файл styles.css.
  • Основное знание свойств и селекторов CSS.
  • Понимание методов стилизации для адаптивных дизайнов.

Функциональность:

  • Повысить визуальный привлекательность игры.
  • Сделать игровой интерфейс адаптивным для различных размеров экранов.

Шаги:

body {
  background-color: #f0f0f0;
  font-family: "Arial", sans-serif;
}
h2 {
  text-align: center;
  color: #333;
  margin-bottom: 8px;
}
#main {
  width: 408px;
  height: 408px;
  background: white;
  border: 8px solid #ccc;
  border-radius: 10px;
  /* Добавлено скругление границ для более мягкого вида */
  margin: 20px auto;
  overflow: hidden;
  position: relative;
  /* Добавлена относительная позиция для позиционирования дочерних элементов */
}
#con {
  width: 100%;
  height: 400px;
  position: absolute;
  /* Изменено на абсолютную */
  top: -408px;
}
.row {
  height: 100px;
  width: 100%;
}
.cell {
  height: 100px;
  width: 100px;
  float: left;
  border-bottom: rgb(200, 200, 200) 1px solid;
  /* Легкий цвет границы */
}
.black {
  background: #444;
  /* Темный серый вместо черного для более мягкого вида */
}
.btn {
  width: 100%;
  text-align: center;
  margin-top: 20px;
}
.start {
  margin: 20px auto;
  width: 150px;
  height: 50px;
  border-radius: 25px;
  /* Увеличено скругление границ для формы пилюли */
  background: #4caf50;
  /* Зеленая кнопка */
  color: #fff;
  font-size: 16px;
  /* Увеличен размер шрифта */
  border: none;
  /* Удалена стандартная граница */
  cursor: pointer;
  /* Эффект курсора */
  transition: background 0.3s;
  /* Эффект перехода */
}
.start:hover {
  background: #45a049;
  /* Темнее зеленое при наведении */
}

В приведенном выше коде мы добавили некоторую базовую стилизацию к нашей игре. Мы добавили цвет фона для body и семейство шрифта для текста. Мы также добавили скругление границ для игрового контейнера, чтобы он выглядел более мягко. Мы также добавили position: relative для игрового контейнера и position: absolute для игрока. Это позволит нам позиционировать игрока внутри игрового контейнера. Мы также добавили эффект перехода для кнопки "Старт".

✨ Проверить решение и практиковаться

Реализация базовой игровой логики

Требования:

  • Откройте файл script.js.
  • Предварительное знакомство с основами JavaScript.
  • Понимание концепции Document Object Model (DOM).

Функциональность:

  • Создать важные вспомогательные функции.
  • Инициализировать ключевые переменные состояния игры.

Шаги:

// Вспомогательные функции и инициализация переменных
// Получить элемент по его id
function $(id) {
  return document.getElementById(id);
}

// Создать div-элемент с заданным именем класса
function creatediv(className) {
  var div = document.createElement("div");
  div.className = className;
  return div;
}
// Инициализировать id интервала как null изначально
var clock = null;
// Состояние игры (0 означает остановлено, 1 означает запущено)
var state = 0;
// Скорость движения игровых блоков
var speed = 6;
// Флаг для проверки, началась ли игра или нет
var flag = false;

В приведенном выше коде мы создали две вспомогательные функции. Первая функция $(id) используется для получения элемента по его id. Вторая функция creatediv(className) используется для создания div-элемента с заданным именем класса. Мы также инициализировали некоторые переменные, которые будут использоваться позже в игре.

✨ Проверить решение и практиковаться

Инициализация игры

Требования:

  • Способность создавать функции на JavaScript.
  • Знание JavaScript-обработчиков событий.

Функциональность:

  • Подготовить игру к запуску.
  • Создать начальную группу блоков игры.

Шаги:

// Нажатие на кнопку "Старт игры", чтобы начать игру
function start() {
  if (!flag) {
    init();
  } else {
    alert("Игра уже началась! Нет необходимости нажимать снова!");
  }
}

// Функция инициализации (init)
function init() {
  flag = true;
  for (var i = 0; i < 4; i++) {
    createrow();
  }

  // Добавление обработчиков событий с использованием addEventListener
  $("main").addEventListener("click", function (ev) {
    judge(ev);
  });

  // Таймер вызывает move() каждые 30 миллисекунд
  clock = setInterval(move, 30);
}

В приведенном выше коде мы создали функцию start(), которая будет вызываться при нажатии на кнопку "Старт". Внутри функции start() мы вызвали функцию init(), которая инициализирует игру. Внутри функции init() мы установили переменную flag в значение true, которая будет использоваться для проверки, началась ли игра или нет. Мы также создали четыре ряда блоков с использованием функции createrow(). Мы также добавили обработчик событий к игровому контейнеру, который будет использоваться для обнаружения события нажатия на игровой контейнер. Мы также установили таймер, который будет вызывать функцию move() каждые 30 миллисекунд.

✨ Проверить решение и практиковаться

Реализация функциональности игрового процесса

Требования:

  • Навык работы с циклами и условиями в JavaScript.
  • Знание способов манипуляции с DOM с использованием JavaScript.

Функциональность:

  • Создать ядро игровой динамики.
  • Сконструировать сценарии окончания игры.
  • Реализовать механизмы создания и движения блоков.

Шаги:

  1. Проверить, нажал ли игрок на черный или белый блок. Обновить статус игры в зависимости от нажатия игрока.
// Определить, нажат ли черный или белый блок
function judge(ev) {
  if (
    ev.target.className.indexOf("black") == -1 &&
    ev.target.className.indexOf("cell") !== -1
  ) {
    ev.target.parentNode.pass1 = 1; // Определяет атрибут pass, который показывает, что белый блок этой строки был нажат
  }

  if (ev.target.className.indexOf("black") !== -1) {
    // Нажатие на элемент с классом, содержащим "black", означает черный блок
    ev.target.className = "cell";
    ev.target.parentNode.pass = 1; // Определяет атрибут pass, указывающий на то, что черный блок этой строки был нажат
    score();
  }
}
  1. Определить, когда игра окончена на основе взаимодействия игрока. Запустить действия по окончанию игры, когда игра заканчивается.
// Проверить, закончена ли игра
function over() {
  var rows = con.childNodes;
  if (rows.length == 5 && rows[rows.length - 1].pass !== 1) {
    fail();
  }
  for (let i = 0; i < rows.length; i++) {
    if (rows[i].pass1 == 1) {
      fail();
    }
  }
}

// Конец игры
function fail() {
  clearInterval(clock);
  flag = false;
  confirm("Итоговый счет: " + parseInt($("score").innerHTML));
  var con = $("con");
  con.innerHTML = "";
  $("score").innerHTML = 0;
  con.style.top = "-408px";
}
  1. Генерировать ряды блоков для игрового процесса. Случайным образом располагать "черный" блок среди других.
// Создать <div class="row"> с четырьмя дочерними <div class="cell">
function createrow() {
  var con = $("con");
  var row = creatediv("row"); // Создать div: className=row
  var arr = createcell(); // Определить класс имени div cell, один из которых является cell black

  con.appendChild(row); // Добавить дочерний узел с row в качестве con

  for (var i = 0; i < 4; i++) {
    row.appendChild(creatediv(arr[i])); // Добавить дочерние узлы row cell
  }

  if (con.firstChild == null) {
    con.appendChild(row);
  } else {
    con.insertBefore(row, con.firstChild);
  }
}

// Создать массив имен классов; один из них - "cell black", остальные - "cell"
function createcell() {
  var temp = ["cell", "cell", "cell", "cell"];
  var i = Math.floor(Math.random() * 4); // Случайным образом сгенерировать позицию черного блока Math.random() функция параметров 0~1 случайное число
  temp[i] = "cell black";
  return temp;
}
  1. Сделать блоки двигаться вниз непрерывно. Удалять старые ряды, когда они выходят из вида.
// Переместить черные блоки вниз
function move() {
  var con = $("con");
  var top = parseInt(window.getComputedStyle(con, null)["top"]);

  if (speed + top > 0) {
    top = 0;
  } else {
    top += speed;
  }
  con.style.top = top + "px"; // Продолжать двигать значение top, чтобы оно двигалось
  over();
  if (top == 0) {
    createrow();
    con.style.top = "-102px";
    delrow();
  }
}

// Удалить строку
function delrow() {
  var con = $("con");
  if (con.childNodes.length == 6) {
    con.removeChild(con.lastChild);
  }
}
✨ Проверить решение и практиковаться

Завершение подсчета очков и управления скоростью в игре

Требования:

  • Понимание переменных и арифметических операций в JavaScript.
  • Способность писать сложную игровую логику на JavaScript.

Функциональность:

  • Создать систему вознаграждений.
  • Создать систему, которая постепенно повышает сложность игры.

Шаги:

// Функция ускорения, увеличивает скорость
function speedup() {
  speed += 2;
  if (speed == 20) {
    alert("Это просто потрясающе!");
  }
}
// Подсчет очков
function score() {
  var newscore = parseInt($("score").innerHTML) + 1; // увеличить счет на единицу
  $("score").innerHTML = newscore; // изменить счет
  if (newscore % 10 == 0) {
    // Использовать функцию ускорения, когда счет кратен 10, игра становится все быстрее
    speedup();
  }
}

В приведенном выше коде мы создали функцию speedup(), которая будет использоваться для увеличения скорости игры. Мы также создали функцию score(), которая будет использоваться для увеличения счета в игре. Мы также добавили условие в функции score(), которое вызовет функцию speedup(), когда счет кратен 10.

✨ Проверить решение и практиковаться

Протестируйте свою игру

  • Откройте index.html в веб-браузере.
open web
  • Играйте в игру, убедитесь, что все функциональные возможности работают как ожидается.
  • Эффект страницы выглядит следующим образом:
gameplay demonstration animation

Резюме

Превосходная работа! Вы только что从头开始создали простую, но好玩的блок-игру для回避,используя HTML, CSS и JavaScript. Этот проект познакомил вас с обработкой взаимодействия пользователя, игровой логикой и динамическим стилем CSS в зависимости от изменений состояния игры. Вы можете расширить эту базовую игру дополнительными функциями, такими как уровни, ограничения по времени или различные режимы сложности. Наслаждайтесь экспериментами с вашей новой игрой!