Игра в понг на JavaScript

Опубликовано: 27 Августа, 2022

Игра Pong — это видеоигра на тему настольного тенниса для двух игроков. В игре участвуют две ракетки и движущийся мяч. Игроки должны перемещать ракетки вверх или вниз и спасать мяч от удара о стену. Если мяч попадает в стену, то это счет для другого игрока.

Требования: Знание HTML, CSS, JavaScript.

Процедура:

  • Создайте файл HTML с именем index.html.
  • Создайте файл CSS с именем styles.css и свяжите его в файле index.html с помощью тега link.
  • Создайте файл JS с именем index.js и свяжите его с файлом index.html с помощью тега script.
  • Создайте div для игрового поля, мяча и 2 div для ракеток, т.е. player-1 и player-2.
  • Придайте стиль своей игре в файле CSS.
  • Получите ссылку на ракетки, мячи и игровые доски в JS.
  • Создайте в файле index.js функцию с именем move ball.
  • Задайте мячу случайное направление и случайную скорость, изменив координаты x и y мяча.
  • Примените столкновение с мячом и верхней/нижней стороной игрового поля, т.е. если мяч касается верхней/нижней части игрового поля, то умножьте -1 * y на скорость мяча.
  • Примените столкновение с мячом и играйте слева и справа от игрового поля. т.е. увеличить счет и изменить состояние игры, чтобы служить государству.
  • Примените столкновение с мячом и веслами. т.е. умножьте -1 * x скорость мяча.

Направление игры:

  • Чтобы начать игру, нажмите клавишу « ENTER» .
  • Игрок 1: Игрок 1 может управлять левым манипулятором, т.е. PADDLE_1 с помощью клавиши « W » для перемещения вверх и для опускания следует использовать клавишу « S ».
  • Игрок 2: Игрок 2 может управлять левым манипулятором, т. е. PADDLE_2 , используя клавишу « Стрелка вверх », чтобы двигаться вверх, а чтобы идти вниз, следует использовать клавишу « Стрелка вниз».

HTML-код:

HTML




<!DOCTYPE html>
<html lang="en">
  
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content=
        "width=device-width, initial-scale=1.0">
    <title>PONG GAME</title>
    <link rel="stylesheet" href="style.css">
</head>
  
<body>
    <div class="board">
        <div class="ball">
            <div class="ball_effect"></div>
        </div>
        <div class="paddle_1 paddle"></div>
        <div class="paddle_2  paddle"></div>
        <h1 class="player_1_score">0</h1>
        <h1 class="player_2_score">0</h1>
        <h1 class="message">
            Press Enter to Play Pong
        </h1>
    </div>
      
    <script src="index.js"></script>
</body>
  
</html>

CSS-код:




* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}
  
