3
respostas

Dúvida Marcação Ponto Oponente

Finalizei o projeto e até seguir uma dica do Wesley Bissoni Peres https://cursos.alura.com.br/forum/topico-sugestao-para-conseguir-fazer-pontos-91438#771357/?e=guilherme.lima@alura.com.br, para conseguir marcar pontos. Mas não acho que está muito usual, pois caso eu sempre consiga rebater a bolinha, a raquete do oponente também não erra, a solução do Wesley apenas corrige quando estou atrás do placar.

Como podemos melhorar essa usabilidade?

Código do meu jogo

//variaves da bolinha
let xBolinha = 300;
let yBolinha = 200;
let diametrobola = 20;
let raio = diametrobola/2;

//varaiveis velocidade
let velocidadeXdabola = 6;
let velocidadeYdabola = 6;

//variaveis da Raquete
let xRaquete = 5;
let yRaquete = 150;
let comprimentoRaquete = 10;
let alturaRaquete = 90;
let colidiu = false;

//variaveis Raquete do Oponente
let xRaqueteOponente = 585;
let yRaqueteOponente = 150;
let velocidadeYOponente;
let chanceDeErrar = 0;

//placar do jogo
let meusPontos = 0;
let pontosDoOponente = 0;
let dOponenteBolinha =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();
  velocidadeBolinha();
  verificaColisao();
  mostraRaquete(xRaquete, yRaquete);
  movimentaRaquete();
  //verificaColisaoRaquete();
  verificaColisaoRaquete(xRaquete, yRaquete);
  mostraRaquete(xRaqueteOponente, yRaqueteOponente);
  movimentaRaqueteOponente();
  verificaColisaoRaquete(xRaqueteOponente, yRaqueteOponente);
  incluirPlacar();
  marcaPonto();
  naoTravaBolinha();
  }

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

function velocidadeBolinha() {
  xBolinha += velocidadeXdabola;
  yBolinha += velocidadeYdabola;
}

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

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

}

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

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

function verificaColisaoRaquete(){
  if (xBolinha - raio < xRaquete + comprimentoRaquete 
  && yBolinha - raio < yRaquete + alturaRaquete 
  && yBolinha + raio > yRaquete){
    velocidadeXdabola *= -1;
  }
}

function naoTravaBolinha(){
  if (xBolinha - raio < 0){
    xBolinha = 23;
  }
}

function  verificaColisaoRaquete(x, y){
  colidiu = collideRectCircle(x, y, comprimentoRaquete, alturaRaquete, xBolinha, yBolinha, raio);
  if (colidiu){
    velocidadeXdabola *= -1
    raquetada.play();
  } 
}

function movimentaRaqueteOponente() {
velocidadeYOponente = yBolinha - yRaqueteOponente - comprimentoRaquete / 2 - dOponenteBolinha;
  yRaqueteOponente += velocidadeYOponente 
  if(pontosDoOponente > meusPontos)
  {
    dOponenteBolinha = 100;
  }
  if(pontosDoOponente < meusPontos && dOponenteBolinha > 50)
  {
    dOponenteBolinha -= 3;
  }
}


function incluirPlacar() {
  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();
  }
}
3 respostas

Olá Iuri, tudo bem?

Caso queira uma forma diferente, deixo o seguinte tópico para lhe auxiliar:

  • Outra forma, de aleatoriedade
    • Na última resposta do tópico a instrutora da maiores passos a respeito da implementação desejada pelo aluno que pode ser bem semelhante a sua.

Espero ter ajudado, qualquer dúvida, me coloco à disposição! Bons estudos!

Sucesso

Um grande abraço e até mais!

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

Obrigado Victor, a jogabilidade do jogou ficou melhor. O ponto de melhoria é que a Raquete do oponente defende uma e erra outra, sempre ordem e frequência, tentei aumentar o intervalo da função Math.random, tamanho da bola e velocidade da bola para tentar alterar esta frequência, mas não surtiu efeito.

//variaves da bolinha let xBolinha = 300; let yBolinha = 200; let raio = 8; let diametrobola = raio*2;

//varaiveis velocidade let velocidadeXdabola = 6; let velocidadeYdabola = 6;

//variaveis da Raquete let xRaquete = 5; let yRaquete = 150; let comprimentoRaquete = 10; let alturaRaquete = 90; let colidiu = false;

//variaveis Raquete do Oponente let xRaqueteOponente = 585; let yRaqueteOponente = 150; let velocidadeYOponente; let chanceDeErrar = 0;

//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(); velocidadeBolinha(); verificaColisao(); mostraRaquete(xRaquete, yRaquete); movimentaRaquete(); //verificaColisaoRaquete(); verificaColisaoRaquete(xRaquete, yRaquete); mostraRaquete(xRaqueteOponente, yRaqueteOponente); movimentaRaqueteOponente(); verificaColisaoRaquete(xRaqueteOponente, yRaqueteOponente); incluirPlacar(); marcaPonto(); naoTravaBolinha(); }

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

function velocidadeBolinha() { xBolinha += velocidadeXdabola; yBolinha += velocidadeYdabola; }

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

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

}

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

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

function verificaColisaoRaquete(){ if (xBolinha - raio < xRaquete + comprimentoRaquete && yBolinha - raio < yRaquete + alturaRaquete && yBolinha + raio > yRaquete){ velocidadeXdabola *= -1; } }

function naoTravaBolinha(){ if (xBolinha - raio < 0){ xBolinha = 23; } }

function verificaColisaoRaquete(x, y){ colidiu = collideRectCircle(x, y, comprimentoRaquete, alturaRaquete, xBolinha, yBolinha, raio); if (colidiu){ velocidadeXdabola *= -1 raquetada.play(); } }

function movimentaRaqueteOponente() { velocidadeYOponente = (yBolinha - yRaqueteOponente - alturaRaquete) / 2; yRaqueteOponente += velocidadeYOponente/ (Math.floor(Math.random() * 2) +1); }

function incluirPlacar() { 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(); } }

Opa Iuri, belezinha?

Peço desculpas pela demora em obter um retorno

Para randomizar o movimento da raquete do oponente no jogo Pong, você pode ajustar a função movimentaRaqueteOponente() para incluir um valor aleatório na velocidade vertical da raquete. Aqui está o código atualizado para fazer isso:

function movimentaRaqueteOponente() {
  let chanceDeErrar = Math.floor(Math.random() * 100);
  if (chanceDeErrar < 30) {
    velocidadeYOponente = (yBolinha - yRaqueteOponente - alturaRaquete) /20; //fica 20 vezes mais lento
  } else {
    velocidadeYOponente = (yBolinha - yRaqueteOponente - alturaRaquete) / 2;
  }
  yRaqueteOponente += velocidadeYOponente;
}

Deste modo Iuri, quando a chance de errar for menor que 30 o que pode acontecer em 30% por cento dos casos, a raquete fica mais lenta podendo não alcançar a bolinha e você acabar marcando o ponto.

Para visualizar em 100 por cento dos casos basta colocar dentro do if(chanceDeErrar < 100), ao colocar 100 sempre será possível verificar a raquete se comportando de forma mais lenta, e você pode dividir dentro desse mesmo if, ao invés de /20 pode colocar um número maior ou menor.

Espero ter ajudado, qualquer dúvida, me coloco à disposição! Bons estudos!

Sucesso

Um grande abraço e até mais!

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