1
resposta

[Dúvida] Não está possibilitando o erro da raquete do oponente

Bom dia, galera.

Nesse task, fui colocar uma parte do código aqui e não deu certo. Fui tentar noutros dois links nesse task e nada.

Me ajudem, por favor.

https://cursos.alura.com.br/course/pong-javascript/task/63122

// variáveis da bolinha
let xBolinha = 300;
let yBolinha = 200;
let diametro = 15;
let raio = diametro / 2;

// variáveis do comprimento e altura das raquetes
let widthRaquete = 10;
let heightRaquete = 90;

// variáveis da raquete
let xRaquete = 5;
let yRaquete = 150;

// variáveis do oponente
let xRaqueteOponente = 585;
let yRaqueteOponente = 150;

// variáveis da velocidade da bolinha
let velocidadeXBolinha = 6;
let velocidadeYBolinha = 6;

// variáveis da movimentação de raquete
let velocidadeRaquete = 10;

// variáveis da movimentação de raquete do oponente
let velocidadeYOponente;

// variável da colisão
let colidiu = false;

// placar do jogo
let meusPontos = 0;
let pontosOponente = 0;

// sons do jogo
let raquetada;
let ponto;
let trilha;

// criando a variável para possibilitar o erro da raquete do oponente
let chanceDeErrar = 0;


function preload() {
  trilha = loadSound("trilha.mp3");
  ponto = loadSound("ponto.mp3");
  raquetada = loadSound("raquetada.mp3");
}

function setup() {
  createCanvas(600, 400);
  trilha.loop();
}

function draw() {
  background(0); // 1- Desenha o background
  mostraBolinha(); // 2 - Desenha a bolinha
  movimentaBolinha(); // 3 - Movimenta a bolinha
  verificaColisaoBorda(); // 4 - Verifica a colisão da bolinha
  mostraRaquete(xRaquete, yRaquete); // 5- Desenha a raquete
  mostraRaquete(xRaqueteOponente, yRaqueteOponente); // 6 - Desenha a raquete do oponente
  movimentaRaquete(); // 7 - Movimenta a raquete
  movimentaRaqueteOponente(); // 8 - Movimenta a raquete do oponente
  verificaColisaoRaquete(xRaquete, yRaquete); // 9 - Verifica a colisão da raquete
  verificaColisaoRaquete(xRaqueteOponente, yRaqueteOponente); // 10 - Verifica a colisão da raquete do oponente
  incluiPlacar(); // 11 - Mostra o placar
  marcaPonto(); // 12 - Marca os pontos de ambos os lados
}

function mostraBolinha() {
  circle(xBolinha, yBolinha, diametro);
}

function movimentaBolinha() {
  xBolinha += velocidadeXBolinha;
  yBolinha += velocidadeYBolinha;
}

function verificaColisaoBorda() {
  if (xBolinha + raio > width || xBolinha - raio < 0) {
    velocidadeXBolinha *= -1;
  }

  if (yBolinha + raio > height || yBolinha - raio < 0) {
    velocidadeYBolinha *= -1;
  }
}

function mostraRaquete(x, y) {
  rect(x, y, widthRaquete, heightRaquete);
}

function movimentaRaquete() {
  if (keyIsDown(UP_ARROW)) {
    yRaquete -= velocidadeRaquete;
  }
  if (keyIsDown(DOWN_ARROW)) {
    yRaquete += velocidadeRaquete;
  }

  // Limitando a movimentação da raquete para não ultrapassar as bordas
  yRaquete = constrain(yRaquete, 1, 310);
}

function movimentaRaqueteOponente()
{
  velocidadeYOponente = yBolinha - yRaqueteOponente - widthRaquete / 2 - 30;
  yRaqueteOponente += velocidadeYOponente;

  // Limitando a movimentação da raquete para não ultrapassar as bordas
  yRaqueteOponente = constrain(yRaqueteOponente, 1, 310);
  
  // Atribuindo a função que possa forçar o erro da movimentação do oponente
  calculaChanceDeErrar();
}

function verificaColisaoRaquete() {
  // variáveis após a refatoração
  let esquerdaBolinha = xBolinha - raio;
  let superiorBolinha = yBolinha - raio;
  let inferiorBolinha = yBolinha + raio;

  let direitaRaquete = xRaquete + widthRaquete;
  let superiorRaquete = yRaquete;
  let inferiorRaquete = yRaquete + heightRaquete;

  if (
    esquerdaBolinha < direitaRaquete &&
    superiorBolinha < inferiorRaquete &&
    inferiorBolinha > superiorRaquete
  ) {
    velocidadeXBolinha *= -1;
    raquetada.play();
  }
}

function verificaColisaoRaquete(x, y) {
  colidiu = collideRectCircle(
    x,
    y,
    widthRaquete,
    heightRaquete,
    xBolinha,
    yBolinha,
    raio
  );
  if (colidiu) {
    velocidadeXBolinha *= -1;
    raquetada.play();
  }
}

function incluiPlacar() {
  stroke(255);
  textAlign(CENTER);
  textSize(16);

  fill(color(255, 140, 0));
  rect(150, 10, 40, 20);
  fill(255);
  text(meusPontos, 170, 26);

  fill(color(255, 140, 0));
  rect(450, 10, 40, 20);
  fill(255);
  text(pontosOponente, 470, 26);
}

function marcaPonto() {
  if (xBolinha > 590) {
    meusPontos += 1;
    ponto.play();
  }
  if (xBolinha < 10) {
    pontosOponente += 1;
    ponto.play();
  }
}

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

Oii, Estudante! Tudo joia?

Agradeço por disponibilizar o seu código, por ele podemos revisar e identificar alguns pontos de melhoria.

A condição aplicada na função calculaChanceDeErrar é if (pontosOponente >= meusPontos). Como o objetivo é aumentar a chance de erro do oponente precisamos inverter sua posição como, por exemplo:

if (meusPontos >= pontosOponente)

Outro ponto de melhoria, no código há uma variável chanceDeErrar, mas ela não está sendo utilizada para alterar o comportamento do oponente. Então podemos utilizá-la para decidir se o oponente vai se mover ou não. Para exemplificar, você pode gerar um número aleatório e, se esse número for menor que a chanceDeErrar, o oponente não se move. Segue um exemplo:

function movimentaRaqueteOponente()
{
  if (random(100) >= chanceDeErrar) {
    velocidadeYOponente = yBolinha - yRaqueteOponente - widthRaquete / 2 - 30;
    yRaqueteOponente += velocidadeYOponente;
  }

  // Limitando a movimentação da raquete para não ultrapassar as bordas
  yRaqueteOponente = constrain(yRaqueteOponente, 1, 310);
  
  // Atribuindo a função que possa forçar o erro da movimentação do oponente
  calculaChanceDeErrar();
}

O exemplo acima, o método random(100) gera um número aleatório entre 0 e 100. Se esse número for maior ou igual à chanceDeErrar, o oponente se move normalmente. Se for menor, o oponente não se move, simulando um erro.

Espero ter que a sugestão te ajude. Não esqueça de adaptar os exemplos de acordo com o seu projeto e realizar os testes para observar se o comportamento esperado está acontecendo.

Bons estudos e até mais!