1
resposta

[Dúvida] oponente nunca falha

meu oponente nunca erra mesmo eu colocando a linha para aumentar a chance de erro do oponente, segue o codigo https://editor.p5js.org/hgokuh/sketches/Wk4ZKjgna

1 resposta

Oi, Humberto! Tudo certo por aí?

Desde já, agradeço a paciência em aguardar uma resposta!

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:

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!

Grande abraço, Humberto!

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