fichiers utilisees pour la création d'un labyrinthe 3D

Committer:
kangulu
Date:
Thu Apr 30 08:19:00 2020 +0000
Revision:
0:1f10f1e735e0
first commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kangulu 0:1f10f1e735e0 1 #include "GAME_ENGINE.h"
kangulu 0:1f10f1e735e0 2
kangulu 0:1f10f1e735e0 3 LCD_DISCO_F746NG lcd;
kangulu 0:1f10f1e735e0 4
kangulu 0:1f10f1e735e0 5 int active_layer = 0;
kangulu 0:1f10f1e735e0 6
kangulu 0:1f10f1e735e0 7 void screen_init()
kangulu 0:1f10f1e735e0 8 {
kangulu 0:1f10f1e735e0 9 lcd.Clear(LCD_COLOR_BLACK);
kangulu 0:1f10f1e735e0 10 BSP_LCD_SelectLayer(active_layer);
kangulu 0:1f10f1e735e0 11 BSP_LCD_SetLayerVisible(active_layer, ENABLE);
kangulu 0:1f10f1e735e0 12 BSP_LCD_SetLayerVisible((active_layer+1)%2, DISABLE);
kangulu 0:1f10f1e735e0 13 }
kangulu 0:1f10f1e735e0 14
kangulu 0:1f10f1e735e0 15 uint32_t ARGBtoColor(int A,int R,int G,int B)
kangulu 0:1f10f1e735e0 16 {
kangulu 0:1f10f1e735e0 17 //A correspond à la transparence
kangulu 0:1f10f1e735e0 18 return (uint32_t) (A*(1<<24)+R*(1<<16)+G*(1<<8)+B);
kangulu 0:1f10f1e735e0 19 }
kangulu 0:1f10f1e735e0 20
kangulu 0:1f10f1e735e0 21 void draw_seg_v(int c, int l1, int l2, color couleur)
kangulu 0:1f10f1e735e0 22 {
kangulu 0:1f10f1e735e0 23 /*
kangulu 0:1f10f1e735e0 24 c : coordonnée x
kangulu 0:1f10f1e735e0 25 i : coordonnée y
kangulu 0:1f10f1e735e0 26 et couleur
kangulu 0:1f10f1e735e0 27 */
kangulu 0:1f10f1e735e0 28 for(int i=0;i<271;i++)
kangulu 0:1f10f1e735e0 29 {
kangulu 0:1f10f1e735e0 30 if(i>l1 && i<l2)
kangulu 0:1f10f1e735e0 31 {
kangulu 0:1f10f1e735e0 32 if(couleur == 2)
kangulu 0:1f10f1e735e0 33 {
kangulu 0:1f10f1e735e0 34 lcd.DrawPixel(c,i,ARGBtoColor(255,146,72,0));
kangulu 0:1f10f1e735e0 35 }
kangulu 0:1f10f1e735e0 36 else if(couleur == 1)
kangulu 0:1f10f1e735e0 37 {
kangulu 0:1f10f1e735e0 38 lcd.DrawPixel(c,i,ARGBtoColor(255,0,180,0));
kangulu 0:1f10f1e735e0 39 }
kangulu 0:1f10f1e735e0 40 else
kangulu 0:1f10f1e735e0 41 {
kangulu 0:1f10f1e735e0 42 lcd.DrawPixel(c,i,ARGBtoColor(255,0,0,0));
kangulu 0:1f10f1e735e0 43 }
kangulu 0:1f10f1e735e0 44 }
kangulu 0:1f10f1e735e0 45 else
kangulu 0:1f10f1e735e0 46 {
kangulu 0:1f10f1e735e0 47 lcd.DrawPixel(c,i,ARGBtoColor(255,0,0,0));
kangulu 0:1f10f1e735e0 48 }
kangulu 0:1f10f1e735e0 49 }
kangulu 0:1f10f1e735e0 50 }
kangulu 0:1f10f1e735e0 51
kangulu 0:1f10f1e735e0 52 //Commandes pour se déplacer
kangulu 0:1f10f1e735e0 53 void arrow_up(position *pos,double vx,double vy)
kangulu 0:1f10f1e735e0 54 {
kangulu 0:1f10f1e735e0 55 pos->x += vx;
kangulu 0:1f10f1e735e0 56 pos->y += vy;
kangulu 0:1f10f1e735e0 57 }
kangulu 0:1f10f1e735e0 58
kangulu 0:1f10f1e735e0 59 void arrow_down(position *pos,double vx,double vy)
kangulu 0:1f10f1e735e0 60 {
kangulu 0:1f10f1e735e0 61 pos->x -= vx;
kangulu 0:1f10f1e735e0 62 pos->y -= vy;
kangulu 0:1f10f1e735e0 63 }
kangulu 0:1f10f1e735e0 64
kangulu 0:1f10f1e735e0 65 void rotation(double *vx,double *vy, double theta)
kangulu 0:1f10f1e735e0 66 {
kangulu 0:1f10f1e735e0 67 double tvx = *vx;
kangulu 0:1f10f1e735e0 68 double tvy = *vy;
kangulu 0:1f10f1e735e0 69 *vx = cos(theta)*tvx + sin(theta)*tvy;
kangulu 0:1f10f1e735e0 70 *vy = - sin(theta)*tvx + cos(theta)*tvy;
kangulu 0:1f10f1e735e0 71 }
kangulu 0:1f10f1e735e0 72
kangulu 0:1f10f1e735e0 73 void arrow_right(double *vx,double *vy)
kangulu 0:1f10f1e735e0 74 {
kangulu 0:1f10f1e735e0 75 rotation(&(*vx),&(*vy),0.5);
kangulu 0:1f10f1e735e0 76 }
kangulu 0:1f10f1e735e0 77 void arrow_left(double *vx,double *vy)
kangulu 0:1f10f1e735e0 78 {
kangulu 0:1f10f1e735e0 79 rotation(&(*vx),&(*vy),0.5);
kangulu 0:1f10f1e735e0 80 }
kangulu 0:1f10f1e735e0 81 //
kangulu 0:1f10f1e735e0 82
kangulu 0:1f10f1e735e0 83 color tangent_wall_h(double xprime, int yprime, double vy, worldmap map)
kangulu 0:1f10f1e735e0 84 {
kangulu 0:1f10f1e735e0 85 int i=(int) (xprime/WALL_SIZE), j=yprime/WALL_SIZE;
kangulu 0:1f10f1e735e0 86 if (vy<0){
kangulu 0:1f10f1e735e0 87 j--;
kangulu 0:1f10f1e735e0 88 }
kangulu 0:1f10f1e735e0 89 if ((i<0)||(j<0)||(i>=MAP_WIDTH)||(j>=MAP_HEIGHT)){
kangulu 0:1f10f1e735e0 90 /* sortie de la carte */
kangulu 0:1f10f1e735e0 91 return 3;
kangulu 0:1f10f1e735e0 92 }else{
kangulu 0:1f10f1e735e0 93 return map[j][i];
kangulu 0:1f10f1e735e0 94 }
kangulu 0:1f10f1e735e0 95 }
kangulu 0:1f10f1e735e0 96
kangulu 0:1f10f1e735e0 97 color tangent_wall_v(int xprime, double yprime, double vx, worldmap map)
kangulu 0:1f10f1e735e0 98 {
kangulu 0:1f10f1e735e0 99 int j = xprime / WALL_SIZE;
kangulu 0:1f10f1e735e0 100 int i = (int) (yprime / WALL_SIZE);
kangulu 0:1f10f1e735e0 101 if (vx < 0) {
kangulu 0:1f10f1e735e0 102 j--;
kangulu 0:1f10f1e735e0 103 }
kangulu 0:1f10f1e735e0 104
kangulu 0:1f10f1e735e0 105 if (i < 0 || i >= MAP_WIDTH || j < 0 || j >= MAP_HEIGHT) {
kangulu 0:1f10f1e735e0 106 return 3;
kangulu 0:1f10f1e735e0 107 } else {
kangulu 0:1f10f1e735e0 108 return map[i][j];
kangulu 0:1f10f1e735e0 109 }
kangulu 0:1f10f1e735e0 110 }
kangulu 0:1f10f1e735e0 111
kangulu 0:1f10f1e735e0 112 dist_and_color dda_v(position pos, double vx, double vy, worldmap map)
kangulu 0:1f10f1e735e0 113 {
kangulu 0:1f10f1e735e0 114 dist_and_color dc;
kangulu 0:1f10f1e735e0 115 int i=pos.x/WALL_SIZE,di=1;
kangulu 0:1f10f1e735e0 116 if (vx>0){
kangulu 0:1f10f1e735e0 117 i++;
kangulu 0:1f10f1e735e0 118 }else{
kangulu 0:1f10f1e735e0 119 di=-1;
kangulu 0:1f10f1e735e0 120 }
kangulu 0:1f10f1e735e0 121 double dx=fabs(WALL_SIZE*i-pos.x); /* distance horizontale au premier bord
kangulu 0:1f10f1e735e0 122 vertical dans la direction d'observation (en pixels) */
kangulu 0:1f10f1e735e0 123 double d1; /* distance au premier bord vertical dans la direction d'observation (en pixels) */
kangulu 0:1f10f1e735e0 124 double Dy=vy/fabs(vx); /* distance verticale (en cases)
kangulu 0:1f10f1e735e0 125 parcourue quand une case est parcourue horizontalement */
kangulu 0:1f10f1e735e0 126 double du=WALL_SIZE*sqrt(1+Dy*Dy); /* increment de distance lors du passage
kangulu 0:1f10f1e735e0 127 au bord vertical suivant (en pixels) */
kangulu 0:1f10f1e735e0 128 if (vx==0)
kangulu 0:1f10f1e735e0 129 { /* dans le cas dégénéré où la direction d'observation
kangulu 0:1f10f1e735e0 130 est pile verticale */
kangulu 0:1f10f1e735e0 131 dc.distance = INFINITY;
kangulu 0:1f10f1e735e0 132 dc.color=tangent_wall_v( pos.x, pos.y, vx, map);
kangulu 0:1f10f1e735e0 133 return dc;
kangulu 0:1f10f1e735e0 134 }
kangulu 0:1f10f1e735e0 135 pos.y += dx*Dy; /* first vertical line crossing coordinate */
kangulu 0:1f10f1e735e0 136 d1 = dx*du/WALL_SIZE;
kangulu 0:1f10f1e735e0 137 dc.distance = d1;
kangulu 0:1f10f1e735e0 138
kangulu 0:1f10f1e735e0 139 while ((dc.color=tangent_wall_v( WALL_SIZE*i, pos.y, vx, map))==0){
kangulu 0:1f10f1e735e0 140 i += di;
kangulu 0:1f10f1e735e0 141 pos.y += WALL_SIZE*Dy;
kangulu 0:1f10f1e735e0 142 dc.distance += du;
kangulu 0:1f10f1e735e0 143 }
kangulu 0:1f10f1e735e0 144 return dc;
kangulu 0:1f10f1e735e0 145 }
kangulu 0:1f10f1e735e0 146
kangulu 0:1f10f1e735e0 147 dist_and_color dda_h(position pos, double vx, double vy, worldmap map)
kangulu 0:1f10f1e735e0 148 {
kangulu 0:1f10f1e735e0 149 dist_and_color dc;
kangulu 0:1f10f1e735e0 150 int j=pos.y/WALL_SIZE,dj=1;
kangulu 0:1f10f1e735e0 151 if (vy>0){
kangulu 0:1f10f1e735e0 152 j++;
kangulu 0:1f10f1e735e0 153 }else{
kangulu 0:1f10f1e735e0 154 dj=-1;
kangulu 0:1f10f1e735e0 155 }
kangulu 0:1f10f1e735e0 156 double dy=fabs(WALL_SIZE*j-pos.y); /* distance verticale au premier bord
kangulu 0:1f10f1e735e0 157 horizontal dans la direction d'observation (en pixels) */
kangulu 0:1f10f1e735e0 158 double d1; /* distance au premier bord horizontal dans la direction d'observation (en pixels) */
kangulu 0:1f10f1e735e0 159 double Dx = vx/fabs(vy); /* distance horizontale (en cases)
kangulu 0:1f10f1e735e0 160 parcourue quand une case est parcourue verticalement */
kangulu 0:1f10f1e735e0 161 double du=WALL_SIZE*sqrt(1+Dx*Dx); /* increment de distance lors du passage
kangulu 0:1f10f1e735e0 162 au bord horizontal suivant (en pixels) */
kangulu 0:1f10f1e735e0 163 if (vy==0){ /* dans le cas dégénéré où la direction d'observation
kangulu 0:1f10f1e735e0 164 est pile horizontale, on évite éventuellement la division par 0 */
kangulu 0:1f10f1e735e0 165 dc.distance = INFINITY;
kangulu 0:1f10f1e735e0 166 dc.color=tangent_wall_h( pos.x, pos.y, vy, map);
kangulu 0:1f10f1e735e0 167 return dc;
kangulu 0:1f10f1e735e0 168 }
kangulu 0:1f10f1e735e0 169 pos.x += dy*Dx; /* first horizontal line crossing coordinate */
kangulu 0:1f10f1e735e0 170 d1 = dy*du/WALL_SIZE;
kangulu 0:1f10f1e735e0 171 dc.distance = d1;
kangulu 0:1f10f1e735e0 172 while ((dc.color=tangent_wall_h( pos.x, WALL_SIZE*j, vy, map))==0)
kangulu 0:1f10f1e735e0 173 {
kangulu 0:1f10f1e735e0 174 j += dj;
kangulu 0:1f10f1e735e0 175 pos.x += WALL_SIZE*Dx;
kangulu 0:1f10f1e735e0 176 dc.distance += du;
kangulu 0:1f10f1e735e0 177 }
kangulu 0:1f10f1e735e0 178 return dc;
kangulu 0:1f10f1e735e0 179 }
kangulu 0:1f10f1e735e0 180
kangulu 0:1f10f1e735e0 181
kangulu 0:1f10f1e735e0 182 dist_and_color dda(position pos,double vx, double vy,worldmap map)
kangulu 0:1f10f1e735e0 183 {
kangulu 0:1f10f1e735e0 184 dist_and_color v = dda_v(pos,vx,vy,map);
kangulu 0:1f10f1e735e0 185 dist_and_color h = dda_h(pos,vx,vy,map);
kangulu 0:1f10f1e735e0 186 if(v.distance < h.distance)
kangulu 0:1f10f1e735e0 187 {
kangulu 0:1f10f1e735e0 188 return v;
kangulu 0:1f10f1e735e0 189 }
kangulu 0:1f10f1e735e0 190 else
kangulu 0:1f10f1e735e0 191 {
kangulu 0:1f10f1e735e0 192 return h;
kangulu 0:1f10f1e735e0 193 }
kangulu 0:1f10f1e735e0 194 }
kangulu 0:1f10f1e735e0 195
kangulu 0:1f10f1e735e0 196 void display(position pos, double vx, double vy, worldmap map)
kangulu 0:1f10f1e735e0 197 {
kangulu 0:1f10f1e735e0 198 active_layer = (active_layer+1)%2;
kangulu 0:1f10f1e735e0 199 BSP_LCD_SelectLayer(active_layer);
kangulu 0:1f10f1e735e0 200 int hauteur;
kangulu 0:1f10f1e735e0 201 dist_and_color dc;
kangulu 0:1f10f1e735e0 202 rotation(&vx,&vy, M_PI/6);
kangulu 0:1f10f1e735e0 203 for(int i=0;i<SCREEN_WIDTH;i++)
kangulu 0:1f10f1e735e0 204 {
kangulu 0:1f10f1e735e0 205 dc = dda(pos,vx,vy,map);
kangulu 0:1f10f1e735e0 206 hauteur = (int)WALL_SIZE*SCREEN_HEIGHT/dc.distance;
kangulu 0:1f10f1e735e0 207 hauteur = hauteur/fabs(cos((30-60*i/SCREEN_WIDTH)*2*M_PI/360));
kangulu 0:1f10f1e735e0 208
kangulu 0:1f10f1e735e0 209 if(hauteur>SCREEN_HEIGHT)
kangulu 0:1f10f1e735e0 210 {
kangulu 0:1f10f1e735e0 211 hauteur = SCREEN_HEIGHT;
kangulu 0:1f10f1e735e0 212 }
kangulu 0:1f10f1e735e0 213 draw_seg_v(i,(SCREEN_HEIGHT-hauteur)/2,(hauteur+SCREEN_HEIGHT)/2,dc.color);
kangulu 0:1f10f1e735e0 214 rotation(&vx,&vy,2*M_PI-M_PI/3/SCREEN_WIDTH);
kangulu 0:1f10f1e735e0 215 }
kangulu 0:1f10f1e735e0 216 BSP_LCD_SetLayerVisible((active_layer+1)%2, DISABLE);
kangulu 0:1f10f1e735e0 217
kangulu 0:1f10f1e735e0 218 BSP_LCD_SetLayerVisible(active_layer, ENABLE);
kangulu 0:1f10f1e735e0 219 }
kangulu 0:1f10f1e735e0 220
kangulu 0:1f10f1e735e0 221 int getInputState(inputState *iS)
kangulu 0:1f10f1e735e0 222 {
kangulu 0:1f10f1e735e0 223 TS_StateTypeDef TS_State;
kangulu 0:1f10f1e735e0 224 BSP_TS_GetState(&TS_State);
kangulu 0:1f10f1e735e0 225 if (TS_State.touchDetected==1) {
kangulu 0:1f10f1e735e0 226 iS->x =TS_State.touchX[0];
kangulu 0:1f10f1e735e0 227 iS->y =TS_State.touchY[0];
kangulu 0:1f10f1e735e0 228 return 1;
kangulu 0:1f10f1e735e0 229 }
kangulu 0:1f10f1e735e0 230 return 0;
kangulu 0:1f10f1e735e0 231 }
kangulu 0:1f10f1e735e0 232
kangulu 0:1f10f1e735e0 233 //
kangulu 0:1f10f1e735e0 234 //Generation du labyrinhe
kangulu 0:1f10f1e735e0 235 //
kangulu 0:1f10f1e735e0 236 //
kangulu 0:1f10f1e735e0 237
kangulu 0:1f10f1e735e0 238 void createMap(minimap mini, worldmap world)
kangulu 0:1f10f1e735e0 239 {
kangulu 0:1f10f1e735e0 240 int i = 0;
kangulu 0:1f10f1e735e0 241 int j = 0;
kangulu 0:1f10f1e735e0 242 int k = 0;
kangulu 0:1f10f1e735e0 243 int memPosition = 0;
kangulu 0:1f10f1e735e0 244 int memi[LONGUEUR*LARGEUR]; //memoire de la coordonnee i
kangulu 0:1f10f1e735e0 245 int memj[LONGUEUR*LARGEUR]; //memoire de la coordonnee j
kangulu 0:1f10f1e735e0 246 int memalea[4] = {0,0,0,0}; //memoire des alea non utilisable
kangulu 0:1f10f1e735e0 247
kangulu 0:1f10f1e735e0 248 float alea = 0;
kangulu 0:1f10f1e735e0 249 int aleaInt = 0;
kangulu 0:1f10f1e735e0 250
kangulu 0:1f10f1e735e0 251 int verif = -1;
kangulu 0:1f10f1e735e0 252
kangulu 0:1f10f1e735e0 253 //creation du labyrinthe mini de facon aleatoire
kangulu 0:1f10f1e735e0 254
kangulu 0:1f10f1e735e0 255 for(i=0;i<LARGEUR;i++)
kangulu 0:1f10f1e735e0 256 {
kangulu 0:1f10f1e735e0 257 for(j=0;j<LONGUEUR;j++)
kangulu 0:1f10f1e735e0 258 {
kangulu 0:1f10f1e735e0 259 mini[i][j] = 15;
kangulu 0:1f10f1e735e0 260 }
kangulu 0:1f10f1e735e0 261 }
kangulu 0:1f10f1e735e0 262
kangulu 0:1f10f1e735e0 263 int compteur = 0; //compteur pour savoir le nombre de cases que nous avons fait
kangulu 0:1f10f1e735e0 264 do
kangulu 0:1f10f1e735e0 265 {
kangulu 0:1f10f1e735e0 266 i = rand()%LONGUEUR;
kangulu 0:1f10f1e735e0 267 j = rand()%LARGEUR;
kangulu 0:1f10f1e735e0 268 alea = rand()%4;
kangulu 0:1f10f1e735e0 269 if((alea == 0 & j == 0) |
kangulu 0:1f10f1e735e0 270 (alea == 1 & i == LONGUEUR - 1) |
kangulu 0:1f10f1e735e0 271 (alea == 2 & j == LARGEUR - 1) |
kangulu 0:1f10f1e735e0 272 (alea == 3 & i == 0))
kangulu 0:1f10f1e735e0 273 {
kangulu 0:1f10f1e735e0 274 verif = -1;
kangulu 0:1f10f1e735e0 275 }
kangulu 0:1f10f1e735e0 276 else
kangulu 0:1f10f1e735e0 277 {
kangulu 0:1f10f1e735e0 278 verif = 0;
kangulu 0:1f10f1e735e0 279 }
kangulu 0:1f10f1e735e0 280
kangulu 0:1f10f1e735e0 281 }while(verif == -1);
kangulu 0:1f10f1e735e0 282
kangulu 0:1f10f1e735e0 283 memi[memPosition] = i;
kangulu 0:1f10f1e735e0 284 memj[memPosition] = j;
kangulu 0:1f10f1e735e0 285
kangulu 0:1f10f1e735e0 286 mini[i][j] += 16; //bit de verif de la case mis à 1
kangulu 0:1f10f1e735e0 287
kangulu 0:1f10f1e735e0 288 mini[i][j] -= pow(2, alea); //ouverture d'un des murs
kangulu 0:1f10f1e735e0 289
kangulu 0:1f10f1e735e0 290 memPosition += 1;
kangulu 0:1f10f1e735e0 291 compteur += 1;
kangulu 0:1f10f1e735e0 292
kangulu 0:1f10f1e735e0 293 aleaInt = alea;
kangulu 0:1f10f1e735e0 294 switch(aleaInt)
kangulu 0:1f10f1e735e0 295 {
kangulu 0:1f10f1e735e0 296 case 0:
kangulu 0:1f10f1e735e0 297 j--;
kangulu 0:1f10f1e735e0 298 alea = 2;
kangulu 0:1f10f1e735e0 299 aleaInt = 2;
kangulu 0:1f10f1e735e0 300 break;
kangulu 0:1f10f1e735e0 301 case 1:
kangulu 0:1f10f1e735e0 302 i++;
kangulu 0:1f10f1e735e0 303 alea = 3;
kangulu 0:1f10f1e735e0 304 aleaInt = 3;
kangulu 0:1f10f1e735e0 305 break;
kangulu 0:1f10f1e735e0 306 case 2:
kangulu 0:1f10f1e735e0 307 j++;
kangulu 0:1f10f1e735e0 308 alea = 0;
kangulu 0:1f10f1e735e0 309 aleaInt = 0;
kangulu 0:1f10f1e735e0 310 break;
kangulu 0:1f10f1e735e0 311 case 3:
kangulu 0:1f10f1e735e0 312 i--;
kangulu 0:1f10f1e735e0 313 alea = 1;
kangulu 0:1f10f1e735e0 314 aleaInt = 1;
kangulu 0:1f10f1e735e0 315 break;
kangulu 0:1f10f1e735e0 316 default:
kangulu 0:1f10f1e735e0 317 break;
kangulu 0:1f10f1e735e0 318 }
kangulu 0:1f10f1e735e0 319
kangulu 0:1f10f1e735e0 320 mini[i][j] -= pow(2, alea); //ouverture de l'autre partie du mur
kangulu 0:1f10f1e735e0 321 mini[i][j] += 16; //bit de verif de la case mis à 1
kangulu 0:1f10f1e735e0 322 memalea[aleaInt] = 1;
kangulu 0:1f10f1e735e0 323
kangulu 0:1f10f1e735e0 324 memi[memPosition] = i;
kangulu 0:1f10f1e735e0 325 memj[memPosition] = j;
kangulu 0:1f10f1e735e0 326 memPosition += 1;
kangulu 0:1f10f1e735e0 327 compteur += 1;
kangulu 0:1f10f1e735e0 328
kangulu 0:1f10f1e735e0 329 do
kangulu 0:1f10f1e735e0 330 {
kangulu 0:1f10f1e735e0 331 //do while pour savoir quel mur ouvrir
kangulu 0:1f10f1e735e0 332 do
kangulu 0:1f10f1e735e0 333 {
kangulu 0:1f10f1e735e0 334 alea = rand()%4;
kangulu 0:1f10f1e735e0 335 aleaInt = alea;
kangulu 0:1f10f1e735e0 336 switch(aleaInt)
kangulu 0:1f10f1e735e0 337 {
kangulu 0:1f10f1e735e0 338 case 0:
kangulu 0:1f10f1e735e0 339 if(j == 0)
kangulu 0:1f10f1e735e0 340 {
kangulu 0:1f10f1e735e0 341 memalea[aleaInt] = 1;
kangulu 0:1f10f1e735e0 342 }
kangulu 0:1f10f1e735e0 343 else
kangulu 0:1f10f1e735e0 344 {
kangulu 0:1f10f1e735e0 345 if(mini[i][j-1] >= 16)
kangulu 0:1f10f1e735e0 346 {memalea[aleaInt] = 1;}
kangulu 0:1f10f1e735e0 347 }
kangulu 0:1f10f1e735e0 348 break;
kangulu 0:1f10f1e735e0 349
kangulu 0:1f10f1e735e0 350 case 1:
kangulu 0:1f10f1e735e0 351 if(i == LONGUEUR-1)
kangulu 0:1f10f1e735e0 352 {
kangulu 0:1f10f1e735e0 353 memalea[aleaInt] = 1;
kangulu 0:1f10f1e735e0 354 }
kangulu 0:1f10f1e735e0 355 else
kangulu 0:1f10f1e735e0 356 {
kangulu 0:1f10f1e735e0 357 if(mini[i+1][j] >= 16)
kangulu 0:1f10f1e735e0 358 {memalea[aleaInt] = 1;}
kangulu 0:1f10f1e735e0 359 }
kangulu 0:1f10f1e735e0 360 break;
kangulu 0:1f10f1e735e0 361
kangulu 0:1f10f1e735e0 362 case 2:
kangulu 0:1f10f1e735e0 363 if(j == LARGEUR-1)
kangulu 0:1f10f1e735e0 364 {
kangulu 0:1f10f1e735e0 365 memalea[aleaInt] = 1;
kangulu 0:1f10f1e735e0 366 }
kangulu 0:1f10f1e735e0 367 else
kangulu 0:1f10f1e735e0 368 {
kangulu 0:1f10f1e735e0 369 if(mini[i][j+1] >= 16)
kangulu 0:1f10f1e735e0 370 {memalea[aleaInt] = 1;}
kangulu 0:1f10f1e735e0 371 }
kangulu 0:1f10f1e735e0 372 break;
kangulu 0:1f10f1e735e0 373
kangulu 0:1f10f1e735e0 374 case 3:
kangulu 0:1f10f1e735e0 375 if(i == 0)
kangulu 0:1f10f1e735e0 376 {
kangulu 0:1f10f1e735e0 377 memalea[aleaInt] = 1;
kangulu 0:1f10f1e735e0 378 }
kangulu 0:1f10f1e735e0 379 else
kangulu 0:1f10f1e735e0 380 {
kangulu 0:1f10f1e735e0 381 if(mini[i-1][j] >= 16)
kangulu 0:1f10f1e735e0 382 {memalea[aleaInt] = 1;}
kangulu 0:1f10f1e735e0 383 }
kangulu 0:1f10f1e735e0 384 break;
kangulu 0:1f10f1e735e0 385 }
kangulu 0:1f10f1e735e0 386
kangulu 0:1f10f1e735e0 387 if(memalea[aleaInt] == 1)
kangulu 0:1f10f1e735e0 388 {
kangulu 0:1f10f1e735e0 389 if(memalea[0] == 1 &
kangulu 0:1f10f1e735e0 390 memalea[1] == 1 &
kangulu 0:1f10f1e735e0 391 memalea[2] == 1 &
kangulu 0:1f10f1e735e0 392 memalea[3] == 1)
kangulu 0:1f10f1e735e0 393 {
kangulu 0:1f10f1e735e0 394 verif = 2;
kangulu 0:1f10f1e735e0 395 }
kangulu 0:1f10f1e735e0 396 else
kangulu 0:1f10f1e735e0 397 {
kangulu 0:1f10f1e735e0 398 verif = 0;
kangulu 0:1f10f1e735e0 399 }
kangulu 0:1f10f1e735e0 400 }
kangulu 0:1f10f1e735e0 401 else
kangulu 0:1f10f1e735e0 402 {
kangulu 0:1f10f1e735e0 403 verif = 1;
kangulu 0:1f10f1e735e0 404 }
kangulu 0:1f10f1e735e0 405 }while(verif == 0);
kangulu 0:1f10f1e735e0 406
kangulu 0:1f10f1e735e0 407 for(k=0;k<4;k++)
kangulu 0:1f10f1e735e0 408 { memalea[k] = 0; }
kangulu 0:1f10f1e735e0 409
kangulu 0:1f10f1e735e0 410 switch(verif)
kangulu 0:1f10f1e735e0 411 {
kangulu 0:1f10f1e735e0 412 case 1:
kangulu 0:1f10f1e735e0 413
kangulu 0:1f10f1e735e0 414 mini[i][j] -= pow(2, alea); //ouverture d'un des murs
kangulu 0:1f10f1e735e0 415 switch(aleaInt)
kangulu 0:1f10f1e735e0 416 {
kangulu 0:1f10f1e735e0 417 case 0:
kangulu 0:1f10f1e735e0 418 j--;
kangulu 0:1f10f1e735e0 419 alea = 2;
kangulu 0:1f10f1e735e0 420 aleaInt = 2;
kangulu 0:1f10f1e735e0 421 break;
kangulu 0:1f10f1e735e0 422 case 1:
kangulu 0:1f10f1e735e0 423 i++;
kangulu 0:1f10f1e735e0 424 alea = 3;
kangulu 0:1f10f1e735e0 425 aleaInt = 3;
kangulu 0:1f10f1e735e0 426 break;
kangulu 0:1f10f1e735e0 427 case 2:
kangulu 0:1f10f1e735e0 428 j++;
kangulu 0:1f10f1e735e0 429 alea = 0;
kangulu 0:1f10f1e735e0 430 aleaInt = 0;
kangulu 0:1f10f1e735e0 431 break;
kangulu 0:1f10f1e735e0 432 case 3:
kangulu 0:1f10f1e735e0 433 i--;
kangulu 0:1f10f1e735e0 434 alea = 1;
kangulu 0:1f10f1e735e0 435 aleaInt = 1;
kangulu 0:1f10f1e735e0 436 break;
kangulu 0:1f10f1e735e0 437 default:
kangulu 0:1f10f1e735e0 438 break;
kangulu 0:1f10f1e735e0 439 }
kangulu 0:1f10f1e735e0 440
kangulu 0:1f10f1e735e0 441 mini[i][j] -= pow(2, alea); //ouverture de l'autre partie du mur
kangulu 0:1f10f1e735e0 442 mini[i][j] += 16; //bit de verif de la case mis à 1
kangulu 0:1f10f1e735e0 443 memalea[aleaInt] = 1;
kangulu 0:1f10f1e735e0 444 memi[memPosition] = i;
kangulu 0:1f10f1e735e0 445 memj[memPosition] = j;
kangulu 0:1f10f1e735e0 446 memPosition += 1;
kangulu 0:1f10f1e735e0 447 compteur += 1;
kangulu 0:1f10f1e735e0 448 break;
kangulu 0:1f10f1e735e0 449
kangulu 0:1f10f1e735e0 450 case 2:
kangulu 0:1f10f1e735e0 451 memPosition -= 1;
kangulu 0:1f10f1e735e0 452 i = memi[memPosition];
kangulu 0:1f10f1e735e0 453 j = memj[memPosition];
kangulu 0:1f10f1e735e0 454 break;
kangulu 0:1f10f1e735e0 455 }
kangulu 0:1f10f1e735e0 456 }
kangulu 0:1f10f1e735e0 457 while(compteur < LONGUEUR*LARGEUR);
kangulu 0:1f10f1e735e0 458
kangulu 0:1f10f1e735e0 459 //remplissage de world a partir de mini
kangulu 0:1f10f1e735e0 460 for(i=0;i<MAP_HEIGHT;i++)
kangulu 0:1f10f1e735e0 461 {
kangulu 0:1f10f1e735e0 462 for(j=0;j<MAP_WIDTH;j++)
kangulu 0:1f10f1e735e0 463 {
kangulu 0:1f10f1e735e0 464 if(i == 0 || i == MAP_HEIGHT - 1 || j == 0 || j == MAP_HEIGHT - 1)
kangulu 0:1f10f1e735e0 465 {
kangulu 0:1f10f1e735e0 466 world[i][j] = 2;
kangulu 0:1f10f1e735e0 467 }
kangulu 0:1f10f1e735e0 468 else if((i%3 == 2 || i%3 == 0) && (j%3 == 2 || j%3 == 0))
kangulu 0:1f10f1e735e0 469 {
kangulu 0:1f10f1e735e0 470 world[i][j] = 2;
kangulu 0:1f10f1e735e0 471 }
kangulu 0:1f10f1e735e0 472 else
kangulu 0:1f10f1e735e0 473 {
kangulu 0:1f10f1e735e0 474 world[i][j] = 0;
kangulu 0:1f10f1e735e0 475 }
kangulu 0:1f10f1e735e0 476 }
kangulu 0:1f10f1e735e0 477
kangulu 0:1f10f1e735e0 478 }
kangulu 0:1f10f1e735e0 479
kangulu 0:1f10f1e735e0 480 for(i=0;i<LARGEUR;i++)
kangulu 0:1f10f1e735e0 481 {
kangulu 0:1f10f1e735e0 482 for(j=0;j<LONGUEUR;j++)
kangulu 0:1f10f1e735e0 483 {
kangulu 0:1f10f1e735e0 484 verif = mini[i][j] & 0x1; //1er bit soit mur de gauche
kangulu 0:1f10f1e735e0 485 if(verif == 0x1)
kangulu 0:1f10f1e735e0 486 {
kangulu 0:1f10f1e735e0 487 world[3*i + 1][3*j] = 2;
kangulu 0:1f10f1e735e0 488 }
kangulu 0:1f10f1e735e0 489
kangulu 0:1f10f1e735e0 490 verif = mini[i][j] & 0x2; //2eme bit soit mur du bas
kangulu 0:1f10f1e735e0 491 if(verif == 0x2)
kangulu 0:1f10f1e735e0 492 {
kangulu 0:1f10f1e735e0 493 world[3*i + 2][3*j + 1] = 2;
kangulu 0:1f10f1e735e0 494 }
kangulu 0:1f10f1e735e0 495
kangulu 0:1f10f1e735e0 496 verif = mini[i][j] & 0x4; //3eme bit soit mur de droite
kangulu 0:1f10f1e735e0 497 if(verif == 0x4)
kangulu 0:1f10f1e735e0 498 {
kangulu 0:1f10f1e735e0 499 world[3*i + 1][3*j + 2] = 2;
kangulu 0:1f10f1e735e0 500 }
kangulu 0:1f10f1e735e0 501
kangulu 0:1f10f1e735e0 502 verif = mini[i][j] & 0x8; //4eme bit soit mur du haut
kangulu 0:1f10f1e735e0 503 if(verif == 0x8)
kangulu 0:1f10f1e735e0 504 {
kangulu 0:1f10f1e735e0 505 world[3*i][3*j + 1] = 2;
kangulu 0:1f10f1e735e0 506 }
kangulu 0:1f10f1e735e0 507 }
kangulu 0:1f10f1e735e0 508 }
kangulu 0:1f10f1e735e0 509 }
kangulu 0:1f10f1e735e0 510
kangulu 0:1f10f1e735e0 511 void gerenatePosition(int* i_pt, int* j_pt, worldmap world)
kangulu 0:1f10f1e735e0 512 {
kangulu 0:1f10f1e735e0 513 int i, j;
kangulu 0:1f10f1e735e0 514 int verif = 0;
kangulu 0:1f10f1e735e0 515 do
kangulu 0:1f10f1e735e0 516 {
kangulu 0:1f10f1e735e0 517 i = rand()%MAP_WIDTH;
kangulu 0:1f10f1e735e0 518 j = rand()%MAP_HEIGHT;
kangulu 0:1f10f1e735e0 519 if(i == 0)
kangulu 0:1f10f1e735e0 520 {
kangulu 0:1f10f1e735e0 521 if(world[i + 1][j] == 0)
kangulu 0:1f10f1e735e0 522 {
kangulu 0:1f10f1e735e0 523 i ++;
kangulu 0:1f10f1e735e0 524 verif = 1;
kangulu 0:1f10f1e735e0 525 }
kangulu 0:1f10f1e735e0 526 else
kangulu 0:1f10f1e735e0 527 {
kangulu 0:1f10f1e735e0 528 verif = 0;
kangulu 0:1f10f1e735e0 529 }
kangulu 0:1f10f1e735e0 530 }
kangulu 0:1f10f1e735e0 531 else if(j == 0)
kangulu 0:1f10f1e735e0 532 {
kangulu 0:1f10f1e735e0 533 if(world[i][j + 1] == 0)
kangulu 0:1f10f1e735e0 534 {
kangulu 0:1f10f1e735e0 535 j++;
kangulu 0:1f10f1e735e0 536 verif = 1;
kangulu 0:1f10f1e735e0 537 }
kangulu 0:1f10f1e735e0 538 else
kangulu 0:1f10f1e735e0 539 {
kangulu 0:1f10f1e735e0 540 verif = 0;
kangulu 0:1f10f1e735e0 541 }
kangulu 0:1f10f1e735e0 542 }
kangulu 0:1f10f1e735e0 543 else
kangulu 0:1f10f1e735e0 544 {
kangulu 0:1f10f1e735e0 545 verif = 0;
kangulu 0:1f10f1e735e0 546 }
kangulu 0:1f10f1e735e0 547 }while(verif != 1);
kangulu 0:1f10f1e735e0 548
kangulu 0:1f10f1e735e0 549 *i_pt = i;
kangulu 0:1f10f1e735e0 550 *j_pt = j;
kangulu 0:1f10f1e735e0 551 }
kangulu 0:1f10f1e735e0 552
kangulu 0:1f10f1e735e0 553 void generateSortie(int i, int j, worldmap world)
kangulu 0:1f10f1e735e0 554 {
kangulu 0:1f10f1e735e0 555 int i2 = 0;
kangulu 0:1f10f1e735e0 556 int j2 = 0;
kangulu 0:1f10f1e735e0 557 if(i == 1)
kangulu 0:1f10f1e735e0 558 {
kangulu 0:1f10f1e735e0 559 i2 = MAP_WIDTH - 1;
kangulu 0:1f10f1e735e0 560 if(j <= MAP_HEIGHT/2)
kangulu 0:1f10f1e735e0 561 {
kangulu 0:1f10f1e735e0 562 j2 = j + MAP_HEIGHT/2;
kangulu 0:1f10f1e735e0 563 while(world[i2 - 1][j2] != 0)
kangulu 0:1f10f1e735e0 564 {
kangulu 0:1f10f1e735e0 565 j2--;
kangulu 0:1f10f1e735e0 566 }
kangulu 0:1f10f1e735e0 567 world[i2][j2] = 1;
kangulu 0:1f10f1e735e0 568 }
kangulu 0:1f10f1e735e0 569 else if(j >= MAP_HEIGHT/2)
kangulu 0:1f10f1e735e0 570 {
kangulu 0:1f10f1e735e0 571 j2 = j - MAP_HEIGHT/2;
kangulu 0:1f10f1e735e0 572 while(world[i2 - 1][j2] != 0)
kangulu 0:1f10f1e735e0 573 {
kangulu 0:1f10f1e735e0 574 j2++;
kangulu 0:1f10f1e735e0 575 }
kangulu 0:1f10f1e735e0 576 world[i2][j2] = 1;
kangulu 0:1f10f1e735e0 577 }
kangulu 0:1f10f1e735e0 578 else
kangulu 0:1f10f1e735e0 579 {
kangulu 0:1f10f1e735e0 580 j2 = j;
kangulu 0:1f10f1e735e0 581 while(world[i2 - 1][j2] != 0)
kangulu 0:1f10f1e735e0 582 {
kangulu 0:1f10f1e735e0 583 j2++;
kangulu 0:1f10f1e735e0 584 }
kangulu 0:1f10f1e735e0 585 world[i2][j2] = 1;
kangulu 0:1f10f1e735e0 586 }
kangulu 0:1f10f1e735e0 587 }
kangulu 0:1f10f1e735e0 588 else if(j == 1)
kangulu 0:1f10f1e735e0 589 {
kangulu 0:1f10f1e735e0 590 j2 = MAP_HEIGHT - 1;
kangulu 0:1f10f1e735e0 591 if(i <= MAP_WIDTH/2)
kangulu 0:1f10f1e735e0 592 {
kangulu 0:1f10f1e735e0 593 i2 = i + MAP_WIDTH/2;
kangulu 0:1f10f1e735e0 594 while(world[i2][j2 - 1] != 0)
kangulu 0:1f10f1e735e0 595 {
kangulu 0:1f10f1e735e0 596 i2--;
kangulu 0:1f10f1e735e0 597 }
kangulu 0:1f10f1e735e0 598 world[i2][j2] = 1;
kangulu 0:1f10f1e735e0 599 }
kangulu 0:1f10f1e735e0 600 else if(i >= MAP_WIDTH/2)
kangulu 0:1f10f1e735e0 601 {
kangulu 0:1f10f1e735e0 602 i2 = i - MAP_WIDTH/2;
kangulu 0:1f10f1e735e0 603 while(world[i2][j2 - 1] != 0)
kangulu 0:1f10f1e735e0 604 {
kangulu 0:1f10f1e735e0 605 i2++;
kangulu 0:1f10f1e735e0 606 }
kangulu 0:1f10f1e735e0 607 world[i2][j2] = 1;
kangulu 0:1f10f1e735e0 608 }
kangulu 0:1f10f1e735e0 609 else
kangulu 0:1f10f1e735e0 610 {
kangulu 0:1f10f1e735e0 611 i2 = i;
kangulu 0:1f10f1e735e0 612 while(world[i2][j2 - 1] != 0)
kangulu 0:1f10f1e735e0 613 {
kangulu 0:1f10f1e735e0 614 i2++;
kangulu 0:1f10f1e735e0 615 }
kangulu 0:1f10f1e735e0 616 world[i2][j2] = 1;
kangulu 0:1f10f1e735e0 617 }
kangulu 0:1f10f1e735e0 618 }
kangulu 0:1f10f1e735e0 619 }
kangulu 0:1f10f1e735e0 620
kangulu 0:1f10f1e735e0 621 int verificationFin(position pos, worldmap world)
kangulu 0:1f10f1e735e0 622 {
kangulu 0:1f10f1e735e0 623 int retour = 0;
kangulu 0:1f10f1e735e0 624 int i = 0;
kangulu 0:1f10f1e735e0 625 int j = 0;
kangulu 0:1f10f1e735e0 626 int k = 0;
kangulu 0:1f10f1e735e0 627 for (k = 0; k<MAP_WIDTH; k++)
kangulu 0:1f10f1e735e0 628 {
kangulu 0:1f10f1e735e0 629 if(pos.x/64>=k && pos.x/64<k + 1)
kangulu 0:1f10f1e735e0 630 {
kangulu 0:1f10f1e735e0 631 i = k;
kangulu 0:1f10f1e735e0 632 }
kangulu 0:1f10f1e735e0 633 }
kangulu 0:1f10f1e735e0 634
kangulu 0:1f10f1e735e0 635 for (k = 0; k<MAP_HEIGHT; k++)
kangulu 0:1f10f1e735e0 636 {
kangulu 0:1f10f1e735e0 637 if(pos.y/64>=k && pos.y/64<k + 1)
kangulu 0:1f10f1e735e0 638 {
kangulu 0:1f10f1e735e0 639 j = k;
kangulu 0:1f10f1e735e0 640 }
kangulu 0:1f10f1e735e0 641 }
kangulu 0:1f10f1e735e0 642
kangulu 0:1f10f1e735e0 643 if(world[i][j] == 1)
kangulu 0:1f10f1e735e0 644 {
kangulu 0:1f10f1e735e0 645 retour = 1;
kangulu 0:1f10f1e735e0 646 }
kangulu 0:1f10f1e735e0 647 return retour;
kangulu 0:1f10f1e735e0 648 }