Code casse brique ( ne parvient pas à casser les briques ) [Résolu]

Signaler
-
 Asta -
Bonjour, 
Je suis tout nouveau sur ce forum et j'aurai besoin de votre aide pour mon projet. En effet, je cherche, dans le cadre de mon enseignement ISN au lycée, à créer un casse brique. J'utilise Processing et le langage est donc Java. J'ai réussi à créer le palet, les briques, la balle qui se déplace mais impossible de casser les briques au contact de la balle. Auriez vous des suggestion ? 
Voici le code de mon jeu :
int deplacementX, deplacementY; 
int x, y; 
int w, z; 
int delay=100; 
void setup() 
{ 
  size(500, 500); 
  x = 250; 
  y = 470; 
  deplacementX = 4; 
  deplacementY = -5; 
  w = 0; 
  z = 475; 
  background(100, 100, 100);
} 
void draw() 
{ 
  fond(); 
  bouger(); 
  rebondir(); 
  dessiner();
} 
void fond() 
{   
  background(100, 100, 100);
} 
void dessiner() 
{ 
  for (int i=10; i<440; i=i+60) 
  { 
    for (int j=0; j<200; j=j+25) 
    {
      fill(200, 0, 0); 
      rect(i, j, 60, 25);
    }
  } 
  fill(0, 0, 0); 
  rect(w, z, 100, 25); 
  fill(255, 255, 255); 
  ellipse(x, y, 20, 20);
} 
void bouger() 
{ 
  x = x + deplacementX; 
  y = y + deplacementY; 
  w = (mouseX);
} 
void rebondir() 
{ 
  // si on est trop à droite et que le déplacement horizontal est positif 
  if (x > width-10 && deplacementX > 0) 
  { 
    deplacementX = -deplacementX; // inverser la valeur
  } 
  //si on est trop en haut et que le déplacement vertical est négatif 
  if (y < 10 && deplacementY <0) 
  { 
    deplacementY = abs(deplacementY); // inverser la valeur
  } 
  //si on est trop a gauche et que le déplacement horizontal est négatif 
  if (x < 10 && deplacementX <10) 
  { 
    deplacementX = abs(deplacementX); // inverser la valeur
  } 
  if (y>465 && x>w && x<w+100) 
  { 
    deplacementY = -deplacementY; // inverser la valeur
  } 
  if (y > 490) 
  { 
    noLoop(); 
    print("GAME OVER");
  }
}

Bonne journée et merci d'avance
A voir également:

10 réponses

Messages postés
16142
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
8 avril 2020
92
Bonjour,

Il faut dynamiser ta méthode dessiner() car pour l'instant elle fait toujours la même chose.

Il faudrait que tu stockes dans une variable l'ensemble des briques du départ puis à chaque tour ne dessiner que celle qui s'y trouve.

Tu devras aussi en supprimer au fur et mesure, dans bouger, lorsque tu verras que ta position (x,y) correspond à une brique qui existe encore.
Il faudra aussi penser à rebondir à ce moment là...
Je suis débutant dans le coding et j'ai assez de mal à voir comment faire tout ça ..
Messages postés
16142
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
8 avril 2020
92
Exemple avec un tableau de 25 lignes (hauteur 20) et 10 colonnes (largeur 50) soit une grille 500x500 correspondant à la taille du jeu.

boolean[][] briques = {
  { true,  true,  true,  true,  true,  true,  true,  true,  true,  true },
  { true,  true,  true,  true,  true,  true,  true,  true,  true,  true },
  { true,  true,  true,  true,  true,  true,  true,  true,  true,  true },
  { true,  true,  true,  true,  true,  true,  true,  true,  true,  true },
  { true,  true,  true,  true,  true,  true,  true,  true,  true,  true },
  { true,  true,  true,  true,  true,  true,  true,  true,  true,  true },
  { true,  true,  true,  true,  true,  true,  true,  true,  true,  true },
  { true,  true,  true,  true,  true,  true,  true,  true,  true,  true },
  { true,  true,  true,  true,  true,  true,  true,  true,  true,  true },
  { true,  true,  true,  true,  true,  true,  true,  true,  true,  true },
  { false, false, false, false, false, false, false, false, false, false },
  { false, false, false, false, false, false, false, false, false, false },
  { false, false, false, false, false, false, false, false, false, false },
  { false, false, false, false, false, false, false, false, false, false },
  { false, false, false, false, false, false, false, false, false, false },
  { false, false, false, false, false, false, false, false, false, false },
  { false, false, false, false, false, false, false, false, false, false },
  { false, false, false, false, false, false, false, false, false, false },
  { false, false, false, false, false, false, false, false, false, false },
  { false, false, false, false, false, false, false, false, false, false },
  { false, false, false, false, false, false, false, false, false, false },
  { false, false, false, false, false, false, false, false, false, false },
  { false, false, false, false, false, false, false, false, false, false },
  { false, false, false, false, false, false, false, false, false, false },
  { false, false, false, false, false, false, false, false, false, false }
};

