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++ - Life Conway
Forum - C/C++ - Life Conway

Avatar
nihilus (Normal User)
Newbie


Messaggi: 3
Iscritto: 23/03/2010

Segnala al moderatore
Postato alle 19:03
Martedì, 20/04/2010
Buon Giorno!
Mi son cimentato nel gioco Life, ho provato un approccio differente, e questo è il risultato, ma non capisco se i controlli son corretti ed il gioco esegue correttamente, poichè provandone altri 5, in ognuno la configurazione delle celle risulta differente.

Questo è il mio codice, qualcuno può aiutarmi a trovare il controllo più efficente per lo svolgimento del gioco?

Codice sorgente - presumibilmente C++

  1. #include <iostream>
  2. #include <time.h>
  3. #include <windows.h>
  4. using namespace std;
  5.  
  6. //Inizio Programma
  7. int main(){
  8.     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),5);
  9.     cout<<"Gioco Life Sviluppato Da Favaro Matteo"<<endl;
  10.     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),6);
  11.     //Dichiarazione Variabili Riga E Colonna
  12.     int r=0,c=0,scelta,attive=0,k=0,j=0,n=0,scelt,cont=0,o=0,g=0,p=0;
  13.     //Richiesta Riga E Colonna
  14.     do{
  15.         SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),2);
  16.         cout<<endl<<"Inserisci grandezza matrice: ";
  17.         SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),6);
  18.         cin>>r;
  19.     }while(r<3);
  20.     //Imposto riga=colonna
  21.     c=r;
  22.     //Dichiaro Le Due Matrici: Appoggio e Life
  23.     int life[r][c];
  24.     int lifea[r+2][c+2];
  25.     //Riempio la matrice Life di Zeri (0)
  26.     for(int i=0;i<r;i++){
  27.         for(int j=0;j<c;j++){
  28.             life[i][j] = 0;
  29.         }
  30.     }
  31.     //Riempio la matrice (appoggio) lifea di Zeri (0)
  32.     for(int i=0;i<r+2;i++){
  33.         for(int j=0;j<c+2;j++){
  34.             lifea[i][j] = 0;
  35.         }
  36.     }
  37.     qui:
  38.     //Faccio scegliere la modalità di riempimento della matrice
  39.     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),2);
  40.     cout<<"Scegli in che modo svolgere il gioco:"<<endl;
  41.     cout<<endl;
  42.     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),3);
  43.     cout<<"1)Inserimento utente"<<endl;
  44.     cout<<"2)Random"<<endl;
  45.     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),6);
  46.     cin>>scelta;
  47.     //Inizio Il Costrutto Switch
  48.     switch(scelta){
  49.         //Inserimento Manuale Della Popolazione
  50.         case 1:
  51.             SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),2);
  52.             cout<<"I valori concessi da inserire sono: "<<endl;
  53.             SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),3);
  54.             cout<<"Vuoto: 0"<<endl;
  55.             cout<<"Pieno: 1"<<endl;
  56.             SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),6);
  57.             cout<<endl;
  58.             SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),2);
  59.             cout<<"Quante celle vuoi rendere attive? "<<endl;
  60.             SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),6);
  61.             cin>>attive;
  62.             for(int i=0;i<attive;i++){
  63.                 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),3);
  64.                 cout<<"Riga: ";
  65.                 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),6);
  66.                 cin>>k;
  67.                 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),3);
  68.                 cout<<"Colonna: ";
  69.                 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),6);
  70.                 cin>>j;
  71.                 life[k][j] = 1;
  72.             }
  73.             //Copio La Matrice life In Quella D'appoggio
  74.             for(int i=0;i<r;i++){
  75.                 for(int j=0;j<c;j++){
  76.                     lifea[i+1][j+1] = life[i][j];
  77.                 }
  78.             }
  79.             break;
  80.             //Inserimento Random Della Popolazione
  81.             case 2:
  82.                 srand(time(NULL));
  83.                 for(int i=0;i<r;i++){
  84.                     for(int j=0;j<c;j++){
  85.                         n = rand ()% 2+0;
  86.                         life[i][j] = n;
  87.                     }
  88.                 }
  89.                 //copio La Matrice life In Quella D'appoggio
  90.                 for(int i=0;i<r;i++){
  91.                     for(int j=0;j<c;j++){
  92.                         lifea[i+1][j+1] = life[i][j];
  93.                     }
  94.                 }
  95.                 break;
  96.             default:
  97.                 system("cls");
  98.                 goto qui;
  99.             }
  100.             //Modalità di avanzamento del gioco
  101.             qua:
  102.             SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),2);
  103.             cout<<"Modalita\' di evoluzione disponibili:"<<endl;
  104.             SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),3);
  105.             cout<<"1) Step-By-Step"<<endl;
  106.             cout<<"2) Forever"<<endl;
  107.             SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),6);
  108.             cin>>scelt;
  109.             int test=0;
  110.             //Inizio Costrutto Switch
  111.             switch(scelt){
  112.                 case 1:
  113.                     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),2);
  114.                     cout<<"Quante generazioni vuoi visualizzare?"<<endl;
  115.                     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),6);
  116.                     cin>>g;
  117.                     //Inizio Costrutto Do-While
  118.                     do{
  119.                         if(test < 1){
  120.                             cout<<"Generazione Iniziale"<<endl;
  121.                             for(int i=1;i<c+1;i++){
  122.                                 for(int j=1;j<r+1;j++){
  123.                                     cout<<" "<<lifea[i][j];
  124.                                 }
  125.                                 cout<<endl;
  126.                             }
  127.                             test++;
  128.                         }
  129.                         SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),2);
  130.                         cout<<"Generazione "<<o+1<<endl;
  131.                         SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),6);
  132.                         //Inizio Controllo
  133.                         for(int i=0;i<c;i++){
  134.                             for(int j=0;j<r;j++){
  135.                                 if(lifea[i][j] == 1){
  136.                                     if(lifea[i-1][j-1]==1){cont++;}
  137.                                     if(lifea[i+1][j+1]==1){cont++;}
  138.                                     if(lifea[i][j-1]==1){cont++;}
  139.                                     if(lifea[i-1][j]==1){cont++;}
  140.                                     if(lifea[i][j+1]==1){cont++;}
  141.                                     if(lifea[i+1][j]==1){cont++;}
  142.                                     if(lifea[i-1][j+1]==1){cont++;}
  143.                                     if(lifea[i+1][j-1]==1){cont++;}
  144.                                 }
  145.                                 if(lifea[i][j] == 1 && cont < 2)lifea[i][j] = 0;
  146.                                 else if (life[i][j] == 1 && cont > 3)lifea[i][j] = 0;
  147.                                 else if (life[i][j] == 1 && (cont == 2 || cont == 3))lifea[i][j] = 1;
  148.                                 else if (life[i][j] == 0 && cont == 3)lifea[i][j] = 1;
  149.                                 cout<<" "<<lifea[i][j];
  150.                             }
  151.                             cout<<endl;
  152.                         }
  153.                         system("pause >null");
  154.                         o++;
  155.                     }while(o < g);
  156.                     //Fine Controllo
  157.                     break;
  158.                     case 2:
  159.                         if(test < 1){
  160.                             SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),2);
  161.                             cout<<"Generazione Iniziale"<<endl;
  162.                             SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),7);
  163.                             for(int i=1;i<c+1;i++){
  164.                                 for(int j=1;j<r+1;j++){
  165.                                     cout<<" "<<lifea[i][j];
  166.                                 }
  167.                                 cout<<endl;
  168.                             }
  169.                             test++;
  170.                         }
  171.                         //Inizio Controllo
  172.                         SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),2);
  173.                         cout<<"Quante generazioni vuoi visualizzare?"<<endl;
  174.                         SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),6);
  175.                         cin>>p;
  176.                         //Inizio Costrutto Do-While
  177.                         do{
  178.                             SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),2);
  179.                             cout<<"Generazione "<<o+1<<endl;
  180.                             SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),6);
  181.                             //Inizio Controllo
  182.                             for(int i=0;i<c;i++){
  183.                                 for(int j=0;j<r;j++){
  184.                                     if(lifea[i][j] == 1){
  185.                                         if(lifea[i-1][j-1]==1){cont++;}
  186.                                         if(lifea[i+1][j+1]==1){cont++;}
  187.                                         if(lifea[i][j-1]==1){cont++;}
  188.                                         if(lifea[i-1][j]==1){cont++;}
  189.                                         if(lifea[i][j+1]==1){cont++;}
  190.                                         if(lifea[i+1][j]==1){cont++;}
  191.                                         if(lifea[i-1][j+1]==1){cont++;}
  192.                                         if(lifea[i+1][j-1]==1){cont++;}
  193.                                     }
  194.                                     if(lifea[i][j] == 1 && cont < 2)lifea[i][j] = 0;
  195.                                     else if (life[i][j] == 1 && cont > 3)lifea[i][j] = 0;
  196.                                     else if (life[i][j] == 1 && (cont == 2 || cont == 3))lifea[i][j] = 1;
  197.                                     else if (life[i][j] == 0 && cont == 3)lifea[i][j] = 1;
  198.                                     cout<<" "<<lifea[i][j];
  199.                                 }
  200.                                 cout<<endl;
  201.                             }
  202.                             Sleep(2000);
  203.                             o++;
  204.                         }while(o < p);
  205.                         //Fine Controllo
  206.                         break;
  207.                     default:
  208.                         system("cls");
  209.                         goto qua;
  210.                     }
  211.                     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),7);
  212.                     system("pause");
  213.                     return 0;
  214.                 }


PM Quote
Avatar
GuglielmoS (Ex-Member)
Pro


Messaggi: 114
Iscritto: 27/11/2009

Segnala al moderatore
Postato alle 19:17
Martedì, 20/04/2010
Dipende da come hai deciso di implementarlo...
Io avevo deciso che il conteggio delle celle vicine a quelle sui bordi comprendeva anche quelle dalla parte opposta della matrice (diciamo per tenere conto anche del fatto dei limiti).
Esempio:
Codice sorgente - presumibilmente Plain Text

  1. 1 = viva
  2. 0 = morta
  3. matrice = { 0, 0, 0, 0, 0,
  4.             0, 1, 1, 1, 0,
  5.             0, 1, 0, 0, 0,
  6.             0, 0, 1, 1, 0,
  7.             0, 0, 0, 0, 0
  8.           };


Quando vado a vedere le celle vicine della cella(0,0) verificherò lo stato delle celle:
(0,1),(1,0),(1,1)
(4,4),(4,0),(4,1)
(0,4),(1,4)

Ultima modifica effettuata da GuglielmoS il 20/04/2010 alle 19:18


La disumanità del computer sta nel fatto che, una volta programmato e messo in funzione, si comporta in maniera perfettamente onesta.
--Isaac Asimov
PM Quote