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

Oponente não erra

Boa tarde! Mesmo com as atualizações dos códigos e criação da funcão chanceDeErrar(), o opononente continua não errando. Tentei também no movimentaRaqueteOponente() fazer alteração de valor mas não resolveu.

velocidadeYOponente = yBolinha -yRaqueteOponente - raqueteComprimento / 2 - 30; (Aqui tente substituir o 30 por 50, 80, mas sem resultados); yRaqueteOponente += velocidadeYOponente + chanceDeErrar; calculaChanceDeErrar();

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

//velocidade da bolinha let velocidadeXBolinha = 6; let velocidadeYBolinha = 6; let raqueteComprimento = 10; let raqueteAltura = 90;

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

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

let colidiu = false;

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

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

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); mostraBolinha(); movimentaBolinha(); verificaColisaoBorda(); mostraRaquete(xRaquete, yRaquete); movimentaMinhaRaquete(); //verificaColisaoRaquete(); verificaColisaoRaquetes(xRaquete, yRaquete); mostraRaquete(xRaqueteOponente, yRaqueteOponente); movimentaRaqueteOponente(); verificaColisaoRaquetes(xRaqueteOponente, yRaqueteOponente); incluiPlacar(); marcaPonto();

}

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, raqueteComprimento, raqueteAltura); }

function movimentaMinhaRaquete(){ if(keyIsDown(UP_ARROW)){ yRaquete -= 10; } if(keyIsDown(DOWN_ARROW)){ yRaquete += 10; } }

function verificaColisaoRaquete(){ if(xBolinha - raio < xRaquete + raqueteComprimento && yBolinha - raio < yRaquete + raqueteAltura && yBolinha + raio > yRaquete){ velocidadeXBolinha *= -1 } }

function verificaColisaoRaquetes(x, y){ colidiu = collideRectCircle(x, y, raqueteComprimento, raqueteAltura, xBolinha, yBolinha, raio); if(colidiu){ velocidadeXBolinha *= -1 raquetada.play(); } }

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

function incluiPlacar(){ stroke(255); textAlign(CENTER); textSize(18); textStyle(BOLD); 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(pontosDoOponente, 470, 26); }

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

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

2 respostas

Olá Pedro, para facilitar a visualização dos códigos, recomendo que use a opção de inserir bloco de código.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Você também pode estár inserindo o link do seu repositório, assim fica mais fácil testar.

solução!

Olá, Pedro! Tudo bem com você?

A sugestão do Rafael é excelente, essa prática de usar o bloco de código ajuda muito e diminui o tempo de análise do seu código.

Copiei seu código, formatei no meu p5 e fiz pequenos ajustes. Vou enviar o código abaixo e deixei em comentário algumas das modificações.


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

//velocidade da bolinha 
let velocidadeXBolinha = 6; 
let velocidadeYBolinha = 6; 
let raqueteComprimento = 10; 
let raqueteAltura = 90;

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

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

let colidiu = false;

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

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

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); 
  mostraBolinha(); 
  movimentaBolinha(); 
  verificaColisaoBorda(); 
  mostraRaquete(xRaquete, yRaquete); 
  movimentaMinhaRaquete(); 
  //verificaColisaoRaquete(); 
  verificaColisaoRaquetes(xRaquete, yRaquete); 
  mostraRaquete(xRaqueteOponente, yRaqueteOponente); 
  movimentaRaqueteOponente(); 
  verificaColisaoRaquetes(xRaqueteOponente, yRaqueteOponente); 
  incluiPlacar(); 
  marcaPonto();

}

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, raqueteComprimento, raqueteAltura); 
}

function movimentaMinhaRaquete(){ 
  if(keyIsDown(UP_ARROW)){ 
    yRaquete -= 10; } 
  if(keyIsDown(DOWN_ARROW)){ 
    yRaquete += 10; } 
}

function verificaColisaoRaquete(){ 
  if(xBolinha - raio < xRaquete + raqueteComprimento 
     && yBolinha - raio < yRaquete + raqueteAltura 
     && yBolinha + raio > yRaquete){ 
    velocidadeXBolinha *= -1 } 
}

function verificaColisaoRaquetes(x, y){ 
  colidiu = collideRectCircle(x, y, raqueteComprimento, raqueteAltura, xBolinha, yBolinha, raio); 
  if(colidiu){ 
    velocidadeXBolinha *= -1;
    raquetada.play(); 
  } 
}

function movimentaRaqueteOponente(){ 
  velocidadeYOponente = yBolinha - yRaqueteOponente - raqueteComprimento / 2 - 35; //aqui troquei por 35
  yRaqueteOponente += velocidadeYOponente + chanceDeErrar; 
  calculaChanceDeErrar(); 
}

function incluiPlacar(){ 
  stroke(255); 
  textAlign(CENTER); 
  textSize(18); 
  textStyle(BOLD); 
  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(pontosDoOponente, 470, 26); 
}

function marcaPonto(){ 
  if (xBolinha > 590) 
  { 
    meusPontos ++; 
    ponto.play(); 
  } if (xBolinha < 8) //troquei de 10 por menos 8
  { 
    pontosDoOponente +=1; 
    ponto.play(); 
  } 
}

function calculaChanceDeErrar() 
{
  if (pontosDoOponente >= meusPontos) { 
    chanceDeErrar ++ 

  if (chanceDeErrar >= 39){ 
    chanceDeErrar = 100 //troquei de 49 por 100 
    } //faltou } aqui para fechar o escopo no lugar correto

  }else { 
    chanceDeErrar -= 1 
       if (chanceDeErrar <= 35){ 
         chanceDeErrar = 35 
       } 
  } 

}

Em seu código eu apenas modifiquei alguns valores para aumentar a sensibilidade e pude observar que na função calculaChanceDeErrar() estava faltando inserir uma "}" chave para fechar o escopo da ação no lugar correto. É possível que isso tenha impulsionado o conflito. Testei no meu p5 e funcionou normalmente, você pode testar no seu também e verificar se está tudo ok :)

Se possuir alguma dúvida sobre escopo de funções em JavaScript (linguagem utilizada neste curso), você pode conferir aqui neste tópico que esclareço um pouco sobre o assunto : https://cursos.alura.com.br/forum/topico-movimento-da-raquete-ta-dando-erro-163023

Espero que tenha ajudado!

Um abraço e bons estudos!