Как страница для пасхалки завлекает меня все сильнее и сильнее.

Ryan Ryan 15 Июля 2023 (ред)

Речь идет о странице с игрой Тетрис Онлайн. Поиграть можно тут: https://ip-gamers.net/gaming/tetris/. Регистрация не требуется. Ничего особенного простой тетрис.

Изначально я просто взял самый простой код на github, ибо суть страницы не в тетрисе, а в пасхалке.
Если зайти на эту страницу, именно закрыть и открыть ее по новой (Простое обновление странички не сработает), не играя в тетрис сразу ввести определенный код, то можно активировать скрытое видео, кусочек из фильма Free Guy.

Но чего-то меня затянул именно тетрис.
Сначала я увидел, что когда игрок управляет тетромино стрелочками, страница тоже двигается. Поэтому пришлось добавлять в тетрис блокировку клавиш:

document.addEventListener('keydown', function(e) {
  if (gameOver) return;

  e.preventDefault(); // Отменяем стандартное поведение браузера

  if (e.which === 37 || e.which === 39) {
    const col = e.which === 37
      ? tetromino.col - 1
      : tetromino.col + 1;

    if (isValidMove(tetromino.matrix, tetromino.row, col)) {
      tetromino.col = col;
    }
  }
  if (e.which === 32) {
      let row = tetromino.row;
      while (isValidMove(tetromino.matrix, row + 1, tetromino.col)) {
        row++;
      }
      tetromino.row = row;
      placeTetromino();
      return;
    }

  if (e.which === 38) {
    const matrix = rotate(tetromino.matrix);
    if (isValidMove(matrix, tetromino.row, tetromino.col)) {
      tetromino.matrix = matrix;
    }
  }

  if(e.which === 40) {
    const row = tetromino.row + 1;

    if (!isValidMove(tetromino.matrix, row, tetromino.col)) {
      tetromino.row = row - 1;

      placeTetromino();
      return;
    }

    tetromino.row = row;
  }
});

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

<audio id="bgMusic" loop>
  <source src="{media="6"}" type="audio/mpeg">
</audio>

<center>
  <div id="game-container" style="border: 2px solid #000; padding: 10px;">
    <div id="score-container" style="display: flex; justify-content: center; align-items: flex-start;">
      <div id="score-wrapper" style="text-align: right;">
        <span id="score" style="font-size: 18px; color: #fff;"></span><br>
        <span id="rows" style="font-size: 14px; color: #fff;"></span><br>
        <span id="level" style="font-size: 14px; color: #fff;"></span>
      </div>
    </div>
    <canvas width="320" height="640" id="game" style="background-color: #212429;"></canvas>
    <a href="https://ip-gamers.net/topic/3218-podderzhka-igry-tetris-onlajn/" style="display: block; margin-top: 10px; text-align: center; text-decoration: none;">Перейти к основной теме поддержки</a>
  </div>
</center>

Как вы видите, помимо вывода текущего счета, я добавил еще фоновую музыку.

const bgMusic = document.getElementById('bgMusic');
bgMusic.volume = 0.6;
bgMusic.play();

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

Саму же фоновую музыку, я взял на ютубе, мне пришлось склеить два ремикса, я думаю этого достаточно. Не думаю что кто-то справится и сможет проиграть дольше…

Вообще идеи в голове появляются и появляются и в итоге, мой тетрис становится лучше и лучше.

А картинок в посте нет, потому что ЧИТАЙТЕ! Картинки хоть и привлекают людей, но все же, я консервативен…

+ 1. Фоновая музыка теперь при проигрыше будет останавливаться.
Для этого мы добавляем bgMusic.pause(); в функцию:

function showGameOver() {
  cancelAnimationFrame(rAF);
  bgMusic.pause();
  gameOver = true;
  context.fillStyle = 'black';
  context.globalAlpha = 0.75;
  context.fillRect(0, canvas.height / 2 - 30, canvas.width, 60);
  context.globalAlpha = 1;
  context.fillStyle = 'white';
  context.font = '36px monospace';
  context.textAlign = 'center';
  context.textBaseline = 'middle';
  context.fillText('108??', canvas.width / 2, canvas.height / 2);
}
  1. А для добавления звуков приземлившихся тетромино. Мы в самое начало кода добавляем:
