Driverfury (Normal User)
Rookie
Messaggi: 45
Iscritto: 21/09/2011
|
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:
Codice sorgente - presumibilmente C++ |
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.
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6390
Iscritto: 03/01/2010
|
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.
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
ale.gatti96 (Member)
Pro
Messaggi: 71
Iscritto: 29/11/2011
|
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. |
|
Driverfury (Normal User)
Rookie
Messaggi: 45
Iscritto: 21/09/2011
|
Rispondete più nel dettaglio, per favore.
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6390
Iscritto: 03/01/2010
|
Postato originariamente da Driverfury:
Rispondete più nel dettaglio, per favore. |
Utilizza i cicli for e gli indici ... più dettaglio di così ...
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
Driverfury (Normal User)
Rookie
Messaggi: 45
Iscritto: 21/09/2011
|
Ok ok. Grazie Mille per il vostro aiuto qui sul forum.
|
|
Driverfury (Normal User)
Rookie
Messaggi: 45
Iscritto: 21/09/2011
|
Sorge un altro problema come controllare le diagonali con il ciclo for?
Ecco la funzione ottimizzata per controllare solo righe e colonne:
Codice sorgente - presumibilmente C++ |
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; } }
|
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6390
Iscritto: 03/01/2010
|
La diagonale principale ha indici uguali ... [0][0] ... [1][1] ...
La diagonale secondaria ha indici ...
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
Driverfury (Normal User)
Rookie
Messaggi: 45
Iscritto: 21/09/2011
|
Sono riuscito ad ottimizzare la funzione utilizzando 2 cicli for e un operatore ternario:
Codice sorgente - presumibilmente C++ |
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; for(d=0; d<=2; d+=2) if(table[0][d]==table[1][1] && table[0][d]==table[2][(d==0) ? 2 : 0] && table[0][d]>0 && table[1][1]>0 && table[2][(d==0) ? 2 : 0]>0) return 1; } return 0; // Se non è stato trovato nessun tris ritorna 0 }
|
Si può ottimizzare ulteriormente questa funzione?
|
|