Oppure

Loading
03/12/11 17:12
Driverfury
Ciao a tutti, per esercitarmi sul linguaggio C sto creando il gioco del tris. La griglia dove andranno i simboli (in realtà invece di "X" e "O" ho usato 1 e 2) è una matrice di numeri interi (ecco perchè ho utilizzato 1 e 2) 3x3. Se una cella della griglia non è stata settata a 1 o 2, il suo valore è 0. Ho sviluppato una rudimentale funzione che ritorna 1 se è stato fatto un tris e ritorna 0 in caso contrario.

Ecco la funzione:
int controlTris(int table[3][3])
{
    if(table[0][0]==table[0][1] && table[0][0]==table[0][2] && table[0][0]>0 && table[0][1]>0 && table[0][2]>0)
        return 1;
    else if(table[1][0]==table[1][1] && table[1][0]==table[1][2] && table[1][0]>0 && table[1][1]>0 && table[1][2]>0)
        return 1;
    else if(table[2][0]==table[2][1] && table[2][0]==table[2][2] && table[2][0]>0 && table[2][1]>0 && table[2][2]>0)
        return 1;
    else if(table[0][0]==table[1][0] && table[0][0]==table[2][0] && table[0][0]>0 && table[1][0]>0 && table[2][0]>0)
        return 1;
    else if(table[0][1]==table[1][1] && table[0][1]==table[2][1] && table[0][1]>0 && table[1][1]>0 && table[2][1]>0)
        return 1;
    else if(table[0][2]==table[1][2] && table[0][2]==table[2][2] && table[0][2]>0 && table[1][2]>0 && table[2][2]>0)
        return 1;
    else if(table[0][0]==table[1][1] && table[0][0]==table[2][2] && table[0][0]>0 && table[1][1]>0 && table[2][2]>0)
        return 1;
    else if(table[0][2]==table[1][1] && table[0][2]==table[2][0] && table[0][2]>0 && table[1][1]>0 && table[2][0]>0)
        return 1;
    else
        return 0;
}


La mia domanda è questa: c'è un metodo più veloce ed ottimizzato per controllare se è stato fatto il tris?

Avevo pensato ad una funzione ricorsiva, però non so da dove partire e come strutturarla. Chiedo aiuto. :k:
aaa
03/12/11 18:42
Postato originariamente da Driverfury:

c'è un metodo più veloce


Beh, ovviamente sì.

Se sai cosa sono i cicli for e li utilizzi per controllare tutte le righe, le colonne e le diagonali, risolvi velocemente.
03/12/11 19:17
ale.gatti96
Postato originariamente da nessuno:

Postato originariamente da Driverfury:

c'è un metodo più veloce


Beh, ovviamente sì.

Se sai cosa sono i cicli for e li utilizzi per controllare tutte le righe, le colonne e le diagonali, risolvi velocemente.


Utilizzando i for aumenti anche la leggibilità del codice.
aaa
07/12/11 19:58
Driverfury
Rispondete più nel dettaglio, per favore.
aaa
07/12/11 20:00
Postato originariamente da Driverfury:

Rispondete più nel dettaglio, per favore.


Utilizza i cicli for e gli indici ... più dettaglio di così ... :-|
07/12/11 20:03
Driverfury
Ok ok. Grazie Mille per il vostro aiuto qui sul forum.
aaa
07/12/11 20:19
Driverfury
Sorge un altro problema come controllare le diagonali con il ciclo for?

Ecco la funzione ottimizzata per controllare solo righe e colonne:
int controlTris2(int table[3][3)
{
    int r, d; // contatori
    
    // Ciclo
    for(r=0; r<3; r++)
    {
        if(table[r][0]==table[r][1] && table[r][0]==table[r][2] && table[r][0]>0 && table[r][1]>0 && table[r][2]>0)
            return 1;
        else if(table[0][r]==table[1][r] && table[0][r]==table[2][r] && table[0][r]>0 && table[1][r]>0 && table[2][r]>0)
            return 1;
    }
}
aaa
07/12/11 20:29
La diagonale principale ha indici uguali ... [0][0] ... [1][1] ...

La diagonale secondaria ha indici ...