Bug dans un programme simple.

Une fenêtre qui ne s'ouvre pas

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour ! Quand je lance ce programme, Processing (2.2.1) refuse d'ouvrir la fenêtre graphique.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
int [][] grilleRecu = new int[10][10];
int [][] grilleEnvoye = new int[10][10];

int boatType, boatSize, X, Y, vertical;

PFont font = createFont("U:/Documents/Processing/bataille_navale/data/Minecraftia-Regular.ttf", 32, false);
//PFont font = createFont("/home/yann/MEGA/Documents/Lycée/ISN/bataille_navale/data/Minecraftia-Regular.ttf", 32, false);

void setup() {
  size(1200, 600);
  background(100);
  grille(0);                            //Dessine les deux grilles.
  initialisation();                     //Place les navires ennemis
  placerNavires();                      //Demande à l'utilisateur de placer ses navires.
}

void draw() {
}


void grille(int z) {                    //Dessine la ou les grilles demandées
  stroke(255);
  fill(0, 175, 200);
  if (z == 0 || z == 1) {
    rect(0, 100, 500, 500);
    for (int x = 0; x <= 500; x+=50) {
      line(x, 100, x, 600);
      line(0, x+100, 500, x+100);
    }
  }
  if (z == 0 || z == 2) {
    rect(700, 100, 500, 500);
    for (int x = 0; x <= 500; x+=50) {
      line(x+700, 100, x+700, 600);
      line(700, x+100, 1200, x+100);
    }
  }
}

void placerNavires() {
  boolean done = false;
  vertical = 0;
  for (boatType = 5; boatType>0; boatType--) {
    while (!done) {
      boatSize = (boatType <= 2)?boatType+1:boatType;
      switch (vertical) {
      case 0:
        fill(0);
        for (int x = mouseX (); x <= mouseX() + boatSize; x++) {
          rect(x, mouseY(), 50, 50);
        }
        break;
      case 1:
        fill(0);
        for (int y = mouseY (); y <= mouseY() + boatSize; y++) {
          rect(mouseX(), y, 50, 50);
        }
      }
    }
  }
}





int mouseX() {
  return mouseX/50;
}

int mouseY() {
  return mouseY/50;
}

void mouseWheel() {
  vertical = (vertical == 0)?1:0;
}

void initialisation(){
  for (boatType = 1; boatType <= 5; boatType++) {
    boolean placed = false;
    while (!placed) {                                       //Tant que le navire n'est pas placé, on recommence
      boolean boatHere = false;
      boatSize = (boatType <= 2)?boatType+1:boatType;
      X = int(random(10));
      Y = int(random(10));
      vertical = int(random(2));

      switch (vertical) {
      case 0:
        if (X + boatSize < 10) {                                      //Vérifie que le navire passe dans la grille
          for (int x = X; x < X+boatSize; x++) {
            boatHere = (grilleEnvoye[x][Y] == 0)?boatHere:true;       //Vérifie qu'il n'y aura pas de collision
          }          
          if (!boatHere) {                                            //Place la navire si les conditions précédentes sont bonnes, en position horizontale
            placed = true;
            for (int x = X; x < X+boatSize; x++) {
              grilleEnvoye[x][Y] = boatType;
            }
          }
        }
        break;
      case 1:
        if (Y + boatSize < 10) {                                      //Vérifie que le navire passe dans la grille
          for (int y = Y; y < Y+boatSize; y++) {
            boatHere = (grilleEnvoye[X][y] == 0)?boatHere:true;       //Vérifie qu'il n'y aura pas de collisions
          }
          if (!boatHere) {                                            //Place le navire si les conditions précédentes sont bonnes, en position verticale
            placed = true;
            for (int y = Y; y < Y+boatSize; y++) {
              grilleEnvoye[X][y] = boatType;
            }
          }
        }
        break;
      }
    }
  }
}

Édité par Breizh

Breizh zo ma bro, hag ihuel eo ma c'halon geti. Da viken. – L'oiseau imaginaire : ZzxŷxzZ

+0 -0
Auteur du sujet

Nan, ça ne pose aucun problème ça, j'ai essayé, on est juste obligé de mettre draw pour que les inputs souris et claviers fonctionnent. Ça marchait très bien quand je n'affichais que les grilles, mis à part que le temps de chargement de la fenêtre graphique était très long. Maintenant le mode console fonctionne parfaitement, mais pas la fenêtre graphique.

Breizh zo ma bro, hag ihuel eo ma c'halon geti. Da viken. – L'oiseau imaginaire : ZzxŷxzZ

+0 -0

Je voudrais bien t'aider, mais il manque du code (include, main…). Quelle est la fonction sensée ouvrir ta fenêtre ? Tu utilises quelle bibliothèque ?

