Problema Othello in C++

di il
8 risposte

Problema Othello in C++

Salve a tutti ragazzi,
sono nuovo del forum e debutto con una richiesta di aiuto.

Al corso di OOP in C++ mi è stato chiesto, di implementare il gioco di Othello mettendo in pratica le nuove nozioni sulle classi e oggetti.
Il mio problema non è questo ma è di natura logaritmica.

Nella mia classe Othello ho un metodo che ho definito come:
//Inserisce pedina nell tavolo da gioco e compie le azioni di capovolgimento pedina
void Othello::inserisci_mossa(short player, short riga, short colonna) {
     if (player==0) array[riga][colonna] = 'x';          //Inserisce pedina player1
     else if (player==1) array[riga][colonna] = 'o';  //Inserisce pedina player2
     
     //Stampa campo da gioco aggiornato
     for (i=0; i<DIM; i++) {                          
         for (j=0; j<DIM; j++) 
             cout << array[i][j];
         cout << endl;
     }
     cout << endl;
}
Prende come argomenti le cordinate della cella dove posizionare la nuova pedina e il giocatore che compie la mossa.
Mi sono bloccato perchè non riesco a trovare il logaritmo adatto per compiere l'azione di capovolgimento.
Nel gioco di Othello, per chi non lo conoscesse, si devono girare le pedine che sono bloccate agli estremi da pedina avversarie, sia in collonne che righe che diagonali.
Quindi devo compiere questo passaggio e non trovo soluzione. Ci ho provato, ma con il risultato di bug.

Vi chiedo gentilmente una mano e vi ringrazio!

