PDA

Visualizza la versione completa : C controllare una riga


francesco1985
29-04-2012, 20:56
void controllariga()
{
int i,j,cont=0;
for(i=0;i<larghezza_colonne;i++)
{
for(j=0; j<altezza_righe;j++)
{
while(j<20)
{
if(mappa2[i][j])
cont++;
}
}

if(cont<20)
cont=0;
else if(cont==20)
mappa2[i][j]=mappa2[i-1][j];

}
}//fine controlla rigaCiao a tutti
ho scritto questa funzione che mi dice se in una riga sono presenti tutti 1, il problema è che non mi funziona, qualcuno mi sa dire il perchè. lo so che sto generalizzando tantissimo, ma almeno sintatticamente è corretta la mia funzione. grazie in anticipo :)

francesco1985
29-04-2012, 20:58
ah dimenticavo, nella funzione se trovo tutti 1 cancello la riga.

Who am I
29-04-2012, 21:30
cont va azzerato anche se è uguale a 20.
Per il resto non ho capito cosa significa per te "cancellare una riga", di che tipo è la matrice, ne cosa intendi per "non funziona".Spiega meglio.

francesco1985
29-04-2012, 21:42
ciao, praticamente se nella riga che sto controllando sono presenti tutti 1 la cancello.
sto facendo il gioco del tetris, la matrice è una mappa 10*20 int. quando lancio la funzione il programma si blocca, togliendo il while il prog gira ma non mi riconosce la riga e non la cancella nemmeno.

Who am I
29-04-2012, 21:48
Non mi è chiaro come fai a cancellare una riga da una matrice.
La matrice è statica, come fai a cancellargli gli elementi? Forse intendevi dire azzerare gli elementi?

oregon
29-04-2012, 21:52
Puoi solamente spostare i dati in modo che quelli della riga prescelta vengano sostituiti da quelli della riga successiva e così via...

francesco1985
29-04-2012, 21:57
ciao oregon, la mia intenzione è quella, ma nn capisco perche il while mi dia fastidio, se lo tolgo il prog gira se resta non gira.

void controllariga()
{
int i,j,cont=0;
for(i=0;i<larghezza_colonne;i++)
{
for(j=0; j<altezza_righe;j++)
{
// while(j<20)
{
if(mappa2[i][j])
cont++;
}
}

if(cont<20)
cont=0;
else if(cont==20)
mappa2[indice_mappai][indice_mappaj]=mappa2[i-1][j];

}
}//fine controlla riga

torn24
30-04-2012, 09:49
Il while ,non fa quello che vorresti che facesse !

hai il primo ciclo for ," che passa da una riga ad un altra" , il secondo for scansiona elemento per elemento la riga , se devi fare qualche modifica la devi fare all'interno
del primo for
il while dovrebbe provocare un ciclo infinito , mettiamo il caso j=0 condizione del while
j<20 sempre vera non uscirebbe mai dal ciclo , che a sua volta se la condizione if sempre
verificata , provocherebbe un continuo incremento di cont fino a quanto puo contenere




void controllariga()
{
int i,j,k,cont=0;
for(i=0;i<larghezza_colonne;i++)
{
for(j=0; j<altezza_righe;j++)
{
if(mappa2[i][j]==1)
cont++;
}

if(cont<20)
cont=0;
else if(cont==20)//se cont =20
{
for(k=0; k<20;k++)//tutti gli elementi della riga sono sostituiti con 0
mappa2[i][k]=0;// se cancellare significa per te eliminare
//devi seguire il consiglio di oregon ,ma dovrai farti una funzione e richiamarla
//in questo punto
cont=0; //azzera cont

}
}
}//fine controlla riga

Who am I
30-04-2012, 14:15
for(j=0; j<altezza_righe;j++)
{
while(j<20)
{
if(mappa2[i][j])
cont++;
}
}


Quando j=0 cioè nella prima iterazione del for, entra nel while e continua a controllare che j sia minore di 20.Controllo che ha sempre successo perché nel while non cambi mai il valore di j.
Ecco perché si blocca: il programma non esce mai da quel while.



if(cont<20)
cont=0;
else if(cont==20)//se cont =20



Devi azzerare cont anche se non è minore di 20:



cont=0;
if(cont==20)
<cancelli la riga :D >

francesco1985
30-04-2012, 15:56
ho provato a risolvere in questo modo, ma nn funziona lo stesso

void cancellariga()
{
int i,j;
for (i=0;i<larghezza_colonne;i++)
{
for(j=0; j<altezza_righe;j++)
{

mappa2[indice_mappai][indice_mappaj]=mappa2[i-1][j];
}
}
}//fine cancellariga
void controllariga()
{
int i,j,k,cont=0;
for(i=0;i<larghezza_colonne;i++)
{
while(j<20)
{
for(j=0; j<altezza_righe;j++)
{

if(mappa2[i][j])
cont++;
}
}//fine while

if(cont<20)
cont=0;
else if(cont==20){
cont=0;
cancellariga();
}

}
}//fine controlla riga

Loading