3
respostas

[Dúvida] Não consigo pontuar. Já testei várias opções do Fórum.

Já testei o código fornecido pelo Instrutor e diversas outras opções do Fórum e não consigo fazer meu jogo funcionar adequadamente. Ou não consigo pontuar ou ele deixa eu pontuar sempre que perco um ponto, ficando sempre empatado. Por favor, vocês podem me ajudar a corrigir o código e resolver esse problema?

Segue abaixo meu código completo. As tentativas efetuadas podem ser observadas nas funcões 'movimentaRaqueteOponente' e 'movimentaRaqueteOponenteComputador'. Uma das funções mencionadas acima esta inibida porque estava testando a outra.

// variáveis da bolinha
let xBolinha = 300;
let yBolinha = 200;
let diametroBolinha = 22;
let raioBolinha = diametroBolinha/2;

// velocidade da bolinha
let velocidadeXBolinha = 4;
let velocidadeYBolinha = 4;

// variáveis da raquete
let xRaquete = 5;
let yRaquete = 150;
let larguraRaquete = 10;
let alturaRaquete = 90;

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

let colidiu = false;

// variáveis do placar
let meusPontos = 0;
let oponentePontos = 0;

// variáveis dos sons do jogo
let raquetada;
let ponto;
let trilhaSonora;

let direcaoRaqueteOponente = 1;

let chanceDeErrar = 0;

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

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

function draw() {
  background(0);
  mostraBolinha();
  movimentaBolinha();
  verificaColisaoBorda();
  mostraRaquete(xRaquete, yRaquete);
  mostraRaquete(xRaqueteOponente, yRaqueteOponente);
  movimentaMinhaRaquete();
  colisaoRaquete(xRaquete, yRaquete);
  colisaoRaquete(xRaqueteOponente, yRaqueteOponente);
  movimentaRaqueteOponente();
  //movimentaRaqueteOponenteComputador();
  //movimentaRaqueteOponenteOutroJogador();
  incluiPlacar();
  marcaPonto();
  bolinhaNaoFicaPresa();
}

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

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

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

function mostraRaquete(x, y){
  rect(x, y, larguraRaquete, alturaRaquete);
}

function movimentaMinhaRaquete(){
  if (keyIsDown(UP_ARROW)){
    yRaquete -= 10;
  }
  if (keyIsDown(DOWN_ARROW)){
    yRaquete -= -10
  }
  yRaquete = constrain(yRaquete, 0, 510)
}

function colisaoRaquete(x, y){
  colidiu = 
collideRectCircle(x, y, larguraRaquete, alturaRaquete, xBolinha, yBolinha, raioBolinha);
  if (colidiu){
    velocidadeXBolinha *= -1;
    raquetada.play();
  }
}

function movimentaRaqueteOponente(){
  const mediaYBolinha = yBolinha + raioBolinha;
  const mediaYRaqueteOponente = yRaqueteOponente + (alturaRaquete/2);
  if (mediaYBolinha > mediaYRaqueteOponente) {
    direcaoRaqueteOponente = 1;
  } else {
    direcaoRaqueteOponente = -1;
  }
  yRaqueteOponente += 5 * random(0.6, 0.95) * direcaoRaqueteOponente;
}

function movimentaRaqueteOponenteComputador(){
  velocidadeYRaqueteOponente = (yBolinha - yRaqueteOponente - alturaRaquete / 2) - 30;
  yRaqueteOponente += velocidadeYRaqueteOponente + chanceDeErrar;
  calculaChanceDeErrar();
  yRaquete = constrain(yRaquete, 0, 510);
}

function movimentaRaqueteOponenteOutroJogador(){
  if (keyIsDown(87)){
    yRaqueteOponente -= 10;
  }
  if (keyIsDown(83)){
    yRaqueteOponente -= -10
  }
  yRaquete = constrain(yRaquete, 0, 510)
}

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(oponentePontos, 470, 26);
}

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

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

Obrigada!

3 respostas

Opa Alessandra, tudo certo?

Pelo que pude perceber o código desenvolvido para realizar o oponente errar apenas funciona se a velocidade da bolinha for 6. Ao realizar o teste mudando a velocidade da bolinha de 4 para 6 pude verificar o oponente errar sem um padrão específico. Uma sugestão nesse caso é realizar a alteração da velocidade e verificar se o problema em questão continua.

Espero ter ajudado, qualquer dúvida fico à disposição.

Tenha um bom dia e bons estudos.

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

Gabriel, obrigada pelo retorno. Esse é o meu primeiro contato com a programação, então ainda estou um pouco perdida. Conseguiria exemplificar isso no código, por favor? Não consegui achar onde deveria fazer a alteração. Obrigada!

Opa Alessandra.

Claro!

No começo do nosso código declaramos as variáveis "velocidadeXBolinha" e "velocidadeYBolinha", essas variáveis são utilizadas para armazenar o valor da velocidade da bolinha, facilitando a manutenção do código ao permitir modificar os valores:

let velocidadeXBolinha = 4;
let velocidadeYBolinha = 4;

Ao testar o código de referência, uma modificação que pude observar o comportamento desejado da raquete, evitando o empate, é alterar os valores da velocidade da bolinha, a tornando mais rápida, como 6, por exemplo:

let velocidadeXBolinha = 6;
let velocidadeYBolinha = 6;

Espero ter ajudado!

Desejo um bom dia e bons estudos.