2
respostas

Nao consigo fazer o oponente ter chance de errar

Tentei a solução sugerida do curso e algumas outras do fórum e não funcionou. Alguém tem alguma sugestão?

2 respostas

Oi Letícia, tudo bem?

Entendi sua dúvida. Pensando em uma solução para o problema do “oponente nunca erra”, organizei uma nova lógica bem interessante. Antes de analisá-la, precisaremos alterar algumas coisas em seu código, beleza?

  • Comentando trechos de código: Para a ideia que irei propor, precisaremos comentar ou remover todos os trechos de código referentes à variável chancedeerrar, bem como à função calculachanceerrar().

Depois disso, podemos partir para o ponto principal!

Para o problema em questão, desenvolvi o trecho de código abaixo:

let direcaoRaqueteOponente = 1;

function movimentaoponente(){
  const mediaYBolinha = yBolinha + raio;
  const mediaYRaqueteOponente = yraqueteoponente + (raquetealtura/2);

  if (mediaYBolinha > mediaYRaqueteOponente) {
    direcaoRaqueteOponente = 1;
  } else {
    direcaoRaqueteOponente = -1;
  }
  yraqueteoponente += 5 * random(0.6, 0.95) * direcaoRaqueteOponente;
}

Vamos analisar o que foi feito em etapas?

Alterações fora da função movimentaoponente()
  • Foi criada a variável direcaoRaqueteOponente. Ela determinará se a raquete do oponente será movimentada para baixo ou para cima.
Dentro de movimentaoponente()
  • Foi criada a variável mediaYBolinha, que armazenará a localização média da bolinha na tela;
  • Foi criada a variável mediaYRaqueteOponente, que armazenará a localização média da raquete do oponente na tela;
  • Caso mediaYBolinha seja superior a mediaYRaqueteOponente, significa dizer que a bolinha está abaixo da raquete do oponente verticalmente. Por esse motivo, direcaoRaqueteOponente continua sendo positivo, a fim de aumentar o valor de yraqueteoponente (fazer a raquete descer). Caso isso não seja verdade, direcaoRaqueteOponente será igual a -1, fazendo com que a raquete adversária vá para cima;
  • Por fim, realizou-se uma atribuição com soma:
 yraqueteoponente += 5 * random(0.6, 0.95) * direcaoRaqueteOponente;
  • O valor 5 foi apenas um número que trouxe um bom resultado à operação;
  • random(0.6, 0.95) gerará um valor aleatório entre o intervalo de 0.6 e 0.95;
  • direcaoRaqueteOponente determinará se a raquete irá para cima ou para baixo, como vimos anteriormente.

Com isso, a raquete do oponente passa a funcionar normalmente, ora acertando, ora errando! Muita bacana, não acha?


Para deixar seu jogo ainda mais legal, adicionei uma função que altera a posição horizontal da bolinha caso ela esteja muito próxima da borda e da raquete ao mesmo tempo, evitando o problema de ficar presa. Veja só como ficou:


function bolinhaNaoFicaPresa() {
    if (xBolinha - raio <= 0){
      xBolinha = 35;
    } else {
      if (xBolinha - raio >= 588){
        xBolinha = width - 35;
      }
    }
}

Lembre-se de chamá-la dentro de `draw()`, da seguinte maneira:

```jsx
function draw() {
 // ... restante do código
  bolinhaNaoFicaPresa();
}

Espero que tenha compreendido minha explicação! Caso surjam dúvidas ao decorrer dos seus estudos, lembre-se que você pode contar com o fórum. Fico à disposição para te ajudar da melhor maneira possível!

Caso mesmo com as dicas acima você não consiga corrigir esse problema, sugiro que você compartilhe o link do seu código para que eu possa te ajudar da melhor maneira possível.

Espero que dê tudo certo. Caso tenha outras dúvidas, estarei a disposição.

Grande abraço e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado! ✓.

me ajudou bastante. muito obrigada, Rodrigo Anita :)