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