В этом пошаговом руководстве вы узнаете, как создать простую игру в пинг-понг на JavaScript.

Шаг 1. Настройте HTML

Во-первых, давайте создадим базовую структуру HTML для игры. Нам понадобится элемент холста для рисования игры и немного базового CSS для его стилизации.

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Ping Pong</title>
    <style>
      canvas { border: 1px solid black; }
    </style>
   </head>
   <body>
    <canvas id="gameCanvas"></canvas>
   </body>
</html>

Шаг 2: Настройте JavaScript

Далее давайте создадим файл JavaScript для обработки игровой логики. Мы начнем с создания элемента canvas и настройки некоторых основных переменных для отслеживания состояния игры.

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

let ballX = canvas.width / 2;
let ballY = canvas.height / 2;
let ballSpeedX = 5;
let ballSpeedY = 5; 

let player1Score = 0;
let player2Score = 0;

Шаг 3: Нарисуйте игру

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

function draw() {
  // Draw the background
  ctx.fillStyle = '#000'; 
  ctx.fillRect(0, 0, canvas.width, canvas.height);
  
  // Draw the ball 
  ctx.fillStyle = '#fff'; 
  ctx.beginPath();
  ctx.arc(ballX, ballY, 10, 0, Math.PI * 2); 
  ctx.fill();
  
  // Draw the score
  ctx.fillStyle = '#fff';
  ctx.font = '20px Arial';
  ctx.textAlign = 'center';
  ctx.fillText(player1Score + ' - ' + player2Score, canvas.width / 2, 50);
}

Шаг 4: Переместите мяч

Теперь давайте добавим код для перемещения мяча. Мы создадим функцию с именем move(), которая будет вызываться каждый кадр для обновления положения мяча.

function move() {
  // Move the ball
  ballX += ballSpeedX;
  ballY += ballSpeedY;
  
  // Check if the ball hit the top or bottom of the canvas
  if (ballY < 0 || ballY > canvas.height) {
    ballSpeedY = -ballSpeedY;
  }

  // Check if the ball hit the left or right of the canvas
  if (ballX < 0 || ballX > canvas.width) {
    ballSpeedX = -ballSpeedX;
  }
}

Шаг 5. Добавьте элементы управления проигрывателем.

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

let player1Y = canvas.height / 2 - 50;
let player2Y = canvas.height / 2 - 50;
const paddleHeight = 100;
document.addEventListener('keydown', event => {
  if (event.keyCode === 38) {
    // Up arrow key
    player1Y -= 10;
  } else if (event.keyCode === 40) {
    // Down arrow key
    player1Y += 10;
  } else if (event.keyCode === 87) {
    // W key
    player2Y -= 10;
  } else if (event.keyCode === 83) {
    // S key
    player2Y += 10;
  }
});

Шаг 6: Обнаружение столкновений с веслами

Далее нам нужно добавить код для обнаружения столкновения мяча с ракеткой. Мы создадим функцию `checkCollisions()`, которая будет вызываться в каждом кадре для проверки коллизий.

function checkCollisions() {
  // Check if the ball hit player 1's paddle
  if (ballX < 20 && ballY > player1Y && ballY < player1Y + paddleHeight) {
    ballSpeedX = -ballSpeedX;
  }

  // Check if the ball hit player 2's paddle
  if (ballX > canvas.width - 20 && ballY > player2Y && ballY < player2Y + paddleHeight) {
    ballSpeedX = -ballSpeedX;
  }

  // Check if the ball went out of bounds on player 1's side
  if (ballX < 0) {
    player2Score++;
    resetBall();
  }

  // Check if the ball went out of bounds on player 2's side
  if (ballX > canvas.width) {
    player1Score++;
    resetBall();
  }
}

Шаг 7: Сброс мяча

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

function resetBall() {
  ballX = canvas.width / 2;
  ballY = canvas.height / 2;
  ballSpeedX = -ballSpeedX;
  ballSpeedY = Math.random() * 10 - 5;
}

Шаг 8. Обновите игровой цикл

Теперь, когда мы определили всю игровую логику, нам нужно добавить код для обновления игры в каждом кадре. Мы создадим функцию с именем update(), которая будет вызывать все необходимые функции.