body {
    height: 100vh;
    width: 100vw;
    background-image: linear-gradient(
            to top, #ffda77, #ffa45b);
    display: flex;
    justify-content: center;
    align-items: center;
}
  
.board {
    height: 85vh;
    width: 80vw;
    background-image: linear-gradient(
            to right, #5c6e91, #839b97);
    border-radius: 14px;
}
  
.ball {
    height: 30px;
    width: 30px;
    border-radius: 50%;
    position: fixed;
    top: calc(50% - 15px);
    left: calc(50% - 15px);
}
  
.ball_effect {
    height: 100%;
    width: 100%;
    border-radius: 100px;
    animation: spinBall 0.1s linear infinite;
    box-shadow: inset 0 0 18px #fff, 
        inset 6px 0 18px violet, 
        inset -6px 0 18px #0ff, 
        inset 6px 0 30px violet, 
        inset -6px 0 30px #0ff, 
        0 0 18px #fff, -4px 0 18px 
        violet, 4px 0 18px #0ff;
}
  
@keyframes spinBall {
    100% {
        -webkit-transform: rotate(360deg);
        transform: rotate(360deg);
    }
}
  
.paddle {
    height: 100px;
    width: 18px;
    border-radius: 50%;
    position: fixed;
}
  
.paddle_1 {
    top: calc(7.5vh + 55px);
    left: calc(10vw + 30px);
    box-shadow: inset 0 0 18px #fff, 
        inset -6px 0 18px #f3bad6, 
        inset 6px 0 18px #0ff, 
        inset -6px 0 30px #f3bad6, 
        inset 6px 0 30px #0ff, 
        0 0 18px #fff, 4px 0 18px 
        #f3bad6, -4px 0 18px #0ff;
}
  
.paddle_2 {
    top: calc(85vh + 7.5vh - 100px - 55px);
    right: calc(10vw + 30px);
    box-shadow: inset 0 0 18px #fff, 
        inset 6px 0 18px #f3bad6, 
        inset -6px 0 18px #0ff, 
        inset 6px 0 30px #f3bad6, 
        inset -6px 0 30px #0ff, 
        0 0 18px #fff, -4px 0 18px 
        #f3bad6, 4px 0 18px #0ff;
}
  
.player_1_score {
    height: 50px;
    width: 50px;
    color: chartreuse;
    position: fixed;
    left: 30vw;
    margin-top: 30px;
}
  
.player_2_score {
    height: 50px;
    width: 50px;
    color: chartreuse;
    position: fixed;
    left: 70vw;
    margin-top: 30px;
}
  
.message {
    position: fixed;
    /* color: #48426d; */
    height: 10vh;
    width: 30vw;
    color: #c9cbff;
    left: 38vw;
    margin: 30px auto auto auto;
}

Код JavaScript:

Javascript




let gameState = "start";
let paddle_1 = document.querySelector(".paddle_1");
let paddle_2 = document.querySelector(".paddle_2");
let board = document.querySelector(".board");
let initial_ball = document.querySelector(".ball");
let ball = document.querySelector(".ball");
let score_1 = document.querySelector(".player_1_score");
let score_2 = document.querySelector(".player_2_score");
let message = document.querySelector(".message");
let paddle_1_coord = paddle_1.getBoundingClientRect();
let paddle_2_coord = paddle_2.getBoundingClientRect();
let initial_ball_coord = ball.getBoundingClientRect();
let ball_coord = initial_ball_coord;
let board_coord = board.getBoundingClientRect();
let paddle_common = 
    document.querySelector(".paddle").getBoundingClientRect();
  
let dx = Math.floor(Math.random() * 4) + 3;
let dy = Math.floor(Math.random() * 4) + 3;
let dxd = Math.floor(Math.random() * 2);
let dyd = Math.floor(Math.random() * 2);
  
document.addEventListener("keydown", (e) => {
  if (e.key == "Enter") {
    gameState = gameState == "start" ? "play" : "start";
    if (gameState == "play") {
      message.innerHTML = "Game Started";
      message.style.left = 42 + "vw";
      requestAnimationFrame(() => {
        dx = Math.floor(Math.random() * 4) + 3;
        dy = Math.floor(Math.random() * 4) + 3;
        dxd = Math.floor(Math.random() * 2);
        dyd = Math.floor(Math.random() * 2);
        moveBall(dx, dy, dxd, dyd);
      });
    }
  }
  if (gameState == "play") {
    if (e.key == "w") {
      paddle_1.style.top =
        Math.max(
          board_coord.top,
          paddle_1_coord.top - window.innerHeight * 0.06
        ) + "px";
      paddle_1_coord = paddle_1.getBoundingClientRect();
    }
    if (e.key == "s") {
      paddle_1.style.top =
        Math.min(
          board_coord.bottom - paddle_common.height,
          paddle_1_coord.top + window.innerHeight * 0.06
        ) + "px";
      paddle_1_coord = paddle_1.getBoundingClientRect();
    }
  
    if (e.key == "ArrowUp") {
      paddle_2.style.top =
        Math.max(
          board_coord.top,
          paddle_2_coord.top - window.innerHeight * 0.1
        ) + "px";
      paddle_2_coord = paddle_2.getBoundingClientRect();
    }
    if (e.key == "ArrowDown") {
      paddle_2.style.top =
        Math.min(
          board_coord.bottom - paddle_common.height,
          paddle_2_coord.top + window.innerHeight * 0.1
        ) + "px";
      paddle_2_coord = paddle_2.getBoundingClientRect();
    }
  }
});
  
function moveBall(dx, dy, dxd, dyd) {
  if (ball_coord.top <= board_coord.top) {
    dyd = 1;
  }
  if (ball_coord.bottom >= board_coord.bottom) {
    dyd = 0;
  }
  if (
    ball_coord.left <= paddle_1_coord.right &&
    ball_coord.top >= paddle_1_coord.top &&
    ball_coord.bottom <= paddle_1_coord.bottom
  ) {
    dxd = 1;
    dx = Math.floor(Math.random() * 4) + 3;
    dy = Math.floor(Math.random() * 4) + 3;
  }
  if (
    ball_coord.right >= paddle_2_coord.left &&
    ball_coord.top >= paddle_2_coord.top &&
    ball_coord.bottom <= paddle_2_coord.bottom
  ) {
    dxd = 0;
    dx = Math.floor(Math.random() * 4) + 3;
    dy = Math.floor(Math.random() * 4) + 3;
  }
  if (
    ball_coord.left <= board_coord.left ||
    ball_coord.right >= board_coord.right
  ) {
    if (ball_coord.left <= board_coord.left) {
      score_2.innerHTML = +score_2.innerHTML + 1;
    } else {
      score_1.innerHTML = +score_1.innerHTML + 1;
    }
    gameState = "start";
  
    ball_coord = initial_ball_coord;
    ball.style = initial_ball.style;
    message.innerHTML = "Press Enter to Play Pong";
    message.style.left = 38 + "vw";
    return;
  }
  ball.style.top = ball_coord.top + dy * (dyd == 0 ? -1 : 1) + "px";
  ball.style.left = ball_coord.left + dx * (dxd == 0 ? -1 : 1) + "px";
  ball_coord = ball.getBoundingClientRect();
  requestAnimationFrame(() => {
    moveBall(dx, dy, dxd, dyd);
  });
}

Комбинированный код:

Выход: