Création d'un rond-point en C / problème voitures
Bonsoir à tous
J'ai un projet consistant comme vous avez pu le voir dans le titre à créer un rond-point et faire circuler aléatoirement des voitures dedans. Mon rond point a quatre portions de route (Nord, sud, Est, Ouest) et chaque voiture qui vient d'une telle portion doit rejoindre une sortie selon l'indication de la voiture (par exemple si une voiture 'S' vient du Nord, elle doit parcourir le rond point et prendre la sortie sud). Il faut bien sûr que plusieurs voitures circulent dans ce rond point et c'est là où je bloque.
Je vous envoie mon code, mais je vais vous préciser ensuite sur quelle partie de celui-ci je bloque.
Mon code en entier:
Code:
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 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342
| #include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "time.h"
#define clear() printf("\033[H\033[2J")
typedef struct route ROUTE;
struct route{
int signe;
char voiture;
int itineraire;
};
ROUTE matrice[32][98];
void affichage() {
int i = 0;
int j = 0;
for (i = 0; i < 11; i++) { //Construction de la première partie du carrefour (celle du haut)
for (j = 0; j < 98; j++) { //98 colonnes
if (i < 8) { //Interessons nous à la route verticale en haut
if ((j == 46) || (j == 50)) { //Les séparations de la route entre les 2 voies (NORD)
matrice[i][j].signe = 9; //printf ("¦");
}
else if ((j == 44) || (j == 48) || (j == 52)) {
matrice[i][j].signe = 1; //printf ("║"); //Les bords de la route (NORD)
}
}
else if (i == 8) { //Intersection de la route NORD et le centre
if (j == 48) {
matrice[i][j].signe = 1; //printf ("║");
}
else if (j == 52) {
matrice[i][j].signe = 3; //printf ("╚");
}
else if (j == 44) {
matrice[i][j].signe = 4; //printf ("╝");
}
else if ((j > 31 && j < 44) || (j > 52 && j < 65)) {
matrice[i][j].signe = 5; //printf ("═");
}
else if (j == 31) {
matrice[i][j].signe = 6; //printf ("╔");
}
else if (j == 65) {
matrice[i][j].signe = 7; //printf ("╗");
}
}
else if (i >= 8) {
if (j == 31 || j == 65) {
matrice[i][j].signe = 1; //printf ("║");
}
}
}
// printf ("\n");
}
for (i = 11; i < 20; i++) { //Occupons nous de des 2 routes horizontales (Ouest et Est)
for (j = 0; j < 98; j++) {
if (j <= 31 || j >= 65) { //Parties Ouest et Est où la route est présente
if (i == 11) {
if (j == 31) {
matrice[i][j].signe = 4; //printf ("╝");
}
else if (j == 65) {
matrice[i][j].signe = 3; //printf ("╚");
}
else{
matrice[i][j].signe = 5; //printf ("═");
}
}
else if (i == 13 || i == 17) {
matrice[i][j].signe = 8; //printf ("-");
}
else if (i == 15) {
matrice[i][j].signe = 5; //printf ("═");
}
else if (i == 19) {
if (j == 31) {
matrice[i][j].signe = 7; //printf ("╗");
}
else if (j == 65) {
matrice[i][j].signe = 6; //printf ("╔");
}
else{
matrice[i][j].signe = 5; //printf ("═");
}
}
}
else if (j > 39 && j < 57) {
if (i == 11 || i == 19) {
matrice[i][j].signe = 5; //printf ("═");
}
}
else if (j == 39) {
if (i == 11) {
matrice[i][j].signe = 6; //printf ("╔");
}
else if (i == 19) {
matrice[i][j].signe = 3; //printf ("╚");
}
else{
matrice[i][j].signe = 1; //printf ("║");
}
}
else if (j == 57) {
if (i == 11) {
matrice[i][j].signe = 7; //printf ("╗");
}
else if (i == 19) {
matrice[i][j].signe = 4; //printf ("╝");
}
else{
matrice[i][j].signe = 1; //printf ("║");
}
}
}
// printf ("\n");
}
for (i = 20; i < 31; i++) {
for (j = 0; j < 98; j++) {
if (i > 22) {
if ((j == 46) || (j == 50)) {
matrice[i][j].signe = 9; //printf ("¦");
}
else if ((j == 44) || (j == 48) || (j == 52)) {
matrice[i][j].signe = 1; //printf ("║");
}
}
else if (i == 22) {
if (j == 48) {
matrice[i][j].signe = 1; //printf ("║");
}
else if (j == 52) {
matrice[i][j].signe = 6; //printf ("╔");
}
else if (j == 44) {
matrice[i][j].signe = 7; //printf ("╗");
}
else if ((j > 31 && j < 44) || (j > 52 && j < 65)) {
matrice[i][j].signe = 5; //printf ("═");
}
else if (j == 31) {
matrice[i][j].signe = 3; //printf ("╚");
}
else if (j == 65) {
matrice[i][j].signe = 4; //printf ("╝");
}
}
else if (i <= 22) {
if (j == 31 || j == 65) {
matrice[i][j].signe = 1; //printf ("║");
}
}
}
// printf ("\n");
}
}
void affichage2() {
int i = 0;
int j = 0;
for (i = 0; i < 33; i++) {
for (j = 0; j < 98; j++) {
if (matrice[i][j].signe == 1) {
printf ("║");
}
else if (matrice[i][j].signe == 2) { //Les séparations de la route entre les 2 voies (NORD)
printf ("¦");
}
else if (matrice[i][j].signe == 3) {
printf ("╚");
}
else if (matrice[i][j].signe == 4) {
printf ("╝");
}
else if (matrice[i][j].signe == 5) {
printf ("═");
}
else if (matrice[i][j].signe == 6) {
printf ("╔");
}
else if (matrice[i][j].signe == 7) {
printf ("╗");
}
else if (matrice[i][j].signe == 8) {
printf ("-");
}
else if (matrice[i][j].signe == 9) {
printf ("¦");
}
else if (matrice[i][j].voiture) {
printf("%c",matrice[i][j].voiture);
}
else {
printf (" ");
}
}
printf ("\n");
}
}
char placerUneVoitureAuNord () {
char direction [] = {'N','S','E','O'};
srand(time(NULL));
matrice[0][45].voiture = direction[rand ()%4];
return (matrice[0][45].voiture);
}
void deplacementDuNordAuSud(int a, int b){
if (matrice[a][b].voiture == 'S') {
if (a < 9) {
matrice[a][b].voiture = 'S';
matrice[a][b].voiture = ' ';
matrice[a+1][b].voiture = 'S'; // Descendre
}
else if (a == 9) {
if (b > 38) {
matrice[a][b].voiture = 'S';
matrice[a][b].voiture = ' ';
matrice[a][b-1].voiture = 'S'; // Se déplacer sur la gauche
}
}
else if (a == 9 && b == 38) {
matrice[a][b].voiture = 'S';
matrice[a][b].voiture = ' ';
matrice[a+1][b].voiture = 'S';
}
}
}
void deplacementDuNordAEst(int a, int b){
if (matrice[a][b].voiture == 'E') {
if (a < 9) {
matrice[a][b].voiture = 'E';
matrice[a][b].voiture = ' ';
matrice[a+1][b].voiture = 'E';
}
else if (a == 9) {
if (b > 38) {
matrice[a][b].voiture = 'E';
matrice[a][b].voiture = ' ';
matrice[a][b-1].voiture = 'E';
}
}
else if (a == 9 && b == 38) {
matrice[a][b].voiture = 'E';
matrice[a][b].voiture = ' ';
matrice[a+1][b].voiture = 'E';
}
}
}
void deplacementDuNordAOuest(int a, int b){
if (matrice[a][b].voiture == 'O') {
if (a < 9) {
matrice[a][b].voiture = 'O';
matrice[a][b].voiture = ' ';
matrice[a+1][b].voiture = 'O';
}
else if (a == 9) {
if (b > 38) {
matrice[a][b].voiture = 'O';
matrice[a][b].voiture = ' ';
matrice[a][b-1].voiture = 'O';
}
}
}
}
void deplacementDuNordAuNord(int a, int b){
if (matrice[a][b].voiture == 'N') {
if (a < 9) {
matrice[a][b].voiture = 'N';
matrice[a][b].voiture = ' ';
matrice[a+1][b].voiture = 'N';
}
else if (a == 9) {
if (b > 38) {
matrice[a][b].voiture = 'N';
matrice[a][b].voiture = ' ';
matrice[a][b-1].voiture = 'N';
}
}
}
}
void toutDeplacement(){
int i = 0;
int j = 45;
affichage();
do{
placerUneVoitureAuNord();
for(i = 0; i < 9; i++){
deplacementDuNordAEst(i, j);
deplacementDuNordAOuest(i, j);
deplacementDuNordAuSud(i, j);
deplacementDuNordAuNord(i, j);
sleep(1);
affichage2();
}
for (j = 45; j > 36; j--){
deplacementDuNordAuSud(i, j);
sleep(1);
affichage2();
}
}while(1);
}
int main() {
toutDeplacement();
return 0;
} |
Voici la fonction pour créer une voiture et la placer sur une des 4 entrées du rond (pour l'instant je n'ai fait que la partie Nord)
Code:
1 2 3 4 5 6
| char placerUneVoitureAuNord () { //Je crée ma voiture, que je place sur le début d'une des portions de route (iciil s'agit de la route Nord)
char direction [] = {'N','S','E','O'}; //La voiture sera sélectionnée aléatoirement
srand(time(NULL)); //fonction aléatoire
matrice[0][45].voiture = direction[rand ()%4]; //Ma voiture se trouve donc à la première ligne et quarante-sixième colonne ce qui représente ici l'entrée de la partie Nord de mon rond point
return (matrice[0][45].voiture); //Je retourne ma voiture
} |
Voici un exemple de déplacement de voiture partant du nord:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| void deplacementDuNordAuSud(int a, int b){ //Cette fonction est responsable du déplacement des voitures en fonction de la direction qu'elles doivent prendre (ici il s'agit d'une voiture S, donc qui doit aller au Sud)
if (matrice[a][b].voiture == 'S') {
if (a < 9) {
matrice[a][b].voiture = 'S';
matrice[a][b].voiture = ' ';
matrice[a+1][b].voiture = 'S'; // Descendre
}
else if (a == 9) {
if (b > 38) {
matrice[a][b].voiture = 'S';
matrice[a][b].voiture = ' ';
matrice[a][b-1].voiture = 'S'; // Se déplacer sur la gauche
}
}
}
} |
Mais surtout voici la fonction censé animer le rond-point car elle a pour rôle de gérer tout les déplacements de voiture:
Code:
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
| void toutDeplacement(){ //Il s'agit de la fonction principale car elle est censé gérer tout les déplacements des voitures et donc animer le rond-point personne pour une durée infini
int i = 0;
int j = 45;
affichage(); //j'appelle ma première fonction affichage
do{ //Je créer une boucle infini car les voitures ciruleront indéfiniment jusqu'à ce que quelqu'un stoppe le programme
placerUneVoitureAuNord(); //J'appelle la fonction placerUneVoitureAuNord pour placer une première voiture
for(i = 0; i < 9; i++){ //Boucle pour parcourir la partie Nord (descendre)
deplacementDuNordAEst(i, j); //Tout les déplacements existants (pour l'instant, je n'ai fait que ceux de la partie Nord)
deplacementDuNordAOuest(i, j);
deplacementDuNordAuSud(i, j);
deplacementDuNordAuNord(i, j);
sleep(1);
affichage2();
}
for (j = 45; j > 36; j--){ //boucle pour se déplacer sur la gauche
deplacementDuNordAuSud(i, j);
sleep(1);
affichage2();
} //etc, etc ...)
}while(1);
} |
Mon problème et que je voudrais que plusieurs voitures circulent en même temps. Par exemple je voudrai qu'une voiture parte du Nord, puis dès qu'elle a fait 3 cases, une deuxième voiture lui emboite le pas, puis après avoir franchi une case, une troisième voiture suit, etc ...
Je pense qu'il s'agit de créer une autre boucle et de passer la fonction placerUneVoitureAuNord() correctement dans la fonction toutDeplacemenent, mais j'ai beau avoir cherché, je ne trouve pas la solution :'(. Si quelqu'un pouvait m'aider, j'en serait reconnaissant.
Merci d'avance