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

[Dúvida] NPC não erra nunca, impossível o PLAYER marcar pontos.

Contador de pontos funciona perfeitamente. Consegui inclui inclusive função para reportar quem ganhou ou perdeu, com placar expresso na tela. Entretanto, já tentei de várias formar alterar o código abaixo para que o NPC erre as vezes, mas sem sucesso, ou ele apenas erra ou apenas acerta.

function movimentaRaqueteOpo (){
  velocidadeYOpo = yBolinha - yRaqueteOpo - raqueteComp/2 - 75;
  yRaqueteOpo += velocidadeYOpo;
  yRaqueteOpo = constrain(yRaqueteOpo, 5, 325);
}

Alguém consegui me dar alguma dica? Obrigado

2 respostas
solução!

Olá, Dúlio

Entendo que você está querendo fazer o NPC errar algumas vezes para tornar o jogo mais interessante. Acredito que uma maneira de fazer isso seria introduzir algum tipo de aleatoriedade no movimento da raquete do NPC.

Atualmente, a raquete do NPC sempre se move diretamente para a posição da bola, o que a torna perfeitamente precisa. Para introduzir algum erro, você poderia adicionar um pequeno valor aleatório à posição alvo da raquete.

Por exemplo, você poderia modificar a linha velocidadeYOpo = yBolinha - yRaqueteOpo - raqueteComp/2 - 75; para algo como velocidadeYOpo = yBolinha - yRaqueteOpo - raqueteComp/2 - 75 + random(-10, 10);.

A função random(-10, 10) irá gerar um número aleatório entre -10 e 10, o que irá efetivamente adicionar um pequeno "desvio" ao movimento da raquete do NPC. Você pode ajustar os números para tornar o NPC mais ou menos preciso conforme desejado.

Lembre-se que essa é apenas uma sugestão e pode ser que você precise fazer mais ajustes para obter o comportamento desejado. A ideia principal aqui é introduzir algum tipo de aleatoriedade para que o NPC não seja perfeitamente preciso o tempo todo.

Espero ter ajudado e bons estudos!

Olá, Dúlio, tudo bem?

Desculpe pela demora em obter um retorno.

Nessa situação onde o oponente nunca erra, podemos criar uma função que calcule a chance de errar e chamá-la dentro da função responsável pelo movimento movimentaRaqueteOponente. Para isso criaremos uma variável let chanceDeErrar = 0; essa variável será atribuída ao YRaqueteOponente.

O código fica assim:

let chanceDeErrar = 0;

function movimentaRaqueteOpo (){
  velocidadeYOpo = yBolinha - yRaqueteOpo - raqueteComp/2 - 75;
  yRaqueteOpo += velocidadeYOpo;
  yRaqueteOpo = constrain(yRaqueteOpo, 5, 325);
  calculaChanceDeErrar()
}

A função calculaChanceDeErrar ela verifica se os pontos do oponente são iguais ou maiores que meus pontos.

function calculaChanceDeErrar() {
  if (pontosDoOponente >= meusPontos) {
    chanceDeErrar += 1
    if (chanceDeErrar >= 39){
    chanceDeErrar = 40
    }
  } else {
    chanceDeErrar -= 1
    if (chanceDeErrar <= 35){
    chanceDeErrar = 35
    }
  }
}

No entanto, faço uma ressalva que caso tenha utilizado tamanhos diferentes para as variáveis da raquete e da bolinha, é possível ser necessário fazer alteração no valor da variável chance de errar, após o if, por exemplo, aumentar de 39 para 80, será necessário fazer alguns testes para identificar a qual valor se adequa ao seu código.

Essa é uma das possibilidades, abaixo deixo outras possíveis sugestões de melhorias de código:

Caso o problema persista, você pode ainda compartilhar o link do seu projeto, assim, posso te ajudar mais assertivamente.

Espero ter ajudado.

Abraços e bons estudos!

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

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