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: 5686
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 ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
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: 5686
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 ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
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: 5686
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 ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
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