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 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210
| //*parcour.c
*fichier contenant l ensemble des fonctions permettant de parcourir le
*labyrinthe
*/
#include<stdio.h>
/* Médinoc:
La macro assert() permet de tester des invariants,
terminant le programme si une condition supposée toujours vraie est fausse.
*/
#include <assert.h>
/*#include"../../include/parcour.h"*/
//#include"../../include/affichage.h"
#define H 4
#define B 3
#define D 2
#define G 1
/* Médinoc : À quoi vont te servir ces diagonales, finalement ? */
#define HD 0
#define HG 5
#define BD 6
#define BG 8
/** la fonction avance permet d'avancer dans le labyrinthe
*/
void avance();
int case_droite();
int case_devant();
/* Médinoc:
Suppression de variables locales:
Utiliser des pointeurs à la place.
*/
void avance(int *pi, int *pj, int dir)
{
int i;
int j;
assert(pi != NULL);
assert(pj != NULL);
i = *pi;
j = *pj;
/* Médinoc:
Utiliser un switch() à la place de ce lot de if...
*/
switch(dir)
{
case H:
i--;
break;
case D:
j++;
break;
case HD:
i--;
j++;
break;
case HG:
i--;
j--;
break;
case B:
i++;
break;
case G:
j--;
break;
case BG:
i++;
j--;
break;
case BD:
i++;
j++;
break;
default:
/* Normalement, on ne passe jamais ici,
car dir a toujours l'une des huit valeurs testées. */
assert(0);
break;
}/* switch */
*pi = i;
*pj = j;
}
/*la fonction permet de se deplacer si c'est possible
*/
/* Médinoc:
Suppression de variables globales. */
int case_devant(int const laby [][100], int i, int j, int dir)
{
switch(dir)
{
case H:
return laby[i-1][j];
case D:
return laby[i][j+1];
case HD:
return laby[i][j+1];
case B:
return laby[i+1][j];
case HG:
return laby[i-1][j-1];
case G:
return laby[i][j-1];
case BG:
return laby[i+1][j-1];
case BD:
return laby[i+1][j+1];
default:
/* Normalement, on ne passe jamais ici,
car dir a toujours l'une des huit valeurs testées. */
assert(0);
return 1;
}/* switch */
}
/* Médinoc:
Suppression de variables globales. */
int case_droite(int const laby [][100], int i, int j, int dir)
{
/* Médinoc:
On peut faire plus simple en choisissant correctement les valeurs de dir,
mais j'expliquerai à part. */
switch(dir)
{
case H:
return laby[j-1][i];
case D:
return laby[j][i+1];
case HD:
return laby[j][i+1];
case B:
return laby[j+1][i];
case HG:
return laby[j-1][i-1];
case G:
return laby[j][i-1];
case BG:
return laby[j+1][i-1];
case BD:
return laby[j+1][i+1];
default:
/* Normalement, on ne passe jamais ici,
car dir a toujours l'une des huit valeurs testées. */
assert(0);
return 1;
}/* switch */
}
/*la fonction suivante permet de connaitre la possibilité de passage
*suivant une direction*/
/* Médinoc:
Nom de fonction oublié.
Ouah, ici, c'est vraiment, mais alors vraiment le bordel.
Tu fais tes boucles for sur tes variables globales, mais en même temps, tu les modifies avec avance()...
J'ai viré toutes les globales, mais il se passe dans cette fonction des choses vraiment pourries,
et je ne suis pas assez fort pour déboguer ça...
*/
void UneFonction(void)
{
int laby[100][100];
/*m.donnees=laby;*/
int i,j;
int dir = 0; /* Médinco: dir n'était pas initialisé. */
for(i=0 ; i<100 ; i++)
{
for(j=0 ; j<100 ; j++) //( i<100 && j<100 )
{
{
/* Médinoc:
Alors ça, c'est vraiment, mais alors vraiment VRAIMENT moche.
Avec tous ces if sans accolades, c'est pratiquement impossible de s'y retrouver.
Surtout qu'il manquait deux accolades à la fin du fichier...
*/
if( case_droite(laby, i, j, dir) == 0 )
// on se tourne vers la droite
// un moyen plus simple est : dir = ( dir+1 ) % 4;
if( dir == G )
dir = H;
else
{
dir = dir + 1;
// puis on avance d'une case
avance(&i, &j, dir);
}
else
if( case_devant(laby, i, j, dir) == 0 )
{
avance(&i, &j, dir);
}
else
// on a plus le choix,
// on se tourne vers la gauche
if( dir == H )
dir = G;
else
dir = dir - 1;
// le moyen plus simple était d'écrire : dir = ( dir-1 ) % 4;
}
}
}
} |
Partager