2
respostas

[Dúvida] Já testei várias sugestões, mas ainda não consigo marcar ponto

Boa tarde!

Essa é minha primeira experiência com programação NA VIDA. Peço a ajuda de vocês.

Já testei várias sugestões dadas aqui no fórum, mas ainda não consigo marcar ponto. Desde já, agradeço a ajuda de vocês. Muito obrigado!

Segue o meu código:

// 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;

//variáveis da raquete
let xRaquete = 5;
let yRaquete = 150;
let raqueteComprimento = 10;
let raqueteAltura = 90;

let colidiu = false;

//variáveis do oponente
let xRaqueteOponente = 585;
let yRaqueteOponente = 150;
let raqueteOponenteLargura = 10;
let raqueteOponenteAltura = 90;
let velocidadeYOponente;

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

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

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

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;
    raquetada.play();
  }
}

function verificaColisaoRaquete(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(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(pontosDoOponente, 470, 26);
}

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

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

  if (chanceDeErrar <= 35){
    chanceDeErrar = 35}
}
2 respostas

Opa Sergio, tudo bem?

Não se preocupe, esse problema não é um bicho de sete cabeças!

Primeiramente criaremos uma variável, a direcaoRaqueteOponente. Ela determinará se a raquete do oponente será movimentada para baixo ou para cima:

let direcaoRaqueteOponente = 1;

Modificamos a função de movimento da raquete do oponente, onde criamos 2 novas variáveis, mediaYBolinhaque armazenará a localização média da bolinha na tela e mediaYRaqueteOponente, que armazenará a localização média da raquete do oponente na tela:


function movimentaRaqueteOponente(){
  const mediaYBolinha = yBolinha + raio;
  const mediaYRaqueteOponente = yRaqueteOponente + (raqueteAltura/2);

}

Criaremos uma condição com o if, caso mediaYBolinha seja superior a mediaYRaqueteOponente, ou seja, se a bolinha está abaixo da raquete do oponente verticalmente, a direcaoRaqueteOponente continua sendo positiva 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:

function movimentaRaqueteOponente(){
  const mediaYBolinha = yBolinha + raio;
  const mediaYRaqueteOponente = yRaqueteOponente + (raqueteAltura/2);

  if (mediaYBolinha > mediaYRaqueteOponente) {
    direcaoRaqueteOponente = 1;
  } else {
    direcaoRaqueteOponente = -1;
  }
}

Por fim, realizamos uma atribuição com soma onde:

  • Usamos ovalor 5 por trazer um bom resultado à operação;
  • Randomizamos um valor por meio derandom(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:
function movimentaRaqueteOponente(){
  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;
}

Você pode verificar o código funcionando no seguinte link:

Espero ter ajudado!

Fico à disposição, tenha um bom dia e bons estudos.

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

Bom dia, Gabriel! Tudo bem?

Desculpe a demora em responder, mas ontem não conseguiria dar a atenção merecida.

MUITO OBRIGADO pelo teu tempo, teu trabalho e tua ajuda!

Funcionou!

Agora, com a tua ajuda, surgiram outras questões. Como eu disse na pergunta: "Essa é minha primeira experiência com programação NA VIDA...". Portanto, sei que ainda tenho MUUUUUUUUUUUUUUUIIIIIITA coisa a aprender, mas como, nesse estágio, eu saberia:

1 - Que eu teria que criar variável 'direcaoRaqueteOponente'? 2 - Que eu teria que criar 2 novas variáveis: 'mediaYBolinhaque' e 'mediaYRaqueteOponente'? 3 - Que eu teria que usar 'const' (em nenhuma das aulas esse termo foi falado)? 4 - Que usar o valor 5 por trazer um bom resultado à operação? 5 - Que eu teria que "randomizar" (esse termo também não foi dito em nenhuma aula)? 6 - Que esse valor randomizado fica entre 0.6 e 0.95?

Já agradeço os esclarecimentos desde já. Muito obrigado.

Abs.