void dessiner()
{
  // on itère sur chaque brique du tableau
  for (int i=0; i<25; i++)
  for (int j=0; j<10; j++)
  {
    // si la brique est présente on la dessine
    if (briques[i][j]) {
      fill(200, 0, 0);
      rect(50*j, 20*i, 50, 20);
    }
  }

  fill(0, 0, 0);
  rect(w, z, 100, 25);
  fill(255, 255, 255);
  ellipse(x, y, 20, 20);
}

void bouger()
{
  x = x + deplacementX;
  y = y + deplacementY;
  w = (mouseX);

  // on enlève la brique sur laquelle on est
  if (briques[y/20][x/50]) {
    briques[y/20][x/50]=false;
  }
}


Améliorations : pour l'instant on casse les briques en considérant la position (x,y) du centre de la bille.
Il faudrait prendre en compte le volume de la bille et casser toutes les briques qu'elle touche (donc à x-10, x+10, y-10 et y+10).
Il faudra aussi ajouter le rebond, ce qui dépendra de quelle partie de la bille a touché la brique.La confiance n'exclut pas le contrôle
Ok super merci beaucoup,

pourriez vous m'indiquer l'utilité du Boolean ? En gros ça sert à ce que les briques soient soit présentes soit absentes ?
Comment intégrer le rebond une fois que la balle touche la brique ?
Merci d'avance
Messages postés
16142
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
8 avril 2020
92
"En gros ça sert à ce que les briques soient soit présentes soit absentes ?"
C'est exactement ça, du coup on l'affiche ou pas, on la casse ou pas.

"Comment intégrer le rebond une fois que la balle touche la brique ?"
Si tu sais qu'elle touche la brique alors tu applique ta règle de rebond.

Exemple :

void bouger() 
{ 
  x += deplacementX; 
  y += deplacementY;
  
  if (x < 10) { // rebond sur le mur
    x = 10;
    deplacementX = -deplacementX;
  } else if (briques[y/20][(x-10)/50]) { // brique à gauche
    briques[y/20][(x-10)/50] = false;
    deplacementX = -deplacementX;
  }

Remarque : du coup la méthode rebond() ne sert plus à rien, on peut tout gérer comme ça.
Merci beaucoup,

Savez vous où je dois intégrer la commande de rebond dans mon code pour que cela fonctionne ?
Messages postés
16142
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
8 avril 2020
92
Dans la méthode bouger() comme je l'ai fait dans l'exemple.

Le rebond est une partie intégrante du mouvement, il n'y a pas de raison de faire deux méthodes distinctes.
Ah oui oui parfait je vois maintenant
Je ne comprend pas bien à quoi correspond y/20 et y/50 par exemple ?
Messages postés
16142
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
8 avril 2020
92
Ici 20 et 50 sont les dimensions d'une brique, c'est ce que j'expliquais plus haut : "un tableau de 25 lignes (hauteur 20) et 10 colonnes (largeur 50) soit une grille 500x500 correspondant à la taille du jeu"

C'est le problème des nombres magiques, ce serait mieux que tu rajoutes des constantes pour les différentes valeurs que tu utilises, de sorte qu'il n'y ait jamais de valeurs en durs dans ton code.

Exemple :

final int LONGUEUR_BRIQUE = 50;
final int HAUTEUR_BRIQUE = 20;
final int RAYON_BILLE = 10;
final int COULEUR_BRIQUE_ROUGE = 200;
final int COULEUR_BRIQUE_VERT = 0;
final int COULEUR_BRIQUE_BLEU = 0;

...

    if (briques[i][j]) {
      fill(COULEUR_BRIQUE_ROUGE, COULEUR_BRIQUE_VERT, COULEUR_BRIQUE_BLEU); 
      rect(LONGUEUR_BRIQUE*j, HAUTEUR_BRIQUE*i, LONGUEUR_BRIQUE, HAUTEUR_BRIQUE);
    }

...

  if (x < RAYON_BILLE) { // rebond sur le mur
    x = RAYON_BILLE;
    deplacementX = -deplacementX;
  } else if (briques[y/HAUTEUR_BRIQUE][(x-RAYON_BILLE)/LONGUEUR_BRIQUE]) { // brique à gauche
    briques[y/HAUTEUR_BRIQUE][(x-RAYON_BILLE)/LONGUEUR_BRIQUE] = false;
    deplacementX = -deplacementX;
  }
d'accord mais pourquoi avoir changer toute l'écriture pour rentrer les briques ? je ne comprend pas non plus le lien avec les nombres magiques ...
Messages postés
16142
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
8 avril 2020
92
"pourquoi avoir changer toute l'écriture pour rentrer les briques ?"
Je n'ai pas tout changé, j'ai juste remplacé les valeurs numériques par une constante nommée ce qui permet de savoir à quoi correspond chaque valeur, mais les valeurs sont exactement les même.

"je ne comprend pas non plus le lien avec les nombres magiques "
C'est sur la partie Constantes numériques non nommées
Bonjour, j’ai réussi a faire rebondir la balle lorsqu’elle touche vers le haut par déduction par rapport a ce que vous m’avez fait, mais je n’arrive pas a la faire rebondir vers le bas ni vers la droite, est il possible de me montrer et de m’expliquer en détail quel est l’utilité des « [] » ainsi que les « / » qui lient les X et Y ainsi que les coordonnées de ceux ci ?

else if (briques[y/20][(x-10)/50]) {

briques[y/20][(x-10)/50] = false;

deplacementX = -deplacementX;

}

if (y < 10) {

deplacementY = -deplacementY;

} else if (briques[(y-10)/20][x/50]) {

briques[(y-10)/20][x/50] = false;

deplacementY = -deplacementY;

}


Merci
Messages postés
16142
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
8 avril 2020
92
En fait c'est lié à ceci :

    // si la brique est présente on la dessine
    if (briques[i][j]) {
      fill(200, 0, 0);
      rect(50*j, 20*i, 50, 20);
    }

Chaque case du tableau est dessinée par un rectangle de 50x20 pixels.

Donc si on considère un pixel du jeu, il faut faire la division pour retrouver la case correspondante dans le tableau.

  if (x < 10) { // rebond sur le mur
    x = 10;
    deplacementX = -deplacementX;
  } else if (briques[y/20][(x-10)/50]) { // brique à gauche
    briques[y/20][(x-10)/50] = false;
    deplacementX = -deplacementX;
  }

Exemple : la case [13][5] du tableau est dessiné par le rectangle qui va de y=13*20=260 à 279 et de x=5*50=250 à 299.
Si on considère le point y=267 et x=284 en les divisant on obtient 267/20=13 et 284/50=5 donc le point (267,284) correspond à la case [13][5] dans le tableau.

Vers la droite et le bas c'est la même chose normalement qu'en haut et à gauche, il faut juste faire attention aux conditions qui étaient < pour les deux premiers cas et qui devraient être >= pour les deux autres.
Pourtant quand je modifie ces deux conditions, ça ne fonctionne pas ..
Avez vous une idée pour pouvoir écrire " gagné " quand toutes les briques sont cassées ?
 int deplacementX, deplacementY;

int x, y;

int w, z;

void setup()

{

size(500,500);

x = 250;

y = 470;

deplacementX = 4;

deplacementY = -5;

w = 0;

z = 475;

background(100,100,100);

}

boolean[][] briques = {

{ true, true, true, true, true, true, true, true, true, true },

{ true, true, true, true, true, true, true, true, true, true },

{ true, true, true, true, true, true, true, true, true, true },

{ true, true, true, true, true, true, true, true, true, true },

{ true, true, true, true, true, true, true, true, true, true },

{ true, true, true, true, true, true, true, true, true, true },

{ true, true, true, true, true, true, true, true, true, true },

{ true, true, true, true, true, true, true, true, true, true },

{ true, true, true, true, true, true, true, true, true, true },

{ true, true, true, true, true, true, true, true, true, true },

{ false, false, false, false, false, false, false, false, false, false },

{ false, false, false, false, false, false, false, false, false, false },

{ false, false, false, false, false, false, false, false, false, false },

{ false, false, false, false, false, false, false, false, false, false },

{ false, false, false, false, false, false, false, false, false, false },

{ false, false, false, false, false, false, false, false, false, false },

{ false, false, false, false, false, false, false, false, false, false },

{ false, false, false, false, false, false, false, false, false, false },

{ false, false, false, false, false, false, false, false, false, false },

{ false, false, false, false, false, false, false, false, false, false },

{ false, false, false, false, false, false, false, false, false, false },

{ false, false, false, false, false, false, false, false, false, false },

{ false, false, false, false, false, false, false, false, false, false },

{ false, false, false, false, false, false, false, false, false, false },

{ false, false, false, false, false, false, false, false, false, false }

};

void draw()

{

fond();

bouger();

dessiner();

}

void fond()

{

background(100,100,100);

}

void dessiner()

{

// on itère sur chaque brique du tableau

for (int i=0; i<25; i++)

for (int j=0; j<10; j++)

{

// si la brique est présente on la dessine

if (briques[i][j]) {

fill(200, 0, 0);

rect(50*j, 20*i, 50, 20);

}

}

fill(0, 0, 0);

rect(w, z, 100, 25);

fill(255, 255, 255);

ellipse(x, y, 20, 20);

}

void bouger()

{

x += deplacementX;

y += deplacementY;

if (x <10) { // rebond sur le mur gauche

x= 10;

deplacementX = -deplacementX;

} else if (briques[y/20][(x-10)/50]) { // brique à gauche

briques[y/20][(x-10)/50] = false;

deplacementX = -deplacementX;

}

if (y < 10) { // rebond sur le mur

y = 10;

deplacementY = -deplacementY;

} else if (briques[y/20][(x-10)/50]) { // brique à gauche

briques[y/20][(x-10)/50] = false;

deplacementY = -deplacementY;

}

if (x >490) { // rebond sur le mur gauche

x= 10;

deplacementX = -deplacementX;

} else if (briques[y/20][(x-10)/50]) { // brique à gauche

briques[y/20][(x-10)/50] = false;

deplacementX = -deplacementX;

}

if (y > 490) { // rebond sur le mur

y = 10;

deplacementY = -deplacementY;

} else if (briques[y/20][(x-10)/50]) { // brique à gauche

briques[y/20][(x-10)/50] = false;

deplacementY = -deplacementY;

}

if (y > 490)

{

noLoop();

print("GAME OVER");

}

}


Qu'est ce qui ne va pas qui fait que cela ne fonctionne pas ?

Merci d'avance
Messages postés
16142
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
8 avril 2020
92
Voici le code complet qui devrait fonctionner.

int deplacementX, deplacementY; 
int x, y; 
int w, z; 
int delay=100; 

boolean[][] briques = {
  { false, false, false, false, false, false, false, false, false, false }, 
  { false, true, true, false, true, true, false, true, true, false }, 
  { false, true, true, false, true, true, false, true, true, false }, 
  { false, true, true, false, true, true, false, true, true, false }, 
  { false, true, true, false, true, true, false, true, true, false }, 
  { false, false, false, false, false, false, false, false, false, false }, 
  { false, true, true, false, true, true, false, true, true, false }, 
  { false, true, true, false, true, true, false, true, true, false }, 
  { false, true, true, false, true, true, false, true, true, false }, 
  { false, true, true, false, true, true, false, true, true, false }, 
  { false, false, false, false, false, false, false, false, false, false }, 
  { false, false, false, false, false, false, false, false, false, false }, 
  { false, false, false, false, false, false, false, false, false, false }, 
  { false, false, false, false, false, false, false, false, false, false }, 
  { false, false, false, false, false, false, false, false, false, false }, 
  { false, false, false, false, false, false, false, false, false, false }, 
  { false, false, false, false, false, false, false, false, false, false }, 
  { false, false, false, false, false, false, false, false, false, false }, 
  { false, false, false, false, false, false, false, false, false, false }, 
  { false, false, false, false, false, false, false, false, false, false }, 
  { false, false, false, false, false, false, false, false, false, false }, 
  { false, false, false, false, false, false, false, false, false, false }, 
  { false, false, false, false, false, false, false, false, false, false }, 
  { false, false, false, false, false, false, false, false, false, false }, 
  { false, false, false, false, false, false, false, false, false, false }
};

void setup() 
{ 
  size(500, 500); 
  x = 250; 
  y = 470; 
  deplacementX = 4; 
  deplacementY = -5; 
  w = 0; 
  z = 475; 
  background(100, 100, 100);
} 

void draw() 
{ 
  bouger(); 
  dessiner();
} 

void dessiner() 
{ 
  background(100, 100, 100);

  // on itère sur chaque brique du tableau
  for (int i=0; i<25; i++)
  {
    for (int j=0; j<10; j++)
    {
      // si la brique est présente on la dessine
      if (briques[i][j]) {
        fill(200, 0, 0);
        rect(50*j, 20*i, 50, 20);
      }
    }
  }

  fill(0, 0, 0);
  rect(w, z, 100, 25);
  fill(255, 255, 255);
  ellipse(x, y, 20, 20);
} 

void bouger() 
{ 
  x = x + deplacementX;
  y = y + deplacementY;
  w = mouseX-50;

  // on enlève la brique sur laquelle on est
  if (briques[y/20][x/50]) {
    briques[y/20][x/50]=false;
  }

  if (x < 10) { // rebond à gauche
    x = 10;
    deplacementX = -deplacementX;
  } else if (briques[y/20][(x-10)/50]) { // brique à gauche
    briques[y/20][(x-10)/50] = false;
    deplacementX = -deplacementX;
  }

  if (x >= 490) { // rebond à droite
    x = 490;
    deplacementX = -deplacementX;
  } else if (briques[y/20][(x+10)/50]) { // brique à droite
    briques[y/20][(x+10)/50] = false;
    deplacementX = -deplacementX;
  }

  if (y < 10) { // rebond en haut
    y = 10;
    deplacementY = -deplacementY;
  } else if (briques[(y-10)/20][x/50]) { // brique en haut
    briques[(y-10)/20][x/50] = false;
    deplacementY = -deplacementY;
  }

  if (y >= 490) { 
    noLoop(); 
    print("GAME OVER");
  } else if (y >= 465 && x > w && x < w+100) { // rebond sur la barre
    deplacementY = -deplacementY;
  } else if (briques[(y+10)/20][x/50]) { // brique en bas
    briques[(y+10)/20][x/50] = false;
    deplacementY = -deplacementY;
  }
}
Messages postés
16142
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
8 avril 2020
92
"Avez vous une idée pour pouvoir écrire " gagné " quand toutes les briques sont cassées ?"
Il faudrait parcourir le tableau et regarder s'il reste des valeurs à true ou si elles sont toutes à false. Tu peux par exemple faire ça au moment où tu dessines les briques, si tu n'en as dessiné aucune c'est qu'il n'y en a plus...
>
Messages postés
16142
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
8 avril 2020

Oui oui j'avais bien cette idée en tête mais je ne sais pas quelle commande appliquer pour faire ceci
Messages postés
16142
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
8 avril 2020
92 > Asta
Exemple :

void dessiner() 
{ 
  background(100, 100, 100);
  
  int nbBriques = 0;

  // on itère sur chaque brique du tableau
  for (int i=0; i<25; i++)
  {
    for (int j=0; j<10; j++)
    {
      // si la brique est présente on la dessine
      if (briques[i][j]) {
        fill(200, 0, 0);
        rect(50*j, 20*i, 50, 20);
        nbBriques++; // et on la compte
      }
    }
  }
  
  if (nbBriques == 0) { // si on a dessiné aucune brique
    noLoop(); 
    print("GAGNE");
  }

Astuce : pour tester tu peux ajouter un rebond en bas, ce qui évite d'avoir à jouer en vrai (et potentiellement perdre) avant d'avoir cassé toutes les briques.

  if (y >= 490) { 
    noLoop(); 
    print("GAME OVER");
  } else if (y >= 465 && x > w && x < w+100) { // rebond sur la barre
    deplacementY = -deplacementY;
  } else if (y >= 300 && deplacementY > 0) { // code de triche
    deplacementY = -deplacementY;
  } else if (briques[(y+10)/20][x/50]) { // brique en bas
    briques[(y+10)/20][x/50] = false;
    deplacementY = -deplacementY;
  }
Merci beaucoup, j'ai réussi a appliquer votre exemple à mon jeu et il fonctionne grâce à votre aide !

Merci encore et bonne journée !