olá, eu tive o mesmo problema que você, e o motivo do oponente não esta errando é por que está faltando a porcentagem de erro na função moveOpponentPaddle(),
função com erro:
function moveOpponentPaddle(){
speedYOpponent = yBall - yPadOpponent - sizePaddle / 2 - 30;
yPadOpponent += speedYOpponent;
}
função correta:
function moveOpponentPaddle(){
speedYOpponent = 0.8 * yBall - yPadOpponent - sizePaddle / 2 - 30;
yPadOpponent += speedYOpponent;
}
Quanto maior a porcentagem for mais difícil fica do oponente erra e quanto menor mais o oponente erra.
O problema da bolinha presa atrás da raquete eu ainda não consegui encontrar uma solução resolva cem por cento do bug no meu jogo, mas tem algumas soluções aqui no fórum que podem resolver esse bug no seu jogo.