Vou tentar explicar pelo que eu entendi e não vai ser breve... kkkk
Aqui fica definido que a velocidade do movimento que o oponente vai fazer no eixo y, será igual ao movimento que a bolinha vai fazer no eixo y , menos o valor declarado para a variável yRaqueteOponente(150). Isso deve fazer o valor da variável yRaqueteOponente, se alterar em função da variável yBolinha, e assim, fazer a raquete se mover na mesma direção (em y ) da bolinha;
Lembrando que o valor declarado para a variável yRaqueteOponente(150), corresponde ao ponto mais alto da raquete. Se vc experimentar o código a seguir, verá que a bolinha vai bater no topo da raquete.
function movimentaRaqueteOponente(){
velocidadeYOponente = (yBolinha -yRaqueteOponente);
yRaqueteOponente += velocidadeYOponente;
/*Lembrando que isso:
yRaqueteOponente += velocidadeYOponente;
é igual a isso:
yRaqueteOponente = yRaqueteOponente+velocidadeYOponente;
*/
Agora:
Se vc ainda diminuir a metade da altura (raqueteComprimento / 2) - 30, vc trás o y da raquete mais para cima(e aqui para cima quer dizer mais próximo de 0, portanto, um numero menor) em relação ao y da bolinha e ela acerta a raquete no centro.
Tente o código a seguir:
function movimentaRaqueteOponente(){
velocidadeYOponente = yBolinha -yRaqueteOponente - (raqueteComprimento / 2) - 30;
yRaqueteOponente += velocidadeYOponente;
}
A função 'calculaChanceDeErrar()' verifica se os pontosDoOponente são maiores ou iguais aos meusPontos, se forem, ele atribui à variável chanceDeErrar, o valor que ela contiver no momento (chanceDeErrar = chanceDeErrar) e soma a este valor mais 1. Como a função 'draw()' é um loop, vai ser somado 1 à variável chanceDeErrar até que ela seja maior ou igual a 39, quando isso acontecer, será atribuído à variável chanceDeErrar o valor 40 . Este valor permanecerá atribuído à variável chanceDeErrar, até que pontosDoOponente volte a ser maior ou igual a meus pontos, o que quer dizer o mesmo que, quando meusPontos for maior que pontosDoOponente. O else entra em ação, e começa a subtrair 1 da variável chanceDeErrar até que esta tenha o valor menor ou igual a 35, quando será atribuído a ela o valor 35;
function calculaChanceDeErrar() {
if (pontosDoOponente >= meusPontos) {
chanceDeErrar += 1;
if (chanceDeErrar >= 39){
chanceDeErrar = 40;
}
} else {
chanceDeErrar -= 1;
if (chanceDeErrar <= 35){
chanceDeErrar = 35;
}
}
}
Ou seja, a função calculaChanceDeErrar(), deve fazer com que o valor da variável chanceDeErrar, mude de acordo com a diferença de pontos entre os jogadores. Ela é chamada dentro da função movimentaRaqueteOponente(), e deveria fornecer valor suficiente à variável chanceDeErrar, de modo que, quando chanceDeErrar fosse somada na equação que determina a variação do eixo y da raquete, fizesse com que ele, (o eixo y da raquete) se deslocasse para um ponto abaixo do eixo y da bolinha. Lembra que yRaqueteOponente corresponde a parte de cima da raquete, então, a bolinha deveria acertar logo acima da borda superior da raquete. E deverá permanecer assim até que meusPontos seja maior que pontosDoOponente. Quando começam a ser subtraídos valores de chanceDeErrar, trazendo o ponto de contato da bolinha para o centro da raquete novamente.
function movimentaRaqueteOponente(){
velocidadeYOponente = yBolinha -yRaqueteOponente - raqueteComprimento / 2 - 30;
yRaqueteOponente += velocidadeYOponente + chanceDeErrar/*<====*/
calculaChanceDeErrar();
}
O problema é que o valor atribuído a chanceDeErrar não é suficiente.
Eu verifiquei que o efeito é possível, quando é passando o valor da altura da raquete + 10;
Tente o seguinte código:
function calculaChanceDeErrar() {
if (pontosDoOponente > meusPontos) {
chanceDeErrar += 1;
if (chanceDeErrar >= raqueteComprimento){
chanceDeErrar = raqueteComprimento + 10;
}
} else {
chanceDeErrar -= 1;
if (chanceDeErrar <= 35){
chanceDeErrar = 35;
}
}
}
function movimentaRaqueteOponente(){
velocidadeYOponente = (yBolinha -yRaqueteOponente - raqueteComprimento / 2) - 30;
yRaqueteOponente += velocidadeYOponente + chanceDeErrar;
calculaChanceDeErrar();
}
Lembrando que para meu yRaqueteOponente estou usando 90;
let yRaqueteOponente = 90;
É uma solução muito mais ou menos, mas quebrou o galho e permitiu um ponto contra o oponente. Ufa... Desculpe... Mas, avisei que ia ser longo.
Espero ter ajudado, meu código se quiser dar uma olhada.