Olá, Luan!
Infelizmente, não consigo acessar links externos, como o código que você compartilhou. No entanto, posso te dar algumas dicas gerais que podem te ajudar a solucionar o problema.
Verifique se a lógica que calcula a chance do oponente errar está correta. Normalmente, isso é feito com um gerador de números aleatórios. Por exemplo, você pode ter uma linha de código que diz algo como "se Math.random() > 0.5, então o oponente erra". Se esse código não estiver funcionando como esperado, o oponente nunca errará.
Quanto ao bug da bolinha ficando presa na borda e/ou na raquete, isso pode ser causado por um problema com a detecção de colisão. Verifique se o código que lida com a colisão entre a bola e as bordas/raquetes está correto. Por exemplo, você pode precisar verificar se a posição da bola mais o seu raio é maior que a posição da borda/raquete, e se for, inverter a direção da bola.
Outra possibilidade é que a velocidade da bola seja muito alta, fazendo com que ela ultrapasse a borda/raquete antes que a colisão seja detectada. Nesse caso, você pode tentar diminuir a velocidade da bola ou aumentar a frequência com que a detecção de colisão é feita.
Espero que essas sugestões possam te ajudar a identificar e corrigir o problema. Lembre-se de testar cada alteração que você fizer para ver se resolve o problema. Espero ter ajudado e bons estudos!