function update() {
  move();
  checkCollisions();
  draw();
  requestAnimationFrame(update);
}

update();

Заключение

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

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Ping Pong</title>
    <style>
      canvas { border: 1px solid black; }
    </style>
   </head>
   <body>
    <canvas id="gameCanvas"></canvas>
     <script>
      const canvas = document.getElementById('gameCanvas');
      const ctx = canvas.getContext('2d');
      
      let ballX = canvas.width / 2;
      let ballY = canvas.height / 2;
      let ballSpeedX = 5;
      let ballSpeedY = 5;
      
      let player1Y = canvas.height / 2 - 50;
      let player2Y = canvas.height / 2 - 50;
      const paddleHeight = 100;
      
      let player1Score = 0;
      let player2Score = 0;
      
      document.addEventListener('keydown', event => {
        if (event.keyCode === 38) {
          // Up arrow key
          player1Y -= 10;
        } else if (event.keyCode === 40) {
          // Down arrow key
          player1Y += 10;
        } else if (event.keyCode === 87) {
          // W key
          player2Y -= 10;
        } else if (event.keyCode === 83) {
          // S key
          player2Y += 10;
        }
      });
      
      function draw() {
        // Draw the background
        ctx.fillStyle = 'black';
        ctx.fillRect(0, 0, canvas.width, canvas.height);
        
        // Draw the ball
        ctx.fillStyle = 'white';
        ctx.beginPath();
        ctx.arc(ballX, ballY, 10, 0, Math.PI * 2);
        ctx.fill();
        
        // Draw player 1's paddle
        ctx.fillStyle = 'white';
        ctx.fillRect(10, player1Y, 10, paddleHeight);
        
        // Draw player 2's paddle
        ctx.fillStyle = 'white';
        ctx.fillRect(canvas.width - 20, player2Y, 10, paddleHeight);
        
        // Draw the score
        ctx.fillStyle = 'white';
        ctx.font = '30px Arial';
        ctx.fillText(`${player1Score} - ${player2Score}`, canvas.width / 2 - 50, 50);
    }
        
      function move() {
        // Move the ball
        ballX += ballSpeedX;
        ballY += ballSpeedY;
        
        // Bounce the ball off the top and bottom walls
        if (ballY < 0 || ballY > canvas.height) {
          ballSpeedY = -ballSpeedY;
        }
      }
      
      function checkCollisions() {
        // Check if the ball hit player 1's paddle
        if (ballX < 20 && ballY > player1Y && ballY < player1Y + paddleHeight) {
          ballSpeedX = -ballSpeedX;
        }
        
        // Check if the ball hit player 2's paddle
        if (ballX > canvas.width - 20 && ballY > player2Y && ballY < player2Y + paddleHeight) {
          ballSpeedX = -ballSpeedX;
        }
        
        // Check if the ball went out of bounds on player 1's side
        if (ballX < 0) {
          player2Score++;
          resetBall();
        }
      
        // Check if the ball went out of bounds on player 2's side
        if (ballX > canvas.width) {
          player1Score++;
          resetBall();
        }
      }
      
      function resetBall() {
        ballX = canvas.width / 2;
        ballY = canvas.height / 2;
        ballSpeedX = -ballSpeedX;
        ballSpeedY = Math.random() * 10 - 5;
      }
      
      function update() {
        move();
        checkCollisions();
        draw();
        requestAnimationFrame(update);
      }
      
      update();
    </script>
  </body>
</html>

Я надеюсь, что это руководство помогло вам показать, как программировать игру в пинг-понг на JavaScript. Как видите, игра состоит из нескольких различных компонентов, которые работают вместе, чтобы создать увлекательный и увлекательный пользовательский опыт. С некоторыми дополнительными настройками и экспериментами вы можете дополнительно настроить и улучшить игру в соответствии со своими интересами и предпочтениями.

Удачи и удачного кодирования!

Дополнительные материалы на PlainEnglish.io.

Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord .

Заинтересованы в масштабировании запуска вашего программного обеспечения? Ознакомьтесь с разделом Схема.