Oppure

Loading
18/05/11 15:29
belledetta
sto creando un programma in cui c'è una matrice 10x10 e partendo dalla posizione 0,0 genero una passeggiata casuale che si arresta in 2 casi: ho effettuato 26 passi oppure sono in un vicolo cieco.

ho provato a implementare il codice ma siccome ho studiato solo ieri i puntatori credo di aver fatto un gran macello più che altro perchè non passere le matrici per riferimento, in questo esercizio c'è la funzione mossa che dovrebbe cambiare lo stato della matrice, della posiz corrente e del passo ma non va. (in particolare la swich è tutta sbagliata credo)
potete dare uno sguardo?

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>

#define N 10


//funzione che stampa la matrice quadrata
void stampa (int matrix[N][N], int N) 
{
	for(int i = 0; i < N; i++) {
		for(int j = 0; j < N; j++)
			printf("%d ", matrix[i][j]);
		printf("\n");
		}
	printf("\n");
	return void;
}

//procedura che controlla se e quante caselle adiacenti alla posizione attuale sono disponibili
bool avanzamento(unsigned int walk[N][N], unsigned int coordinata[2], bool *mosse_disponibili )
{
	if ( coordinata[0]+1 < N )   //se la riga sotto è contenuta nel bordo
		if ( walk[coordinata[0]+1][coordinata[1]] == 0 )   //se la cella sotto è libera
			mosse_disponibili[1] = true;
	
	if ( coordinata[0] -1 > 0 )	//se la riga sopra è contenuta nel bordo
		if (walk[coordinata[0]-1][coordinata[1]] == 0 )	// se la cella sopra è libera
			mosse_disponibili[0] = true;
			
	if ( coordinata[1]+1 <N )	//se la colonna a destra è nel bordo
		if( walk[coordinata[0]][coordinata[1]+1] == 0 )	//se la cella a destra è libera
			mosse_disponibili[2] = true;
	
	if ( coordinata [1]-1 > 0)	// la colonna a sinistra è nel bordo
		if (walk[coordinata[0]][coordinata[1]-1] == 0)	//se la cella è libera
			mosse_disponibili[3] = true;
	
	int i=0;
	for (; mosse_disponibili[i]==false && mosse_disponibili[i]<4; i++)
	
	if(mosse_disponibili[i]== true) return true;
	else return false;
}

//procedura che fa spostare la pedina di una posizione
void mossa (unsigned int **p , unsigned int *coordinata, bool* mosse_disponibili, unsigned int *passo)
{	
	/*conto le mosse disponibili*/
	int count=0;	//conta le mosse possibili	
	for(int i=1; i<4; i++)  
		if ( mosse_disponibili[i] == true) count++;
	
	int sposta = rand()%count;		//estrae una mossa tra quelle disponibili
	
	//capisco quale mossa devo fare
	
	int j=-1; 	//variabile per capire la mossa, inizializ a -1 perchè le mosse vanno da 0 a 3
	for(int i=0; i < count + 1 ; i++)
		if ( mosse_disponibili[i] == true ) j++;		//la mossa sarà mosse_disponibili[j]
	
	//fai il passo
	switch (j)
	{
		case 0: { coordinata[0]-=1;			//cambio coordinata nella riga superiore
				 ++(*passo);				//incremento il passo effettuato
				 p[coordinata[0]][coordinata[ 1]]= passo;	//walk[pos1][pos2] segna il nuovo passo
				 p = &p[coordinata[0]][coordinata[1]];					 // sposta il puntatore nella nuova posizione della matrice??????
				 break;
				}			
		case 1:	{ coordinata[0]+=1;				//coordinata su riga inferiore
				++(*passo);
				p[coordinata[0]][coordinata[ 1]]= passo;	//walk[pos1][pos2] segna il nuovo passo
				 p = &p[coordinata[0]][coordinata[1]];					// sposta il puntatore nella nuova posizione della matrice??????
				break;
				}
		case 2:	{ coordinata[1]+=1;				//posizione su riga destra
				++(*passo);
				p[coordinata[0]][coordinata[ 1]]= passo;	//walk[pos1][pos2] segna il nuovo passo
				 p = &p[coordinata[0]][coordinata[1]];					// sposta il puntatore nella nuova posizione della matrice??????
				break;
				}

		case 3:	{ coordinata[1]-=1;				//posizione su riga sinistra
				++(*passo);
				p[coordinata[0]][coordinata[ 1]]= passo;	//walk[pos1][pos2] segna il nuovo passo
				 p = &p[coordinata[0]][coordinata[1]];					// sposta il puntatore nella nuova posizione della matrice??????
				break;
				}						
	}
	return ;
	
	}
	

int main()
{
	unsigned int walk[N][N]={0};					//matrice cammino
	
	unsigned int coordinata[2]={0};					//coordinate posizione pedina
	unsigned int passo = 0;							//passo corrente
	bool mosse_disponibili[4]={false};				//mosse che si possono fare dalla posizione corrente 0=su 1=giù 2=dx 3=sx
	unsigned int *p;	//punt a elemento matrice
	
	
	p = &walk[0][0];								//puntatore al primo elemento della matrice
	
	walk[coordinata[1]][coordinata[2]]= ++passo;		//parto dalla cella [0][0] con il primo passo
	
	for (passo = 1; passo <= 26; passo++){
		mosse_disponibili[4] = {false};
		if ( avanzamento( walk[N][N], coordinata[2]; mosse_disponibili ) )	//la f cambia lo stato di mosse disponibili rispetto alla posizione
			{
			mossa ( p, coordinata, mosse_disponibili, &passo);			//la f cambia lo stato della matrice, delle coordinate della pedina, dei passi effettuati
			stampa(walk[N][N], N);
			}
		else { printf("\nnon sono più possibili nuove mosse\n"); break; }

	}
	
	stampa(walk[N][N], N);
	
	
	return 0;
}



aaa
19/05/11 11:36
Peppe91
Quando chiami la funzione di stampa non devi assolutamente chiamarla così. Devi chiamarla nel modo seguente:

stampa(matrice); /*N puoi anche non metterlo perchè è una macro, puoi usarlo dovunque senza passarlo*/

Piccolo suggerimento: quando passi una matrice ad una funzione, devi specificare obbligatoriamente, soltanto il numero di colonne. Il numero di righe puoi anche evitare di passarlo. Il numero di colonne è obbligatorio affinchè il programma possa generare la mappa di memorizzazione corretta.
aaa