Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Funzione del Tris
Forum - C/C++ - Funzione del Tris

Avatar
Driverfury (Normal User)
Rookie


Messaggi: 45
Iscritto: 21/09/2011

Segnala al moderatore
Postato alle 18:12
Sabato, 03/12/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++

  1. int controlTris(int table[3][3])
  2. {
  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)
  4.         return 1;
  5.     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)
  6.         return 1;
  7.     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)
  8.         return 1;
  9.     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)
  10.         return 1;
  11.     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)
  12.         return 1;
  13.     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)
  14.         return 1;
  15.     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)
  16.         return 1;
  17.     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)
  18.         return 1;
  19.     else
  20.         return 0;
  21. }



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:

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 19:42
Sabato, 03/12/2011
Testo quotato

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 ...
PM Quote
Avatar
ale.gatti96 (Member)
Pro


Messaggi: 71
Iscritto: 29/11/2011

Segnala al moderatore
Postato alle 20:17
Sabato, 03/12/2011
Testo quotato

Postato originariamente da nessuno:

Testo quotato

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.


PM Quote
Avatar
Driverfury (Normal User)
Rookie


Messaggi: 45
Iscritto: 21/09/2011

Segnala al moderatore
Postato alle 20:58
Mercoledì, 07/12/2011
Rispondete più nel dettaglio, per favore.

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 21:00
Mercoledì, 07/12/2011
Testo quotato

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 ...
PM Quote
Avatar
Driverfury (Normal User)
Rookie


Messaggi: 45
Iscritto: 21/09/2011

Segnala al moderatore
Postato alle 21:03
Mercoledì, 07/12/2011
Ok ok. Grazie Mille per il vostro aiuto qui sul forum.

PM Quote
Avatar
Driverfury (Normal User)
Rookie


Messaggi: 45
Iscritto: 21/09/2011

Segnala al moderatore
Postato alle 21:19
Mercoledì, 07/12/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++

  1. int controlTris2(int table[3][3)
  2. {
  3.     int r, d; // contatori
  4.    
  5.     // Ciclo
  6.     for(r=0; r<3; r++)
  7.     {
  8.         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)
  9.             return 1;
  10.         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)
  11.             return 1;
  12.     }
  13. }


PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 21:29
Mercoledì, 07/12/2011
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 ...
PM Quote
Avatar
Driverfury (Normal User)
Rookie


Messaggi: 45
Iscritto: 21/09/2011

Segnala al moderatore
Postato alle 21:56
Mercoledì, 07/12/2011
Sono riuscito ad ottimizzare la funzione utilizzando 2 cicli for e un operatore ternario:
Codice sorgente - presumibilmente C++

  1. int controlTris2(int table[3][3)
  2. {
  3.     int r, d; // contatori
  4.    
  5.     // Ciclo
  6.     for(r=0; r<3; r++)
  7.     {
  8.         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)
  9.             return 1;
  10.         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)
  11.             return 1;
  12.         for(d=0; d<=2; d+=2)
  13.             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)
  14.                 return 1;
  15.     }
  16.    
  17.     return 0; // Se non è stato trovato nessun tris ritorna 0
  18. }



Si può ottimizzare ulteriormente questa funzione?

PM Quote