Juego de ping en JavaScript

Pong es un videojuego de tenis de mesa para dos jugadores. El juego involucra dos paletas y una pelota en movimiento. Los jugadores tienen que mover las paletas hacia arriba o hacia abajo y evitar que la pelota sea golpeada contra la pared. Si la pelota golpea la pared, entonces es una puntuación para otro jugador.

Requisito previo: debe tener conocimiento de HTML, CSS, JavaScript.

Procedimiento:

  • Cree un archivo HTML con el nombre index.html.
  • Cree un archivo CSS con el nombre estilos.css y vincúlelo en el archivo index.html usando la etiqueta de enlace.
  • Cree un archivo JS con el nombre index.js y vincúlelo en el archivo index.html usando una etiqueta de secuencia de comandos.
  • Cree un div para el tablero de juego, la pelota y 2 div para las paletas, es decir, el jugador 1 y el jugador 2.
  • Dale un poco de estilo a tu juego en el archivo CSS.
  • Obtenga una referencia de paletas, pelotas y tableros de juego en JS.
  • Cree una función en el archivo index.js con el nombre move ball.
  • Dale a la pelota una dirección aleatoria y una velocidad aleatoria cambiando las coordenadas x e y de la pelota.
  • Aplique la colisión con la parte superior/inferior de la pelota y el tablero de juego, es decir, si la pelota toca la parte superior/inferior del tablero, multiplique -1 * y la velocidad de la pelota.
  • Aplicar colisión con bola y juego lado izquierdo y derecho del tablero de juego. es decir, aumentar la puntuación y cambiar el estado del juego para servir al estado.
  • Aplicar colisión con pelota y paletas. es decir multiplicar -1 * x velocidad de la pelota.

Dirección para jugar:

  • Para iniciar el juego Pulse la tecla «ENTER» .
  • Jugador 1: El jugador 1 puede controlar la paleta del lado izquierdo, es decir, PADDLE_1 usando la tecla ‘ W ‘ para moverse hacia arriba y para ir hacia abajo se debe usar la tecla ‘ S ‘.
  • Jugador 2: El jugador 2 puede controlar la paleta del lado izquierdo, es decir, PADDLE_2 usando la tecla ‘ Flecha ARRIBA ‘ para moverse hacia arriba y para ir hacia abajo , se debe usar la tecla ‘ Flecha Abajo ‘.

Código 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>

Código 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;
}

Código 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);
  });
}

Código de combinación:

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>
  
    <style>
      *{
        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;
      }
    </style>
</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>
    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);
      });
    }
  </script>
</body>
    
</html>

Producción:

Publicación traducida automáticamente

Artículo escrito por vivshubham y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *