DOMANDA Gioco del 15 in linguaggio C

Pubblicità

Viki

Nuovo Utente
Messaggi
1
Reazioni
0
Punteggio
1
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:
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.
 
... 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:
Pubblicità
Pubblicità
Indietro
Top