8 Risposte

  • Re: Problema Othello in C++

    Scusate ma non sapreste darmi proprio nessuna idea???
  • Re: Problema Othello in C++

    L'idea sarebbe utilizzare un arrray contenente le coordinate yx per effettuare le verifiche ed eventualmente invertire le pedine.
    Esempio la pedina' X' cerca nelle direzioni 0..7 la presenza della stessa pedina.
    7 0 1
    6 X 2
    5 4 3

    Io quì ti allego un bozzetto ma devi debuggarlo in quanto non lo ho testato...
    
    void Othello::gira_pedine(short player, short riga, short colonna) 
    {
    	int mosse[]={-1,0,-1,1,0,1,1,1,1,0,1,-1,0,-1,-1,-1};
    	int size=sizeof(mosse)/sizeof(int);
    	int k,x,y,found;
    	int row_sav,col_sav;
    	char mio_segno,tuo_segno;
    
    	if (player==0)
    	{
    		mio_segno='x';
    		tuo_segno='o';
    	}
    	else
    	{
    		mio_segno='o';
    		tuo_segno='x';
    	}
    	
    	row_sav=riga;
    	col_sav=colonna;
    	for (k=0;k<size;k+=2)
    	{
    		found=1;
    		do
    		{
    			riga	+=mosse[k];
    			colonna	+=mosse[k+1];
    			if (riga==-1 || colonna==-1 || riga > DIM || colonna > DIM)
    			{
    				found=0;
    				break;
    			}
    		}
    		while (array[riga][colonna]==tuo_segno);
    
    		//
    		if (found && array[riga][colonna]==mio_segno)
    		{
    			riga	=row_sav;
    			colonna	=col_sav;
    			do
    			{
    				riga	+=mosse[k];
    				colonna	+=mosse[k+1];
    				array[riga][colonna] = mio_segno;
    			}while (array[riga][colonna]==tuo_segno);
    		}
    		riga	=row_sav;
    		colonna	=col_sav;
    	}
    }
    
    Saluti,
    Max
  • Re: Problema Othello in C++

    Ho notato un errore nel codice da me scritto. Sul secondo while cambia array e poi lo testa. Per la patch basta aggiungere un char di salvataggio del vecchio valore... Comunque guardandola mi viene in mente una forma + pulita: 1 giro verifica e conta secondo giro esegue...
    Posto UpGrade (sempre in attesa di riscontro di debug da Mr. Otello)
    
    void gira_pedine (short player, short riga, short colonna)
    {
    	int mosse[]={-1,0,-1,1,0,1,1,1,1,0,1,-1,0,-1,-1,-1};
    	int size=sizeof(mosse)/sizeof(int);
    	int k,x,y,count;
    	int row_sav,col_sav;
    	char mio_segno,tuo_segno;
    
    	if (player==0)
    	{
    		mio_segno='x';
    		tuo_segno='o';
    	}
    	else
    	{
    		mio_segno='o';
    		tuo_segno='x';
    	}
    	
    	row_sav=riga;
    	col_sav=colonna;
    	for (k=0;k<size;k+=2)
    	{
    		count=-1;
    		do
    		{
    			count++;
    			riga	+=mosse[k];
    			colonna	+=mosse[k+1];
    			if (riga==-1 || colonna==-1 || riga > DIM || colonna > DIM)
    			{
    				count=0;
    				break;
    			}
    		}
    		while (array[riga][colonna]==tuo_segno);
    
    		//
    		if (count && array[riga][colonna]==mio_segno)
    		{
    			riga	=row_sav;
    			colonna	=col_sav;
    			for (;count;count--)
    			{
    				riga	+=mosse[k];
    				colonna	+=mosse[k+1];
    				array[riga][colonna] = mio_segno;
    			}
    		}
    		riga	=row_sav;
    		colonna	=col_sav;
    	}
    }
    
    
    Saluti,
    Max
  • Re: Problema Othello in C++

    Ciao Max! Davvero eccezionale. Grazie mille davvero.
    Si adatta benissimo al resto del codice, tutto funziona perfettamente.
    Se hai tempo ti chiedo di commentarmi alcuni passaggi che non mi sono chiari, devo capire perchè non ci sono arrivato da solo!
    
    int mosse[]={-1,0,-1,1,0,1,1,1,1,0,1,-1,0,-1,-1,-1};  /**Questo è il vero mistero, con cosa l'hai inizializzato???**/
         int size=sizeof(mosse)/sizeof(int);
         int k,x,y,count;
         int row_sav,col_sav;
         char mio_segno,tuo_segno;
    
         if (player==0)
         {
          array[riga][colonna] = 'x';        /**L'ho aggiunto io per visualizzare l'inserimento**/
          mio_segno='x';
          tuo_segno='o';
          }
          else
          {
          array[riga][colonna] = 'o';       /**Idem**/
          mio_segno='o';
          tuo_segno='x';
          }
       
          row_sav=riga;
          col_sav=colonna;
          for (k=0;k<size;k+=2)             /*      
         {                                              *Cosa fa' questo ciclo e perchè icrementi k di 2 e decrementi count???
              count=-1;                            *
              do                                      */
              {
               count++;
               riga   +=mosse[k];              /** ??? **/
               colonna   +=mosse[k+1];
               if (riga==-1 || colonna==-1 || riga > DIM || colonna > DIM)      
               {
                count=0;
                break;
               }
              } while (array[riga][colonna]==tuo_segno);
    
              //
              if (count && array[riga][colonna]==mio_segno)
              {
               riga   =row_sav;
               colonna   =col_sav;
                 for (;count;count--)
                 {
                     riga   +=mosse[k];
                     colonna   +=mosse[k+1];
                     array[riga][colonna] = mio_segno;
                 }
              }
              riga   =row_sav;
              colonna   =col_sav;
          }
    
    Grazie mille per l'aiuto e la pazienza!
    Abboff
  • Re: Problema Othello in C++

    Prego.
    Vuoi una spiegazione sui punti?

    1) Array mosse
    Davvero banale, ma questa è la logica principale della funzione.
    In questo array come avevo detto precedentemente sono inserite le coordinate Y e X di direzione del controllo.
    Esempio immagina questo schema:
    
             123456789
            +----------+
         1  +?oooooox..+
         2  +oo........+
         3  +o.o.......+
         4  +x..x......+
            +----------+
    
    Ecco che se vado a mettere 'x' in Y=1 e X=1 devo controllare verticalmente (alto e basso), orizzontalmente (sinistra e destra), e diagonalmente (sulle due diagonali) la presenza di 'o '. Per determinare la validità ovviamente devo avere in fondo una 'x'
    Bene, Le direzioni da testare sono 8 e sono kostanti (per esempio cercare la direzione verticale in altro sarà Y-1 e X non subisce variazione -primi 2 elementi dell'array- ecc.. ecc.)
    Ecco che per convenzione ho indicizzato le kostanti (da 0 a 7) su y e x (16 elementi... da 0 a 15),
    dove:
    
    	701
    	6X2
    	543
    
    2) array[riga][colonna] = 'x'; /**L'ho aggiunto io per visualizzare l'inserimento**/
    Secondo me non andava aggiunto in quanto questo già lo fai nella funzione 'inserisci_mossa'.
    E' la TUA funzione che deve chiamare 'gira_pedine' prima della visualizzazione.
    Eventualmente se cio' non fosse possibile per motivi vari (non interessa) era sufficiente agiungere una sola riga di codice dopo la sequenza
    if... else...:
    array[riga][colonna]=mio_segno;

    3) for (k=0;k<size;k+=2) /* Cosa fa' questo ciclo e perchè icrementi k di 2 e decrementi count??? */
    Aumento di 2 perchè l'array è bivalore.. equivale alla definizione int mosse[2][8].
    count non viene decrementato. E' inizializzato a -1 prima di entrare nel giro di conta.

    4) riga +=mosse[k]; /** ??? **/
    aggiungo la costante definitita nel punto 1

    Saluti,
    Max
  • Re: Problema Othello in C++

    Ti ringrazio.

    Credo di dover fare ancora esercizi per riuscire a trovare soluzioni efficenti. Avevo risolto ma con un metodo poco ortdosso e codice poco compatto.

    Buon proseguimento e grazie.
    Abboff
  • Re: Problema Othello in C++

    Ma di nulla, figurati
  • Re: Problema Othello in C++

    PS quello che tu chiami logaritmo forse è algoritmo...
Devi accedere o registrarti per scrivere nel forum
8 risposte