3
respostas

Como possibilitar que o oponente ora erre, ora acerte sem ser previsível?

Eu entendo que código mostrado nas aulas tem o intuito de ensinar, e isso o professor fez muito bem. No entanto, o código faz com que o oponente ou nunca erre ou nunca acerte (dependendo de qual valor nós subtraimos na equação da movimentação da raquete do oponente).

Assim, como fazer com que o oponente aja de modo menos previsível? Não estou querendo nenhuma inteligência artificial não hahah, apenas um comportamento mais randômico. Dá para usar a função Random()? Eu até tentei, mas daí a raquete se teletransporta para cima e para baixo, sem ter uma movimentação fluida.

Tentei também fazer com que a velocidade da raquete do oponente fique em função de outros fatores além do Y da bolinha, e até consegui com que ele ora acerte, ora erre, mas ainda é previsível.

Há uma solução que permita que um novato como eu entenda? Ou é preciso usar ferramentas mais avançadas da programação? Tenha em mente que eu estou começando agora haha. Espero que alguém me ajude! Ia deixar o jogo bem mais interessante!

3 respostas

Fala ai Pedro, tudo bem? Bom, não sei como estão seus códigos, mas, eu gostaria de sugerir que você adicionasse uma velocidade na movimentação da raquete do oponente.

Algo mais ou menos assim:

const velocidade = Math.random()
const posicao += (posicao * velocidade)

A ideia é diminuir ou aumentar a velocidade da movimentação da raquete, onde:

  • Quanto mais rápido, mais inteligente será o oponente e mais dificil será o jogo.
  • Quando mais devagar, menos inteligente será o oponente e o jogo será mais fácil.

O caminho seria algo mais ou menos assim, só vai precisar adaptar para seus códigos.

Espero ter ajudado.

Ah, legal, não sabia que tinha isso! Mas estou em dúvida de onde colocar essa velocidade. Devo adicioná-la na variável da posição do oponente?

No meu caso, essa é a função do movimento do oponente:

function movimento_do_oponente(){
    nova_pos_y_oponente = y_bolinha - y_oponente - alt_raquete/2 - ((6.25 - y_bolinha/40)*15 + (2.5 - y_bolinha/100)*11);//toda a expressão ((6.25 - y_bolinha/40)*15 + (2.5 - y_bolinha/100)*11) tem o intuito de fazer com que o movimento do oponente permita que ele erre ou acerte dependendo de onde estará a bolinha. 
  y_oponente += nova_pos_y_oponente;
}

O código completo:

//variáveis da bolinha
let x_bolinha = 700;
let y_bolinha = 250;
let diametro = 20;
let raio = diametro / 2;

//velocidade da bolinha
let velocidade_x_bolinha = 7.2;
let velocidade_y_bolinha = -7.1;

//variáveis da raquete
let x_raquete = 5;
let y_raquete = 200;
let esp_raquete = 10;
let alt_raquete = 100;

//variáveis do oponente
let x_oponente = 785;
let y_oponente = 200;
let esp_oponente = 10;
let alt_oponente = 100;
let pos_y_oponente;



//placar
let meus_pontos = 0;
let pontos_oponente = 0;



function setup() {
  createCanvas(800, 500);
}

function draw() {
  background(0);
  linha_de_campo();
  mostra_bolinha();
  movimenta_bolinha();
  verifica_colisao_borda();
  mostra_raquete(x_raquete, y_raquete);
  movimento_da_raquete();
  verifica_colisao_com_raquete();
  mostra_raquete(x_oponente, y_oponente);
  movimento_do_oponente();
  //movimento_do_oponente_2();
  verifica_colisao_com_oponente();
  placar();
  marca_ponto();
}


function mostra_bolinha(){
  circle(x_bolinha, y_bolinha, diametro);
}


function movimenta_bolinha(){
  x_bolinha += velocidade_x_bolinha;
  y_bolinha += velocidade_y_bolinha;
}


function verifica_colisao_borda(){
  if (x_bolinha + raio > width || x_bolinha - raio < 0) {
    velocidade_x_bolinha *= -1; 
  }

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


function mostra_raquete(x,y){
    rect(x, y, esp_raquete, alt_raquete);
}


function linha_de_campo(){
  rect(400, 0, 1, 500); 
}



function movimento_da_raquete(){
  if (keyIsDown(UP_ARROW)){
    y_raquete -= 10;
  }
  if (keyIsDown(DOWN_ARROW)){
    y_raquete += 10;
  }
}


function movimento_do_oponente(){
    nova_pos_y_oponente = y_bolinha - y_oponente - alt_raquete/2 - ((6.25 - y_bolinha/40)*15 + (2.5 - y_bolinha/100)*11);//toda a expressão ((6.25 - y_bolinha/40)*15 + (2.5 - y_bolinha/100)*11) tem o intuito de fazer com que o movimento do oponente permita que ele erre ou acerte dependendo de onde estará a bolinha. 
  y_oponente += nova_pos_y_oponente;
}


function verifica_colisao_com_raquete(){
 if (x_bolinha - raio < x_raquete + esp_raquete && y_bolinha - raio < y_raquete + alt_raquete && y_bolinha + raio > y_raquete){
   velocidade_x_bolinha *= -1;
 } 
}


function verifica_colisao_com_oponente(){
  if (x_bolinha + raio > x_oponente && y_bolinha - raio < y_oponente + alt_oponente && y_bolinha + raio > y_oponente){
    velocidade_x_bolinha *= -1;
  }
}


function placar(){
  stroke(255);

  textAlign(CENTER);
  textSize(17);

  fill(0);
  rect(175, 14, 50, 20);

  fill(255);
  text(meus_pontos, 200, 30);

  fill(0);
  rect(575, 14, 50, 20);

  fill(255);
  text(pontos_oponente, 600, 30);
}


function marca_ponto(){
  if (x_bolinha + raio > 799){
  meus_pontos += 1;
  }
  if (x_bolinha - raio < 1){
  pontos_oponente += 1;
  }
}

Devo adicioná-la na variável da posição do oponente?

Sim, você deve utilizar ela na função que calcula a velocidade do oponente:

Espero ter ajudado.