DOMANDA Gioco del 15 in linguaggio C

Viki

Nuovo Utente
1
0
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
5,144
2,023
CPU
Ryzen 7 2700X | i7-6700k@4.5 | i5-4460... altri
Dissipatore
wraith MAX | Scythe Katana2|Arctic Freezer 11LP
Scheda Madre
Asrock B450 Fatal1ty 4K | Asus Prime Z270P | Acer Veriton
HDD
Samsung 970evo m.2 | vari | Samsung 860 evo
RAM
16GB G.Skill TridentZ 3000 | 16GB CORSAIR 2133 | 8GB DDR3 1600
GPU
RadeonPro WX3100 4G | ZOTAC GTX 1070 8G | Quadro k620 2G
Monitor
DELL 2419P 2K + Benq 17" | LG Ultrawide 27''
Net
fibra 1000
OS
Windows10-pro64/OpenSUSE-QL15.1/Debian 10.3
Il codice dentro apposito tag. Grazie

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

Andretti60

Utente Èlite
6,440
5,091
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
143
68
... 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
Reazioni: Andretti60

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili