Code casse brique ( ne parvient pas à casser les briques )

Résolu
Asta - Modifié le 27 mai 2017 à 12:14
 Asta - 28 mai 2017 à 17:29
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

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 127
27 mai 2017 à 12:27
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à...
0
Je suis débutant dans le coding et j'ai assez de mal à voir comment faire tout ça ..
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 127
Modifié le 27 mai 2017 à 13:09
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
0
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
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 127
Modifié le 27 mai 2017 à 14:01
"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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Merci beaucoup,

Savez vous où je dois intégrer la commande de rebond dans mon code pour que cela fonctionne ?
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 127
27 mai 2017 à 14:18
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.
0
Ah oui oui parfait je vois maintenant
Je ne comprend pas bien à quoi correspond y/20 et y/50 par exemple ?
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 127
27 mai 2017 à 14:40
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;
  }
0
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 ...
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 127
27 mai 2017 à 15:15
"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
0
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
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 127
28 mai 2017 à 15:10
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.
0
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 ?
0
 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
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 127
28 mai 2017 à 16:12
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;
  }
}
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 127
Modifié le 28 mai 2017 à 16:41
"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...
0
Asta > KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024
28 mai 2017 à 16:40
Oui oui j'avais bien cette idée en tête mais je ne sais pas quelle commande appliquer pour faire ceci
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 127 > Asta
Modifié le 28 mai 2017 à 16:51
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;
  }
0
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 !
0
Rejoignez-nous