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