DOMANDA Gioco del 15 in linguaggio C

Viki

Nuovo Utente
Salve ho trovato questo gioco. Vorrei capire come funzionano righe di spostamento e se c'e' qualche altro modo per scrivere queste operazioni. Poi invece di usare l'istruzione GOTO c'e' qualche altro modo? Grazie.
C:
int m[4][4] = {
    {1,2,3,4},
    {5,6,7,8},
    {9,10,11,12},
    {13,14,15,0}
};

srand((unsigned)time(NULL));

int i,j,k,jj,kk;

int num,mem;

printf("Questo programma compone il gioco del 15\n\n");

//mischio

num = (rand() % 100)+1;

for (i = 0 ; i < num ; i++)
{
    k = rand() % 4;
    j = rand() % 4;
    kk = rand() % 4;
    jj = rand() % 4;
    mem = m[k][j];
    m[k][j] = m[kk][jj];
    m[kk][jj] = mem;
}

printf("Inserendo uno dei numeri puoi mischiare la matrice!\n\n");

int mosse=0;

while(num)
{
    //disegno mappa
    for(i=0; i<4; i++)
    {
        for(j=0; j<4; j++)
        {
            if(m[j]==0)
                printf("    ");
            else
                printf(" %2d ",m[j]);
        }
        printf("\n\n");
    }

    printf("\nInserisci il numero (0 per terminare la mischia):");

    scanf("%d",&num);
    for(i=0; i<4; i++)
    {
        for(j=0; j<4; j++)
        {
            if(m[j] != num) continue;

            //spostamento

            kk = i;
            jj = j;
            if (j > 0 && !m[j - 1])
                --jj;
            else if ( j < 4 && !m[j + 1] )
                ++jj;
            else if ( i > 0 && !m[i - 1][j] )
                --kk;
            else if ( i < 4 && !m[i + 1][j] )
                ++kk;

            mem = m[j];
            m[j] = m[kk][jj];
            m[kk][jj] = mem;
            goto contmosse;
        }
    }

    contmosse:
    ++mosse;
    system("cls");
}

printf("Hai risolto il Gioco del 15 in %d mosse!\n\n", mosse);
 
Ultima modifica da un moderatore:

rctimelines

Utente Èlite
4,087
1,330
Hardware Utente
CPU
AMD Ryzen 7 2700X | INTEL i5-6600k | INTEL i5-4460... altri
Dissipatore
wraith MAX | Arctic Freezer 11LP | stock
Scheda Madre
Asrock Fatal1ty 4K | Asus Prime Z270P | Acer Veriton
Hard Disk
Samsung 970evo m.2 | vari | Samsung 860 evo
RAM
16GB G.Skill TridentZ 3000 | 16GB CORSAIR 2133 | 8GB DDR3 1600
Scheda Video
RadeonPro WX3100 4G | Asus R9 280x 3G | Quadro k620 2G
Monitor
DELL 2419P 2K + Benq 17" | Acer 24" FHD | Benq 19" FHD
Sistema Operativo
Windows10-pro64/OpenSUSE-QL42.3/Manjaro-17.0.2-KDE
Il codice dentro apposito tag. Grazie

Inviato dal mio Nexus 6P utilizzando Tapatalk
 
  • Mi piace
Reactions: Mursey

Andretti60

Utente Èlite
3,533
2,360
Hardware Utente
Codice molto “old school”, ma mi stupisco che funzioni visto che la variabile “m” viene dichiarata come matrice ma a volte viene usata come vettore (il che sarebbe possibile ma solo modificando opportunamente l'indirizzamento).
Ovvio sia possibile riscrivere meglio quel codice, che sembra una semplice traduzione in C di un programma scritto in BASIC.
Lo spostamento è molto semplice, l’elemento della matrice il cui valore è quello scritto da tastiera viene scambiato con l'elemento adiacente a valore nullo (se presente).
È un classico esercizio che si faceva appunto al tempo del BASIC e ancora prima con il assembly, visto la sua semplicità. Consiglierei di lasciar perdere il codice presentato e riscriverlo da zero.
 

M1n021

Nuovo Utente
... mi stupisco che funzioni visto che la variabile “m” viene dichiarata come matrice ma a volte viene usata come vettore (il che sarebbe possibile ma solo modificando opportunamente l'indirizzamento).
Dal post di @rctimelines mi sembra di capire che inizialmente l'autore avesse postato il codice senza utilizzare gli appositi tag, molto probabilmente quando ha modificato il post iniziale ha copiato il codice postato in precedenza dove il frammento
Codice:
[i]
era stato interpretato come il tag per il corsivo.

In ogni caso vorrei aggiungere qualche osservazione:
- manca un controllo automatico che verifica se lo schema è stato risolto;
- la parte che si occupa di mischiare la griglia non ha molto senso ed in ogni caso non genera uno schema realmente "casuale";
- cosa più importante manca un controllo che stabilisce se lo schema creato sia risolvibile... rischi di arrivare alla fine del gioco con il 14 e il 15 invertiti! :asd:
 
Ultima modifica:
  • Mi piace
Reactions: Andretti60

Entra

oppure Accedi utilizzando