Non riesco a copiare il contenuto della matrice "campo" su una matrice sulla quale far funzionare la funzione di controllo. Non so perchè, eppure mi sembra tutto giusto....
Non devi copiare niente!
Devi solo settarla a zero,la matrice che ho chiamato walker è una matrice di sicurezza che memorizza i passi fatti precedentemente in modo da non rifarli.Questo serve per evitare loop infiniti.
Comunque la mia idea è quella (almeno per il giocatore "X", per l'altro andrà invertita) di cercare nella prima riga della matrice. Appena vede una pedina fa tutto il controllo, quindi verifica se vi sia un percorso. Se non vi è un percorso finisce la ricerca nella riga, aumentando di volta in volta la colonna. Appena trova un'altra pedina rifà tutto il controllo.
Non è proprio un'idea ottima,anche se ti sembra di semplificare il progetto in realtà lo complichi inutilmente.
PS: per escludere la pedina precedente durante il controllo l'unica idea che mi sia venuta è quella di trasformarla in un carattere diverso rispetto a quello della pedina!
E come fai a tornare indietro?
Avresti dovuto modificare il codice che ti ho postato,dato che è già un'ottima soluzione,forse non la piu efficiente ma almeno funzionale.
void controlla_vittoria (int* upck,int* dwck,int r, int c,char walk [][SIZE])
{
if (campo[r][c] != 'X') return;
if (walk[r][c]) return;
walk[r][c] = 1;
if (c + 1 < SIZE - 1 && campo[r][c + 1] == 'X')
controlla_vittoria(upck,dwck,r,c + 1,walk);
if (c > 0 && campo[r][c - 1] == 'X')
controlla_vittoria(upck,dwck,r,c - 1,walk);
if (r + 1 < SIZE - 1 && campo[r + 1][c] == 'X')
controlla_vittoria(upck,dwck,r + 1,c,walk);
if (r - 1 > 0 && campo[r - 1][c] == 'X')
controlla_vittoria(upck,dwck,r + 1,c,walk);
if ( r == 0)
*upck = 1;
else if ( r == SIZE - 1)
*dwck = 1;
}
//nella funzione che posiziona la pedina,dopo aver creato anche la riga di collegamento devi aggiungere
...
...
...
char w[SIZE][SIZE];
int ir,ix;
//azzero walker
for (ir = 0 ; ir < SIZE ; ir++ )
for (ix = 0 ; ix < SIZE ; ix++ )
w[ir][ix] = 0;
//controlli raggiungimento bordi
int ckup,ckdw;
//r,c sono l'esatta posizione della pedina che ha posizionato il player
controlla_vittoria(&ckup,&ckdw,r,c,w);
if (ckup && ckdw)
scatena_vittoria();
Come vedi usando questa tecnica il codice rimane semplice e pulito.
L'unica cosa da controllare che non ho capito è che realmente la riga di vittoria sia la 0,e SIZE-1, altrimenti dovrai modificarlo in base alle tue esigenze.
Prima di fare un cut/paste inutile, prova a comprendere come funziona e se non sono riuscito a spiegarmi in qualche parte chiedi pure.