C, console, mouse GiocoDel15

di il
18 risposte

18 Risposte - Pagina 2

  • Re: C, console, mouse GiocoDel15

    Nippolo ha scritto:


    Innanzitutto la y puoi anche farla partire direttamente da i+1, inoltre anche se la tua versione è ugualmente funzionante (non ho approfondito più di tanto la questione dal punto di vista logico-matematico)
    i+1 è corretto, il mio è sbagliato si spreca un confronto anche se poi il risultao non cambia.
    Per il maggiore nell'if l'avevo usato anche io, ma poi ragionando mettendo minore il numero delle coppie diventavano dispare quando la sequenza era corretta, e non dovevo più usare not sul mod e l'ho preferito.

    Alla fine nel codice nuovo, la funzione di test l'ho implementata ma non l'ho usata, perché se mescolo una sequenza valida con 00 alla fine per un numero pari di volte, resta sempre valida.... Però l'ho scoperto per merito della funzione.

    Ho pubblicato i progetti CODE::BLOCKS e VisualStudio qui: http://www.pierotofy.it/pages/sorgenti/dettagli/19631-GiocoDel15/
  • Re: C, console, mouse GiocoDel15

    Tempo fa mi cimentai anch'io nel gioco del 15, questo il codice tradotto in C:
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <time.h>
    #include <windows.h>
    
    #define DEFAULT_COLOUR 7
    #define RED 12
    
    #define UP 72
    #define DOWN 80
    #define LEFT 75
    #define RIGHT 77
    
    void set_colour(int colour)
    {
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), colour);
    }
    
    int get_input()
    {
        while(getch() != 224);
        return getch();
    }
    
    void scambia_valori(unsigned int *a, unsigned int *b)
    {
        unsigned int temp = *a;
        *a = *b;
        *b = temp;
    }
    
    void mischia(unsigned int *v)
    {
        for(unsigned int i = 14; i; --i)
        {
            scambia_valori(v + rand() % (i + 1), v + i);
        }
    }
    
    int impossibile(unsigned int *v)
    {
        unsigned int cont = 0;
        for(unsigned int i = 0; i < 15; ++i)
        {
            for(unsigned int j = i + 1; j < 15; cont += v[i] > v[j], ++j);
        }
        return(cont % 2);
    }
    
    void inizializza(unsigned int *v)
    {
        mischia(v);
        if(impossibile(v))
        {
            scambia_valori(v + 13, v + 14);
        }
    }
    
    int controlla_vittoria(unsigned int *v)
    {
        unsigned int i;
        for(i = 0; v[i] == i + 1; ++i);
        return(i == 15);
    }
    
    int mossa_giocatore(unsigned int v[4][4], unsigned int *i_0, unsigned int *j_0)
    {
        unsigned int I_0 = *i_0;
        unsigned int J_0 = *j_0;
        while(1)
        {
            int input = get_input();
            if(input == UP && *i_0)
            {
                --*i_0;
                break;
            }
            else if(input == DOWN && *i_0 != 3)
            {
                ++*i_0;
                break;
            }
            else if(input == LEFT && *j_0)
            {
                --*j_0;
                break;
            }
            else if(input == RIGHT && *j_0 != 3)
            {
                ++*j_0;
                break;
            }
        }
        scambia_valori(&v[*i_0][*j_0], &v[I_0][J_0]);
    }
    
    void mostra_griglia(unsigned int v[4][4])
    {
        for(unsigned int i = 0; i < 4; ++i)
        {
            for(unsigned int j = 0; j < 4; ++j)
            {
                if(!v[i][j])
                {
                    set_colour(RED);
                }
                printf(" %02u\t", v[i][j]);
                set_colour(DEFAULT_COLOUR);
            }
            printf("\n\n");
        }
        printf("\n");
    }
    
    int main()
    {
        srand(time(0));
        unsigned int m[4][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 0}};
        unsigned int i_0 = 3;
        unsigned int j_0 = 3;
        unsigned int mosse = 0;
        inizializza(*m);
        while(1)
        {
            system("CLS");
            printf("\n ORDINARE I NUMERI DA 1 A 15 CON LO SPAZIO VUOTO (00) IN BASSO A DESTRA\n\n\n\n");
            mostra_griglia(m);
            if(controlla_vittoria(*m))
            {
                break;
            }
            mossa_giocatore(m, &i_0, &j_0);
            ++mosse;
        }
        printf("HAI VINTO IN %u MOSSE!\n", mosse);
    }
    Si gioca con i tasti freccia della tastiera.

    Più che altro volevo mostrarti l'impostazione logica del programma, per esempio mescolando in questo modo la probabilità associata a ciascuna permutazione risulta uniforme.
  • Re: C, console, mouse GiocoDel15

    Nippolo ha scritto:


    Tempo fa mi cimentai anch'io nel gioco del 15, questo il codice tradotto in C:
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <time.h>
    #include <windows.h>
    
    #define DEFAULT_COLOUR 7
    #define RED 12
    
    #define UP 72
    #define DOWN 80
    #define LEFT 75
    #define RIGHT 77
    
    void set_colour(int colour)
    {
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), colour);
    }
    
    int get_input()
    {
        while(getch() != 224);
        return getch();
    }
    
    void scambia_valori(unsigned int *a, unsigned int *b)
    {
        unsigned int temp = *a;
        *a = *b;
        *b = temp;
    }
    
    void mischia(unsigned int *v)
    {
        for(unsigned int i = 14; i; --i)
        {
            scambia_valori(v + rand() % (i + 1), v + i);
        }
    }
    
    int impossibile(unsigned int *v)
    {
        unsigned int cont = 0;
        for(unsigned int i = 0; i < 15; ++i)
        {
            for(unsigned int j = i + 1; j < 15; cont += v[i] > v[j], ++j);
        }
        return(cont % 2);
    }
    
    void inizializza(unsigned int *v)
    {
        mischia(v);
        if(impossibile(v))
        {
            scambia_valori(v + 13, v + 14);
        }
    }
    
    int controlla_vittoria(unsigned int *v)
    {
        unsigned int i;
        for(i = 0; v[i] == i + 1; ++i);
        return(i == 15);
    }
    
    int mossa_giocatore(unsigned int v[4][4], unsigned int *i_0, unsigned int *j_0)
    {
        unsigned int I_0 = *i_0;
        unsigned int J_0 = *j_0;
        while(1)
        {
            int input = get_input();
            if(input == UP && *i_0)
            {
                --*i_0;
                break;
            }
            else if(input == DOWN && *i_0 != 3)
            {
                ++*i_0;
                break;
            }
            else if(input == LEFT && *j_0)
            {
                --*j_0;
                break;
            }
            else if(input == RIGHT && *j_0 != 3)
            {
                ++*j_0;
                break;
            }
        }
        scambia_valori(&v[*i_0][*j_0], &v[I_0][J_0]);
    }
    
    void mostra_griglia(unsigned int v[4][4])
    {
        for(unsigned int i = 0; i < 4; ++i)
        {
            for(unsigned int j = 0; j < 4; ++j)
            {
                if(!v[i][j])
                {
                    set_colour(RED);
                }
                printf(" %02u\t", v[i][j]);
                set_colour(DEFAULT_COLOUR);
            }
            printf("\n\n");
        }
        printf("\n");
    }
    
    int main()
    {
        srand(time(0));
        unsigned int m[4][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 0}};
        unsigned int i_0 = 3;
        unsigned int j_0 = 3;
        unsigned int mosse = 0;
        inizializza(*m);
        while(1)
        {
            system("CLS");
            printf("\n ORDINARE I NUMERI DA 1 A 15 CON LO SPAZIO VUOTO (00) IN BASSO A DESTRA\n\n\n\n");
            mostra_griglia(m);
            if(controlla_vittoria(*m))
            {
                break;
            }
            mossa_giocatore(m, &i_0, &j_0);
            ++mosse;
        }
        printf("HAI VINTO IN %u MOSSE!\n", mosse);
    }
    Si gioca con i tasti freccia della tastiera.

    Più che altro volevo mostrarti l'impostazione logica del programma, per esempio mescolando in questo modo la probabilità associata a ciascuna permutazione risulta uniforme.
    Ho visto velocemente, direi che di cose me ne hai mostrate molte, per esempio la matrice a due dimensioni, facilita alcune cose...

    EDIT: che strano giocare con le frecce

    Quando ho scritto il programma in C, ho rivangato ricordi di un vecchio codice minimale che avevo scritto in VB.Net: http://www.pierotofy.it/pages/extras/forum/viewtopic.php?forum_id=&project_id=&id=1062815&page=4, codice ridotto di "15 il Gioco", sempre in VB.Net, con le tessere che scorrono veramente anche multiple: http://www.pierotofy.it/pages/projects/files.php?id=66
    c'è anche l'eseguibile ...\Gioco_del_15_5_NET\bin\Release\15 il gioco Fifteen.exe

    Si può giocare con puzzle fino a 10x10... 99 tessere
    Con il puzzle 4x4 soluzioni anche personalizzabili e salvabili

    Come già ti avevo accennato mescolavo il puzzle veramente via software, non so se ci rimetterò mano, ora che so come mescolare senza perdere la parità delle coppie.

    In Linux che conoscenze hai? come si sostituisce windows.h?
  • Re: C, console, mouse GiocoDel15

    Rubik ha scritto:


    EDIT: che strano giocare con le frecce
    Però una volta presa la mano si va spediti!

    Rubik ha scritto:


    In Linux che conoscenze hai? come si sostituisce windows.h?
    Visto che di solito tendo a focalizzarmi maggiormente sulla parte logica, ho scarse conoscenze relativamente a compatibilità e portabilità del codice, mi dispiace!

    P.S.
    Poi con calma mi guardo anche i link che hai postato!
Devi accedere o registrarti per scrivere nel forum
18 risposte