Tris in c++

peppelio93
salve ragazzi ho provato a scrivere questo programma in c++ del tris solo che è venuto estremamente lungo come posso farlo piu semplice e corto?

#include <iostream.h>
#include <stdlib.h>
#include <time.h>

const int dim=30;

int main()

{ 
  cout << " \t\t\t ***TRIS*** \n";
  
  char A='q',B='q',C='q',D='q',E='q',F='q',G='q',H='q',I='q';
  
  int a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,k=0;
  int ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,kc =0; 
  
  char as,bs,cs,ds,es,fs,gs,hs,is;

  char scelta;
  cout<<endl;
  
  int var;

  do 
    
    {
    //giocate possibili

  
    char gioco;

    //giocate possibili

    char gioca,computer;
    char* disegno[dim][dim];
    int numero,x,y;

    for(int i=0;i<dim;i++)
      {
	for(int j=0;j<dim;j++)
	  {
	    disegno[i][j]="  ";
	    
	    if(i==0||i==dim-1||j==0||j==dim-1)
	      
	      {
		disegno[i][j]=" .";
	      }
	    
	    if((i==dim/3)||(i==dim/3*2))
	      {
		disegno[i][j]=" *";
	      }
	    if((j==dim/3)||(j==dim/3*2))	
	      {
		disegno[i][j]=" *";
	      }
	  }
	
      }
  
    do
      
      {


	if(A=='q')
	  {
	    as='a';
	  }
	if(A=='a')
	  {
	    as=' ';
	  }
	
	if(B=='q')
	  {
	    bs='b';
	  }
	if(B=='b')
	  {
	    bs=' ';
	  }
	
	if(C=='q')
	  {
	    cs='c';
	  }
	if(C=='c')
	  {
	    cs=' ';
	  }
	
	if(D=='q')
	  {
	    ds='d';
	  }
	if(D=='d')
	  {
	    ds=' ';
	  }
	
	if(E=='q')
	  {
	    es='e';
	  }
	if(E=='e')
	  {
	    es=' ';
	  }
	
	if(F=='q')
	  {
	    fs='f';
	  }
	if(F=='f')
	  {
	    fs=' ';
	  }
	
	if(G=='q')
	  {
	    gs='g';
	  }
	if(G=='g')
	  {
	    gs=' ';
	  }
	
	if(H=='q')
	  {
	    hs='h';
	  }
	if(H=='h')
	  {
	    hs=' ';
	  }
	
	if(I=='q')
	  {
	    is='i';
	  }
	if(I=='i')
	  {
	    is=' ';
	  }


	cout<<"dove giochi? scegli tra :\n\n\n\t"<<as<<"\t"<<bs<<"\t"<<cs
	    <<"\n\n\n\t"<<ds<<"\t"<<es<<"\t"<<fs<<"\n\n\n\t"<<gs<<"\t"<<hs<<"\t"<<is;
	cout<<endl<<endl;
	cin>>gioco;
	cout<<endl<<endl;
	
	switch(gioco)
	  
	  {
	  case 'a':
	  
	    A='a';
	    
	    a=1;
	    
	    for(int i=0;i<dim;i++)
	      
	      {
		for(int j=0;j<dim;j++)
		  
		  {
		    x=i;
		    y=j;
		    
		    if((y==x)&&(y<dim/3-1)&&(y>1))
		      {
			disegno[i][j]=" *";
		      }
		    if (y==-x+dim/3&&(x<dim/3-1)&&(x>1))
		      {
			disegno[i][j]=" *";
		      }
		    
		  }
	      };break;
	    
	case 'b':
	  
	  B='b';
	  
	  b=2;
	  
	  for(int i=0;i<dim;i++)
	    
	    {
	      for(int j=0;j<dim;j++)
		
		{
		  x=i;
		  y=j;
		  
		  if((y==x+dim/3)&&(y<dim/3*2-1)&&(y>dim/3+1))
		    {
		      disegno[i][j]=" *";
		    }
		  if (y==-x+(dim/3)*2&&(x<dim/3-1)&&(x>1))
		    {
		      disegno[i][j]=" *";
		    }
		  
		}
	    };break;
	  
	case 'c':
	  
	  C='c';

	  c=3;

	  for(int i=0;i<dim;i++)
	    
	    {
	      for(int j=0;j<dim;j++)
		
		{
		  x=i;
		  y=j;
		  
		  if((y==x+dim/3*2)&&(y<dim-1)&&(y>dim/3*2+1))
		    {
		      disegno[i][j]=" *";
		    }
		  if (y==-x+dim&&(x<dim/3-1)&&(x>1))
		    {
		      disegno[i][j]=" *";
		    }
		  
		}
	    };break;
	  
	  
	case 'd':
	  
	  D='d';
	  
	  d=4;

	  for(int i=0;i<dim;i++)
	    
	    {
	      for(int j=0;j<dim;j++)
		
		{
		  x=i;
		  y=j;
		  
		  if((y==x-dim/3)&&(y<dim/3-1)&&(y>1))
		    {
		      disegno[i][j]=" *";
		    }
		  if (y==-x+(dim/3)*2&&(x<dim/3*2-1)&&(x>dim/3+1))
		    {
		      disegno[i][j]=" *";
		    }
		  
		}
	    };break;
	  
	case 'e':
	  
	  E='e';

	  e=5;

	  for(int i=0;i<dim;i++)
	    
	    {
	      for(int j=0;j<dim;j++)
		
		{
		  x=i;
		  y=j;
		  
		  if((y==x)&&(y<dim/3*2-1)&&(y>dim/3+1))
		    {
		      disegno[i][j]=" *";
		    }
		  if (y==-x+dim &&(x<dim/3*2-1)&&(x>dim/3+1))
		    {
		      disegno[i][j]=" *";
		    }
		  
		}
	    };break;
	  
	  
	case 'f':
	  
	  F='f';

	  f=6;
	  
	  for(int i=0;i<dim;i++)
	    
	    {
	      for(int j=0;j<dim;j++)
		
		{
		  x=i;
		  y=j;
		  
		  if((y==x+dim/3)&&(y<dim-1)&&(y>dim/3*2+1))
		    {
		      disegno[i][j]=" *";
		    }
		  if (y==-x+dim+dim/3&&(x<dim/3*2-1)&&(x>dim/3+1))
		    {
		      disegno[i][j]=" *";
		    }
		  
		}
	    };break;
	  
	case 'g':
	  
	  G='g';

	  g=7;
	  
	  for(int i=0;i<dim;i++)
	    
	    {
	      for(int j=0;j<dim;j++)
		
		{
		  x=i;
		  y=j;
		  
		  if((y==x-dim/3*2)&&(y<dim/3-1)&&(y>1))
		    {
		      disegno[i][j]=" *";
		    }
		  if (y==-x+dim&&(x>dim/3*2+1)&&(x<dim-1))
		    {
		      disegno[i][j]=" *";
		    }
		  
		}
	    };break;
	  
	case 'h':
	  
	  H='h';

	  h=8;

	  for(int i=0;i<dim;i++)
	    
	    {
	      for(int j=0;j<dim;j++)
		
		{
		  x=i;
		  y=j;
		  
		  if((y==x-dim/3)&&(y<dim/3*2-1)&&(y>dim/3+1))
		    {
		      disegno[i][j]=" *";
		    }
		  if (y==-x+dim+dim/3&&(x>dim/3*2+1)&&(x<dim-1))
		    {
		      disegno[i][j]=" *";
		    }
		  
		}
	    };break;
	  
	  
	case 'i':
	  
	  I='i';

	  k=9;

	  for(int i=0;i<dim;i++)
	    
	    {
	      for(int j=0;j<dim;j++)
		
		{
		  x=i;
		  y=j;
		  
		  if((y==x)&&(y<dim-1)&&(y>dim/3*2+1))
		    {
		      disegno[i][j]=" *";
		    }
		  if (y==-x+dim+dim/3*2&&(x<dim-1)&&(x>dim/3*2+1))
		    {
		      disegno[i][j]=" *";
		    }
		  
		}
	    };break;
	}
      
	
do
  
  {
    
    var=0;
    numero=rand()%9;    
    
    
    if((a+b==3||ac+bc==3) && C=='q')
      {
	numero=2;
      }
    
    if((c+b==5||cc+bc==5) && A=='q')
      {
	numero=0;
      }

    if((a+d==5||ac+dc==5) && G=='q')
      {
	numero=6;
	
      }
    
    if((g+d==11||gc+dc==11) && A=='q')
      {
	numero=0;
      }

    if((g+h==15||gc+hc==15) && I=='q')
      {
	numero=8;
      }

    if((k+h==17||kc+hc==17) && G=='q')
      {
	numero=6;
      }

    if((b+e==7||bc+ec==7) && H=='q')
      {
	numero=7;
      }

    if((h+e==13||hc+ec==13) && B=='q')
      {
	numero=1;
      }

    if((c+e==8||cc+ec==8) && G=='q')
      {
	numero=6;
      }

    if((g+e==12||gc+ec==12) && C=='q')
      {
	numero=2;
      }

    if((d+e==9||dc+ec==9) && F=='q')
      {
	numero=5;
      }

    if((f+e==11||fc+ec==11) && D=='q')
      {
	numero=3;
      }

    if((c+f==9||cc+fc==9) && I=='q')
      {
	numero=8;
      }

    if((k+f==15||kc+fc==15) && C=='q')
      {
	numero=2;
      }

    if((a+e==6||ac+ec==6) && I=='q')
      {
	numero=8;
      }

    if((e+k==14||ec+kc==14) && A=='q')
      {
	numero=0;
      }

    if (numero==0 && A =='q')
      
      {
	computer='a';
	var=1;
      }
    
    if (numero==1 && B=='q')
      
      {
	computer='b';
	var=1;
      }

    if (numero==2 && C=='q')

      {
	computer='c';
	var=1;
      }
   
    if (numero==3 && D=='q')

      {
	computer='d';
	var=1;
      }

    if (numero==4 && E=='q')

      {
	computer='e';
	var=1;
      }

    if (numero==5 && F=='q')

      {
	computer='f';
	var=1;
      }

    if (numero==6 && G=='q')

      {
	computer='g';
	var=1;
      }

    if (numero==7 && H=='q')

      {
	computer='h';
	var=1;
      }

    if (numero==8 && I=='q')

      {
	computer='i';
	var=1;
      }
    
    if (
	(a+b+c)==6||(a+e+k)==15||(a+d+g)==12||(b+e+h)==15||(c+e+g)==15
	||(d+e+f)==13||(c+f+k)==18||(g+h+k)==24
	)
      
      {
	cout<<endl<<endl;
	var=100;
	numero=100;
      }
    if (
	(ac+bc+cc)==6||(ac+ec+kc)==15||(ac+dc+gc)==12||(bc+ec+hc)==15||(cc+ec+gc)==15
	||(dc+ec+fc)==13||(cc+fc+kc)==18||(gc+hc+kc)==24
	)
      
      {
	cout<<endl<<endl;
	var=100;
	numero=100;
      }
    
    
      }
    while(var==0);

	switch(computer)
	  
	  {
	  case 'a':
	    
	    A='a';
	   
	    ac=1;
	    
	    for(int i=0;i<dim;i++)
	      
	      {
		for(int j=0;j<dim;j++)
		  
		  {
		    x=i;
		    y=j;
		    
		    if((y==x)&&(y<dim/3-1)&&(y>1))
		      {
			disegno[i][j]=" .";
		      }
		    if (y==-x+dim/3&&(x<dim/3-1)&&(x>1))
		      {
			disegno[i][j]=" .";
		      }
		    
		  }
	      };break;
	    
	case 'b':
	  
	  B='b';

	  bc=2;

	  for(int i=0;i<dim;i++)
	    
	    {
	      for(int j=0;j<dim;j++)
		
		{
		  x=i;
		  y=j;
		  
		  if((y==x+dim/3)&&(y<dim/3*2-1)&&(y>dim/3+1))
		    {
		      disegno[i][j]=" .";
		    }
		  if (y==-x+(dim/3)*2&&(x<dim/3-1)&&(x>1))
		    {
		      disegno[i][j]=" .";
		    }
		  
		}
	    };break;
	  
	case 'c':
	  
	  C='c';
	  
	  cc=3;
	  
	  for(int i=0;i<dim;i++)
	    
	    {
	      for(int j=0;j<dim;j++)
		
		{
		  x=i;
		  y=j;
		  
		  if((y==x+dim/3*2)&&(y<dim-1)&&(y>dim/3*2+1))
		    {
		      disegno[i][j]=" .";
		    }
		  if (y==-x+dim&&(x<dim/3-1)&&(x>1))
		    {
		      disegno[i][j]=" .";
		    }
		  
		}
	    };break;
	  
	  
	case 'd':
	  
	  D='d';

	  dc=4;

	  for(int i=0;i<dim;i++)
	    
	    {
	      for(int j=0;j<dim;j++)
		
		{
		  x=i;
		  y=j;
		  
		  if((y==x-dim/3)&&(y<dim/3-1)&&(y>1))
		    {
		      disegno[i][j]=" .";
		    }
		  if (y==-x+(dim/3)*2&&(x<dim/3*2-1)&&(x>dim/3+1))
		    {
		      disegno[i][j]=" .";
		    }
		  
		}
	    };break;
	  
	case 'e':
	  
	  E='e';
	  
	  ec=5;

	  for(int i=0;i<dim;i++)
	    
	    {
	      for(int j=0;j<dim;j++)
		
		{
		  x=i;
		  y=j;
		  
		  if((y==x)&&(y<dim/3*2-1)&&(y>dim/3+1))
		    {
		      disegno[i][j]=" .";
		    }
		  if (y==-x+dim &&(x<dim/3*2-1)&&(x>dim/3+1))
		    {
		      disegno[i][j]=" .";
		    }
		  
		}
	    };break;
	  
	  
	case 'f':
	  
	  F='f';

	  fc=6;

	  for(int i=0;i<dim;i++)
	    
	    {
	      for(int j=0;j<dim;j++)
		
		{
		  x=i;
		  y=j;
		  
		  if((y==x+dim/3)&&(y<dim-1)&&(y>dim/3*2+1))
		    {
		      disegno[i][j]=" .";
		    }
		  if (y==-x+dim+dim/3&&(x<dim/3*2-1)&&(x>dim/3+1))
		    {
		      disegno[i][j]=" .";
		    }
		  
		}
	    };break;
	  
	case 'g':
	  
	  G='g';

	  gc=7;

	  for(int i=0;i<dim;i++)
	    
	    {
	      for(int j=0;j<dim;j++)
		
		{
		  x=i;
		  y=j;
		  
		  if((y==x-dim/3*2)&&(y<dim/3-1)&&(y>1))
		    {
		      disegno[i][j]=" .";
		    }
		  if (y==-x+dim&&(x>dim/3*2+1)&&(x<dim-1))
		    {
		      disegno[i][j]=" .";
		    }
		  
		}
	    };break;
	  
	case 'h':
	  
	  H='h';

	  hc=8;

	  for(int i=0;i<dim;i++)
	    
	    {
	      for(int j=0;j<dim;j++)
		
		{
		  x=i;
		  y=j;
		  
		  if((y==x-dim/3)&&(y<dim/3*2-1)&&(y>dim/3+1))
		    {
		      disegno[i][j]=" .";
		    }
		  if (y==-x+dim+dim/3&&(x>dim/3*2+1)&&(x<dim-1))
		    {
		      disegno[i][j]=" .";
		    }
		  
		}
	    };break;
	  
	  
	case 'i':

	  I='i';	  
	  
	  kc=9;

	  for(int i=0;i<dim;i++)
	    
	    {
	      for(int j=0;j<dim;j++)
		
		{
		  x=i;
		  y=j;
		  
		  if((y==x)&&(y<dim-1)&&(y>dim/3*2+1))
		    {
		      disegno[i][j]=" .";
		    }
		  if (y==-x+dim+dim/3*2&&(x<dim-1)&&(x>dim/3*2+1))
		    {
		      disegno[i][j]=" .";
		    }
		  
		}
	    };break;
	}
      





    cout<<"vuoi stampare il gioco?(s/n)\t\t";
    cin>>gioca;

    if(gioca=='s')

      {
	for (int i=0;i<dim;i++)
	  {
	    cout<<endl;
	    
	    for(int j=0;j<dim;j++)
	      
	      {
		cout<<disegno[i][j];
	      }
	  }
      }

    if (
	(a+b+c)==6||(a+e+k)==15||(a+d+g)==12||(b+e+h)==15||(c+e+g)==15
	||(d+e+f)==15||(c+f+k)==18||(g+h+k)==24
	)

      {
	cout<<endl<<endl;
	cout<<"\t\t\t\t\t\tCOMPLIMENTI!!! HAI VINTO !!!\a";
      }

    else if

      (
       (ac+bc+cc)==6||(ac+ec+kc)==15||(ac+dc+gc)==12||(bc+ec+hc)==15||(cc+ec+gc)==15
       ||(dc+ec+fc)==15||(cc+fc+kc)==18||(gc+hc+kc)==24
       )
      
      {
	cout<<endl<<endl;
	cout<<"\t\t\t\t\t\tHAI PERSO !!!\a";
      }

    cout<<endl<<endl;
    cout<<numero;
    cout<<endl<<endl;
    cout<<"giochi ancora?\t(s/n)\t\t";
    cin>>scelta;
    cout<<endl<<endl;
  
    }
    while (scelta!='n');
    }
 while (scelta!='n');
}

