Togliendo di mezzo l'implementazione (no "pappa pronta", ho capito!), potresti provare a seguire una strada di questo tipo:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define W_AUTOPISTA 7
#define H_AUTOPISTA 7
#define Q_DIREZIONI 4
#define Q_AUTO 4
// per le coordinate
typedef struct {
int x;
int y;
} coo_t;
const char kEtVuota = '.'; // l'etichetta che indica una posizione vuota
const char kEtCollisione = 'X'; // l'etichetta che indica una collisione
// le etichette che indicano le quattro macchine
const char kEtAuto[Q_AUTO] = { 'A', 'B', 'C', 'D' };
// le coordinate iniziali delle quattro macchine
const coo_t kCooIniziali[Q_AUTO] = { {3,0}, {6,3}, {3,6}, {0,3} };
// le probabilita' dell'estrazione delle 4 direzioni, per le 4 macchine
const int kProbabilita[Q_AUTO][Q_DIREZIONI] = {
{ 30, 30, 30, 10 }, // macchina 1
{ 15, 40, 35, 10 }, // macchina 2
{ 5, 30, 45, 20 }, // macchina 3
{ 25, 20, 25, 30 } // macchina 4
};
char ap[H_AUTOPISTA][W_AUTOPISTA]; // la mappa dell'autopista
void inizializza( coo_t *coo ) {
// 1. inizializzo srand()
// 2. "azzero" la mappa dell'autopista ap con tutti '.'
// 3. piazzo le quattro lettere segnaposizione A,B,C e D nella mappa ap
// 4. imposto in coo le quattro macchina con le loro coordinate iniziali
}
void mostra_autopista( int collisione ) {
// 1. visualizzo in console il contenuto della mappa dell'autopista ap
// 2. se collisione e' diverso da zero, aggiungo il messaggio "Collisione!"
}
void estrai_movimento( coo_t *coo, const int prob[Q_DIREZIONI] ) {
// in un ciclo che termina solo con l'estrazione di un movimento valido
// 1. estraggo a sorte un numero a caso compreso tra 0 e 100
// 2. verifico in quale intervallo percentuale si trova il valore estratto
// 3. decido di conseguenza la direzione da prendere
// 4. controllo di non essere finito fuori dalla mappa ap
// 5. se sono finito fuori dalla mappa ap ripeto il ciclo "over and over"
}
int muovi( coo_t *coo ) {
// 1. chiamo estrai_movimento per farmi dire in coo dove devo andare
// 2. verifico se c'e' stata una collisione
// 3. in caso di collisione restituisco 1, altrimenti restituisco 0
}
void aggiorna_autopista( const coo_t *coo, int collisione ) {
// 1. "azzero" la mappa dell'autopista ap con tutti '.', per eliminare le
// vecchie posizioni delle macchine
// 2. colloco le etichette A,B,C e D nelle nuove posizioni delle macchine
// 3. se c'e' stata collisione, verifico dove e colloco il segnaposto 'X'
}
int main() {
coo_t coo[Q_AUTO];
int collisione;
inizializza( coo );
mostra_autopista(0);
system( "pause" ); // lo so... a tanti system() non piace
do {
system( "cls" ); // di nuovo system()! ;)
collisione = muovi( coo );
aggiorna_autopista( coo, collisione );
mostra_autopista( collisione );
system( "pause" ); // e ancora una volta...
} while( !collisione );
return 0;
}