Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Sugestão] Inteligência Artifical do Oponente e Rebater em Outra Direção

Estou gostando muito do curso e fiquei bem interessado na proposta de criar o nosso próprio código para mover o oponente no jogo Pong.

Decidi dar à inteligência artificial os mesmos controles do jogador humano e simular a mesma dificuldade que nós temos com o jogo, ao invés de fazê-la errar de modo aleatório.

Para isso, cada rebatida das raquetes aumenta a velocidade da bola.

A inteligência artificial tenta rebater a bola apenas se esta passar de 60% da tela, e só pode mover sua raquete a 90% da velocidade normal. Assim ela tem um tempo de reação similar a de uma pessoa, especialmente conforme a bola fica mais rápida e mais difícil de defender. Isso dá tanto ao jogador como à inteligência artificial um tempo limitado para reagir e mover a raquete.

Esta é a função que incrementa a velocidade da bola, limitado a um determinado valor:

//Incrementar a velocidade da bola em 0.5 a cada rebatida, limitando de -9 até 9
function increaseSpeed(){
  if (ballVelocityX > -9 && ballVelocityX < 9){
    //Incrementar em 0.5, mantendo o sinal
    ballVelocityX += 0.5 * (Math.sign(ballVelocityX)); 
    ballVelocityY += 0.5 * (Math.sign(ballVelocityY)); 
  }
}

Ela primeiro verifica se a bola já não atingiu a velocidade limite, senão, então adiciona 0.5 a velocidade, mantendo o mesmo sinal.

Uma coisa que senti falta no pong feito durante as aulas foi a habilidade de rebater a bola em outra direção por mover a raquete contra ela. Isso é importante pois sem essa opção o jogador rebate da mesma forma que a parede faria. Consegui atingir isso com o seguinte código:

function collideCheckLibrary(x,y){
  collided = collideRectCircle(x, y, barWidth, barHeight, ballX, ballY, ballRadius);
  if (collided){

    //Se Jogador rebateu
    if (ballVelocityX < 0) {

      //Jogador subindo raquete
      if (keyIsDown(87) && ballVelocityY > 0) {
        ballVelocityY *= -1;
      }
      //Jogador descendo raquete
      if (keyIsDown(83) && ballVelocityY < 0) {
        ballVelocityY *= -1;
      }
    }

    //Se Oponente rebateu
    else {
       //Oponente subindo raquete
      if (keyIsDown(UP_ARROW) && ballVelocityY > 0) {
        ballVelocityY *= -1;
      }
      //Oponente descendo raquete
      if (keyIsDown(DOWN_ARROW) && ballVelocityY < 0) {
        ballVelocityY *= -1;
      }

    }
    ballVelocityX *= -1;
    racketHitSound.play()
    increaseSpeed();
  }
}

A função verifica de qual lado do campo a bola está para determinar qual jogador está rebatendo, e então verifica se ele está pressionando a direção contrária do movimento da bola. Se sim, então inverte a velocidade Y da bola ao rebater.

Os controles para o Jogador 1 são W e S, e para o Jogador 2 as setas. Para jogar com outra pessoa é só alterar a variável 'multiplayer' para true ;)

Para quem quiser testar: https://editor.p5js.org/G.Felippe/full/uwQMHJ_OK

E ver o código completo: https://editor.p5js.org/G.Felippe/sketches/uwQMHJ_OK

2 respostas
solução!

Oi Gabriel, tudo certo por aí?

Nossa, seu código ficou super legal! Gostei demais dessas sugestões, tenho certeza que será uma inspiração muito boa pra outros alunos e alunas que estarão utilizando o fórum. Agradeço por compartilhar conosco.

Caso você se sinta confortável, sugiro que participe da nossa comunidade no Discord. Lá você pode interagir de forma mais dinâmica com outras pessoas que estão estudando na Alura e trocar experiências. Vou deixar aqui o link do convite:

Continue praticando assim, Gabriel!

Um forte abraço.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Oi Larissa! Tudo sim, espero que com você também.

Obrigado pelo feedback, eu tomei de inspiração as soluções postadas pelo Wesley Bissoni e Raphael Aracelli mencionados nessa etapa do curso. Espero que meu post possa ajudar outros também ^ ^

E também gradeço por me direcionar ao Discord da plataforma!

Abraços.