Faute de t'avoir aidé, voici une petite optimisation pour faciliter la lecture.

1
2
3
void mouseWheel() {
  vertical = !vertical;
}

A bientôt !

+0 -0
Auteur du sujet

Sinon, pour le mouseWheel, vertical est un integer, donc ça ne fonctionne pas (j'avais besoin d'un integer pour les switch et le random).

Et ça fonctionnait avant, mis à part que la fenêtre graphique mettait un temps fou à charger, le programme en lui-même n'a pas l'air bugué, mais il fait buguer Processing, et exporter le programme vers un .exe ne change rien (le .exe ne fonctionne pas ou n'affiche pas de fenêtre graphique…).

Breizh zo ma bro, hag ihuel eo ma c'halon geti. Da viken. – L'oiseau imaginaire : ZzxŷxzZ

+0 -0
Staff

Je ne connais pas processing mais tu dis :

Maintenant le mode console fonctionne parfaitement, mais pas la fenêtre graphique.

Qu'est ce que tu appels le mode console dans le code que tu nous a mit ?

+0 -0
Auteur du sujet

Eh bien en vérifiant les variables (à grand coups de println), le programme tourne correctement, et fait les bonnes boucles dans le bon ordre, les navires de l'IA sont bien placés dans le tableau grilleEnvoye, mais la fenêtre graphique ne s'affiche pas.

Breizh zo ma bro, hag ihuel eo ma c'halon geti. Da viken. – L'oiseau imaginaire : ZzxŷxzZ

+0 -0
Staff

Tu peux re-coller les fonctions d'affichage dans draw ? Car dans ma logique tu as setup qui fait l'init et draw qui correspond à la boucle infinie d'affichage. C'est elle qui doit gérer le dessin. Car si pour une raison le contenu est masqué, ton prog ne saura pas le re-dessiner, non ?

+0 -0
Auteur du sujet

En fait, draw gère en effet une boucle infinie, mais il est possible de dessiner dans n'importe quelle fonction (heureusement), si du contenu est masqué, j'appelle la fonction grille(), qui redessine la ou les grilles demandées (c'est vrai que mon prog manque de commentaires), mais en théorie, le size(1200,600); est censé crée une fenêtre de 1200 pixels de large et 600 de haut, et ça ça se défini dans le setup, le background change juste le fond, et moi il est fixe ( background(100); ), donc inutile de le mettre dans draw(), et ce que je ne comprends pas c'est que le programme passe sur ce size et ce background (j'ai vérifié, il lit les boucles de la fonction qui suit), mais cela ne fait rien.

Édité par Breizh

Breizh zo ma bro, hag ihuel eo ma c'halon geti. Da viken. – L'oiseau imaginaire : ZzxŷxzZ

+0 -0
Staff

Bon comme je l'ai dit, je ne connais pas processing MAIS dans un système fenetré classique, tout ce qui n'est pas dans une fonction d'affichage peut facilement etre perdu. Par exemple ce qui est fait a l'init serait perdu si tu réduit la fenetre dans la barre des taches ou si une autre fenetre passe dessus. Quand ça fonctionne comme ça, on met que l'init dans le setup et tout le code de dessin est appelé dans le draw qui redessine la vue entièrement.

Apres ton principe ne peut fonctionner que si processing sauvegarde le buffer à la fin de l'init mais ça me semble étrange (ça reste possible).

+0 -0
Auteur du sujet

Le bug se trouvait dans la fonction placerNavires(), en l'enlevant le programme fonctionne.

Merci.

Édité par Breizh

Breizh zo ma bro, hag ihuel eo ma c'halon geti. Da viken. – L'oiseau imaginaire : ZzxŷxzZ

+0 -0

Je confirme ce que dis Kje.

Sinon, pour optimiser un peu ton code. Je trouve que beaucoup de ce qui est dans initialisation répète celui qui est dans placerNavires(), qui ne sert pour l'instant à rien. Je trouverais ça logique d'appeler placerNavires() dans initialisation().

Sinon, tu peux très bien utiliser un booléen pour vertical. Et je ne comprends pas pourquoi utiliser un switch. Puisqu'il ne peut avoir que deux valeurs, autant utiliser un if/else, ce sera plus court et plus lisible.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
vertical = int(random(2)) == 0 ? false : true;

// plus loin.
if(vertical)
{
    // du code
}
else
{
    // encore du code
}
+0 -0
Auteur du sujet

Ah oui… merci ^^

Par contre placerNavires() n'était pas finie, il s'agit du placement des navires alliés (fait par l'utilisateur).

Édité par Breizh

Breizh zo ma bro, hag ihuel eo ma c'halon geti. Da viken. – L'oiseau imaginaire : ZzxŷxzZ

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte