Ciao a tutti !!
Poco tempo fa ho scritto un programmino che simula il gioco del 15, funziona tutto...
Solo che io vorrei quando lo eseguo che la tabella rimanga fissa e cambino solo i valori all'interno, tuttavia per come lo creato io non succede! Qualcuno potrebbe aiutarmi ?
Lo so il codice e' lungo da leggere tutto, però la stampa della tabella con tanto di matrice risiede
nelle prime 60 righe, limitatevi al massimo a guardare quelle.
Grazie
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define n 4 /**Costante che definisce dimensioni matrice**/
#define k 50 /**Costante per disordinare matrice iniziale**/
int i,j,mat[n][n];
void Stampa_tabella_mat(int mat[][n])
{
int cont;
for(j=0;j<n;j++)
{
for(i=0;i<n;i++)/**Stampa linea orrizontale della tabella**/
if(i==n-1)
printf("+-------+");
else
printf("+-------");
printf("\n");
cont=0;
for(i=0;i<n+1;i++)/**Stampa prima linea verticale della tabella**/
if(i==cont)
{
cont++;
printf("| ");
}
printf("\n");
cont=0;
for(i=0;i<n+1;i++)/**Stampa seconda linea verticale della tabella, con in mezzo la matrice **/
{
if(i==cont)
{
cont++;
if(i<n)
{
if(mat[j][i]<10)
{
if(mat[j][i]==0)
printf("| ");
else
printf("| %d ",mat[j][i]);
}
else
printf("| %d ",mat[j][i]);
}
else
printf("| ");
}
}
printf("\n");
cont=0;
for(i=0;i<n+1;i++)/**Stampa terza linea verticale della tabella**/
if(i==cont)
{
cont++;
printf("| ");
}
printf("\n");
}
for(i=0;i<n;i++)/**Stampa ultima linea orrizzontale della tabella**/
if(i==n-1)
printf("+-------+");
else
printf("+-------");
}
int Generazione_mat_disordinata()
{
int cont=0,r,c,r1,c1,a;
srand(time(NULL));
/**Genera una matrice ordinata da 0 a 15**/
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
mat[i][j]=cont;
cont++;
}
/**Genera numeri casuali per k volte e scambia i diversi indici cosi da disordinare la matrice**/
for(i=0;i<k;i++)
{
r=rand()%4;
c=rand()%4;
r1=rand()%4;
c1=rand()%4;
a=mat[r1][c1];
mat[r1][c1]=mat[r][c];
mat[r][c]=a;
}
return mat[n][n];
}
int Confronto_mat_vittoria(int mat[][n])
{
int cont=0,cont1=0;
/**Verifica che la matrice sia ordinata da 1 a 15 e come ultimo
elemento 0, ad ogni condizione verificata incrementa un contatore**/
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
cont++;
if((i==n-1)&&(j==n-1))
{
if(mat[i][j]==0)
cont1++;
}
else
if(mat[i][j]==cont)
cont1++;
}
/** Se in contatore è uguale a 16 significa che ha tutti i termini uguali alla (matrice vittoria)
quindi restituisce 1 altrimenti restituisce 0**/
if(cont1==16)
return(1);
else
return (0);
}
int Funzione_movimento(int mat[][n],int move)
{
int rn,cn,cz,rz;
/**Memorizza in 4 variabili gli indici del numero 0 e del numero scelto dall utente da scambiare**/
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(mat[i][j]==move)
{
rn=i;
cn=j;
}
if(mat[i][j]==0)
{
rz=i;
cz=j;
}
}
}
/**La condizione verifica che lo spostamento sia possibile (cioè si toccano nelle 4 direzioni)
Se è verificata sposta i valori nella matrice altrimenti stampa error**/
if(((rn==rz+1)&&(cn==cz))||((rn==rz-1)&&(cn==cz))||((rn==rz)&&(cn==cz+1))||((rn==rz)&&(cn==cz-1)))
{
mat[rz][cz]=mat[rn][cn];
mat[rn][cn]=0;
}
else
printf("\nERROR! Il numero non si puo spostare\n");
return mat[n][n];
}
int main()
{
int vitt,move,part;
time_t m;
printf("Istruzioni del gioco:\n");
printf("Lo scopo e' riuscire a spostare tutti i numeri\nin modo da avere la casella vuota in fondo,\n");
printf("e avere i numeri in ordine crescente.\n");
printf("Per muoversi bisogna inserire il numero\nche si vuole spostare nella casella vuota\n");
do
{
mat[n][n]=Generazione_mat_disordinata(mat);
time_t now=time(NULL);
do
{
Stampa_tabella_mat(mat);
printf("\nInserisci il numero che desideri spostare: ");
scanf("%d",&move);
mat[n][n]=Funzione_movimento(mat,move);
vitt=Confronto_mat_vittoria(mat);/**Se vince restituisce 1 se no restituisce 0**/
}while(vitt!=1);
m=difftime(time(NULL),now);
printf("\nComplimenti hai VINTO!!\n");
printf("Il tempo impiegato e' di %ld secondi\n\n",m);
printf("Se desideri giocare ancora inserisci 1 alrtimenti un qualsialsi altro numero: ");
scanf("%d",&part);
}while(part==1);
return 0;
}