const lineClearSound = document.getElementById('lineClearSound');

Затем помещаем это lineClearSound.play(); в функцию:

function placeTetromino() {
  lineClearSound.play(); // Воспроизводим звук уничтожения линии
  for (let row = 0; row < tetromino.matrix.length; row++) {
    for (let col = 0; col < tetromino.matrix[row].length; col++) {
      if (tetromino.matrix[row][col]) {
        if (tetromino.row + row < 0) {
          return showGameOver();
        }
        playfield[tetromino.row + row][tetromino.col + col] = tetromino.name;
      }
    }
  }

+ Соответственно мы не забываем подключить новый звук на самой странице с игрой:

<audio id="lineClearSound">
  <source src="{media="7"}" type="audio/mpeg">
</audio>

+ По тому же принципу добавляем звук проигрыша в showGameOver()

10 Ответов

  1. Evg Evg 15 Июля 2023

    Хм. Перешел на ссылке и играл минут 10 smile давненько в тетрис не играл, прикольно.

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

  1. Ryan Ryan 15 Июля 2023

    Очень интересный факт, если добавлять звуки между этой функцией:

    function placeTetromino() {
      for (let row = 0; row < tetromino.matrix.length; row++) {
        for (let col = 0; col < tetromino.matrix[row].length; col++) {
          if (tetromino.matrix[row][col]) {
            if (tetromino.row + row < 0) {
              return showGameOver();
            }
            playfield[tetromino.row + row][tetromino.col + col] = tetromino.name;
          }
        }
        lineClearSound.play(); // Воспроизводим звук уничтожения линии
      }

    И этой:

    function updateScore(clearedLines) {
      const lineScores = [0, 1]; 
      score += lineScores[clearedLines]; 
      level = Math.floor(score / 5) + 1; 
      updateSpeed(level);
      const scoreElement = document.getElementById('score');
      scoreElement.textContent = `Счет: ${score}`;
      lineClearSound2.play();
    
    }

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

    Или я просто ленивый мудила, который нашел отмазку…

  1. Ryan Ryan 15 Июля 2023 (ред.)

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

    Дизайном пока не занимался. Я думаю это надо делать в конце, после реализации всех своих идей.

  1. yuran yuran 15 Июля 2023 (ред.)

    Тоже зашел поиграл 10 минут smile Прикольно. Автор молодец, а еще и программист!

    1. Ryan Ryan 15 Июля 2023 (ред.)

      Спасибо) Но я так себе, казуальнее меня не существует никого.

  1. Ryan Ryan 15 Июля 2023

    Ну и последний штрих, это простенький дизайн:

    <style>
      /* Общие стили */
      body {
        font-family: Arial, sans-serif;
        background-color: #f2f2f2;
      }
    
      /* Центрирование содержимого */
      .centered-content {
        display: flex;
        justify-content: center;
        align-items: start;
      }
    
      /* Стили для области игры */
      #game {
        margin-right: 10px;
      }
    
      /* Стили для боковой панели */
      .sidebar {
        position: relative;
        top: 0;
        right: 0;
        border: 2px solid #57595d;
        padding: 15px;
        text-align: center;
      }
    
      .sidebar hr {
        margin-top: 10px;
        margin-bottom: 10px;
        border: none;
        border-top: 1px solid #ccc;
      }
    
      .sidebar a {
        text-decoration: none;
      }
    </style>

    игра тетрис

  1. Ryan Ryan 15 Июля 2023

    Кстати. Первый зафиксированный рекорд, это 70 уничтоженных линий.

    1. Evg Evg 16 Июля 2023

      Убивалка времени. Вот рекорд ) и че то 108? показывает

      тетрис рекор

  1. Ryan Ryan 18 Июля 2023 (ред.)

    Справедливости ради стоит отметить то, что данный тетрис еще немного улучшил пользовать Ed MSL.
    https://ip-gamers.net/topic/3218-podderzhka-igry-tetris-onlajn/page/2/#comment-13370

    1. yuran yuran 19 Июля 2023 (ред.)

      Ryan — а можно я возьму код и прикручу к сайту на instantcms? Я так понял у Вас на сайте можно скачать исходник…