Risposte
apatriarca
I metodi che si usano per ridurre la lunghezza di codici come quello che hai mostrato sono principalmente i seguenti:
1. Usare array ed indici al posto di tante variabili quando sia possibile trattare queste variabili nello stesso modo.
2. Estrarre parti di codice che si ripetono in funzioni separate.
3. Rivedere eventualmente la struttura del programma.
4. Formattare meglio il codice.

EDIT: :roll: Ho provato il programma e in caso di pareggio non sembra permettere di fare niente e non stampa alcun risultato. In caso di vittoria mi stampa che ho vinto, ma mi chiede se voglio continuare a giocare. Premendo che voglio continuare mi permette di giocare ancora in solitario sulla stessa scheda. Se perdo mi permette nello stesso modo di continuare a inserire croci in solitario e finire comunque vittorioso.

peppelio93
ho riscontrato anche io questi problemi ma prima di dedicarmici volevo riuscirlo a ridurlo perché presentarlo ad un esame cosi lungo non mi conviene...=)

apatriarca
Più che un problema di lunghezza (ho scritto e letto codici sorgente ben più lunghi di questo), il problema principale che vedo è la lunghezza della funzione main. E' quindi molto importante riuscire a estrarre parti del codice e iniziare a scriverle in funzioni separate. Puoi per esempio iniziare estraendo la funzione che stampa la scheda del tris*.

* Ma è una richiesta esplicita del professore quella di stamparla così grossa e usando croci fatte di caratteri diversi invece che i più classici cerchi e croci. Il modo più semplice (e forse comodo a livello di scrittura e utilizzo del programma) è quello di stampare qualcosa del genere (ipotetica fase di gioco):
 | |
-+-+-
 |x| 
-+-+-
o|x|o 

C'è poi una ragione per cui devi rispondere in continuazione che vuoi continuare a vedere il gioco? Immagino che se uno sta giocando voglia sempre continuare fino ad aver vinto o perso. Credo possa alla fine essere comodo avere una visione del gioco mentre si sceglie e che non sia necessario usare lettere quando si possono usare numeri come segue(stessa situazione di gioco di prima):
1|2|3
-+-+-
4|x|6
-+-+-
o|x|o

I numeri sono anche a mio parere più immediati da associare alle caselle ma è solo una mia opinione (anche più facili da programmare..).

peppelio93
ti ringrazio davvero tnt provero a eseguire queste modifiche. =)

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.