Consigli per gioco del 15 in C

di il
11 risposte

Consigli per gioco del 15 in C

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

11 Risposte

  • Re: Consigli per gioco del 15 in C

    Che sistema operativo usi?
    che compilatore usi?
  • Re: Consigli per gioco del 15 in C

    Compilatore uso code::blocks e sistema operativo ho windows 7
  • Re: Consigli per gioco del 15 in C

    C::b è un IDE che usa tdm-mingw come compilatore.

    Queste sono le funzioni di base per muovere e colorare il carret sotto windows:
    
    	#include <windows.h>
    	
    	void _gotoyx (short y,short x)
    	{
    		COORD coord = {--x, --y};
    		SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE),coord );
    	}
    	
    	void _cls()
    	{
    		CONSOLE_SCREEN_BUFFER_INFO csbi;
    		const COORD startCoords = {0,0};
    		DWORD dummy;
    		HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
    		GetConsoleScreenBufferInfo(h,&csbi);
    		FillConsoleOutputAttribute(h,0,csbi.dwSize.X * csbi.dwSize.Y,startCoords,&dummy);
    		FillConsoleOutputCharacter(h,' ',csbi.dwSize.X * csbi.dwSize.Y,startCoords,&dummy);
    		_gotoxy(1,1);
    	}
    	
    	#define _color(B,F) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),(B<<4) | (F & 0x0F));
    	
    	#define msleep(MS) Sleep(MS);
    	
    	#define resetc() _color(0,15);
    
    L'unica precisazione è color, dove B è background e F è foreground e i colori vanno da 0x0 a 0xF
    e gotoyx per spostarsi in alto a sinistra gotoyx(1,1)
  • Re: Consigli per gioco del 15 in C

    Ti ringrazio davvero!! mi sono addentrato da poco nell' informatica spero possiate capire la mia ignoranza ma ricevo un errore che non riesco a capire cosa sia : (undefined reference to "WinMain@16")!! Ora cercherò di capire come interagiscono le funzioni che mi hai scritto
  • Re: Consigli per gioco del 15 in C

    Forse devi includere le librerie di windows, strano, dovrebbero essere implicite.
    Ma hai creato un progetto console o GUI?
  • Re: Consigli per gioco del 15 in C

    No no ho selezionato progetto GUI win 32...
    E mi da lo stesso errore anche con il programma base di esempio quando apro tale progetto
  • Re: Consigli per gioco del 15 in C

    Crea un nuovo progetto console.
    Prova a incollare il codice sopra postato e compila, in caso di errore includi la libreria "Kernel32.lib"
    se hai ancora problemi posta tutto il codice di prova usato e il relativo log del compilatore
  • Re: Consigli per gioco del 15 in C

    Nanni16 ha scritto:


    No no ho selezionato progetto GUI win 32...
    E non deve essere GUI Win 32 ma Console ...
  • Re: Consigli per gioco del 15 in C

    Ok... grazie!! ma il problema persiste.. Il codice e' questo:
     #include <windows.h>
    
       void _gotoyx (short y,short x)
       {
          COORD coord = {--x, --y};
          SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE),coord );
       }
    
       void _cls()
       {
          CONSOLE_SCREEN_BUFFER_INFO csbi;
          const COORD startCoords = {0,0};
          DWORD dummy;
          HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
          GetConsoleScreenBufferInfo(h,&csbi);
          FillConsoleOutputAttribute(h,0,csbi.dwSize.X * csbi.dwSize.Y,startCoords,&dummy);
          FillConsoleOutputCharacter(h,' ',csbi.dwSize.X * csbi.dwSize.Y,startCoords,&dummy);
         _gotoyx(1,1);
       }
    
       #define _color(B,F) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),(B<<4) | (F & 0x0F));
    
       #define msleep(MS) Sleep(MS);
    
       #define resetc() _color(0,15);
    e il "build log" è questo:


    -------------- Build: Debug in 1 (compiler: GNU GCC Compiler)---------------
    
    mingw32-g++.exe  -o bin\Debug\1.exe obj\Debug\main.o   "..\..\..\..\Program Files (x86)\CodeBlocks\MinGW\lib\libkernel32.a"
    c:/program files (x86)/codeblocks/mingw/bin/../lib/gcc/mingw32/4.7.1/../../../libmingw32.a(main.o):main.c:(.text.startup+0xa7): undefined reference to `WinMain@16'
    collect2.exe: error: ld returned 1 exit status
    Process terminated with status 1 (0 minute(s), 0 second(s))
    1 error(s), 0 warning(s) (0 minute(s), 0 second(s))
     
    
    -------------- Run: Debug in 1 (compiler: GNU GCC Compiler)---------------
    
    Checking for existence: C:\Users\Nanni\Desktop\1\bin\Debug\1.exe
    
    
  • Re: Consigli per gioco del 15 in C

    Ma devi metterci anche un "int main" e non so, un puts("hello world); return 0...
  • Re: Consigli per gioco del 15 in C

    Ahahahahha!! Sono un pirla sisi grazie
Devi accedere o registrarti per scrivere nel forum
11 risposte