#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;
}