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?
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