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

Asta - 27 mai 2017 à 11:51 - Dernière réponse :  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
Afficher la suite 

20 réponses

Répondre au sujet
KX 15088 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 12 décembre 2017 Dernière intervention - 27 mai 2017 à 12:27
0
Utile
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à...
Commenter la réponse de KX
0
Utile
Je suis débutant dans le coding et j'ai assez de mal à voir comment faire tout ça ..
Commenter la réponse de Asta
KX 15088 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 12 décembre 2017 Dernière intervention - Modifié par KX le 27/05/2017 à 13:09
0
Utile
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
Commenter la réponse de KX
0
Utile
1
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
KX 15088 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 12 décembre 2017 Dernière intervention - 27 mai 2017 à 13:58
"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.
Commenter la réponse de Asta
0
Utile
1
Merci beaucoup,

Savez vous où je dois intégrer la commande de rebond dans mon code pour que cela fonctionne ?
KX 15088 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 12 décembre 2017 Dernière intervention - 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.
Commenter la réponse de Asta
0
Utile
1
Ah oui oui parfait je vois maintenant
Je ne comprend pas bien à quoi correspond y/20 et y/50 par exemple ?
KX 15088 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 12 décembre 2017 Dernière intervention - 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;
  }
Commenter la réponse de Asta
0
Utile
1
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 ...
KX 15088 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 12 décembre 2017 Dernière intervention - 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
Commenter la réponse de Asta
0
Utile
2
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
KX 15088 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 12 décembre 2017 Dernière intervention - 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.
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 ?
Commenter la réponse de Asta
0
Utile
4
 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
KX 15088 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 12 décembre 2017 Dernière intervention - 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;
  }
}
KX 15088 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 12 décembre 2017 Dernière intervention - 28 mai 2017 à 16:15
"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...
Asta > KX 15088 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 12 décembre 2017 Dernière intervention - 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
KX 15088 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 12 décembre 2017 Dernière intervention > Asta - 28 mai 2017 à 16:44
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;
  }
Commenter la réponse de Asta
0
Utile
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 !
Commenter la réponse de Asta

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.