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

Não entendi essa lógica. Vi algumas respostas aqui no fórum. Mas nenhuma convincente... Alguém pode me explicar graficamente!?

    function movimentaRaqueteOponente(){
  velocidadeYOponente = yBolinha -yRaqueteOponente - raqueteComprimento / 2 - 30;
  yRaqueteOponente += velocidadeYOponente + chanceDeErrar
  calculaChanceDeErrar()
}


function calculaChanceDeErrar() {
  if (pontosDoOponente >= meusPontos) {
    chanceDeErrar += 1
    if (chanceDeErrar >= 39){
    chanceDeErrar = 40
    }
  } else {
    chanceDeErrar -= 1
    if (chanceDeErrar <= 35){
    chanceDeErrar = 35
    }
  }
}
2 respostas
solução!

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.

Obrigado!! Você conseguiu tirar minha dúvida!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software