Programma che simula gli scacchi

di il
9 risposte

Programma che simula gli scacchi

Salve e buonasera a tutti !
mi servirebbe una mano per risolvere questo progetto .

Questa la traccia

Si vuole sviluppare un programma legato al gioco degli scacchi. L’algoritmo
considera una scacchiera regolamentare (8x8 caselle bianche e nere, casella
nera in basso a sinistra), dispone a caso (usando la function rand) 8 Pedoni
bianchi (per semplicità, possono stare in una qualunque casella non
occupata da un altro pezzo) e poi dispone a caso (usando la function rand)
un Alfiere e da una Torre neri (possono stare in una qualunque casella non
occupata da un altro pezzo). L’algoritmo deve visualizzare la scacchiera,
mostrando una ‘b’ e una ‘n’ per le caselle bianche e nere non occupate,
mostrando una ‘P’ nelle caselle occupate dai Pedoni, una ‘A’ per la casella
occupata dall’Alfiere e una ‘T’ per la casella occupata dalla Torre. L’algoritmo
determina, in base alla posizione di tutti i pezzi sulla scacchiera, quali sono i
Pedoni che possono essere catturati da uno qualunque dei possibili
movimenti dell’Alfiere e della Torre. Fare attenzione al fatto che un Pedone
potrebbe essere “protetto” da un altro Pedone o da un altro pezzo e che i
Pedoni “protetti” non possono essere catturati. Infine l’algoritmo visualizza
l’elenco dei Pedoni catturabili, precisando anche da quale pezzo sono
catturabili e utilizzando la notazione usuale delle posizioni nel gioco degli
scacchi, ovvero scrivendo, per esempio: Pedone in a3 catturabile da Alfiere
in b4, Pedone in d6 catturabile da Torre in f6,….. Ricordare che nella
notazione usuale degli scacchi le righe della scacchiera sono indicate
mediante numeri interi (da 1 ad 8, dal basso verso l’alto), mentre le colonne
sono indicate mediante lettere dell’alfabeto (da ‘a’ ad ‘h’ da sinistra a destra)
e che la notazione prevede di indicare prima la lettera (colonna) e poi il
numero (riga).

Penso di aver fatto bene fino ad ora .
Però adesso mi sono bloccato . Perché non riesco ad inserire l'Alfiere.
Ogni volta, mi visualizza i pedoni che può catturare l'Alfiere ma li attribuisce alla Torre !
Sono sicuro che mi sto perdendo in un bicchiere d'acqua ...sarà la stanchezza o l'ansia boh ..

Potete aiutarmi a capire dove sbaglio ?

grazie mille !







/*Inizio Programma*/

/*
Librerie incluse per l'utilizzo di vare function all'interno del programma.
*/
#include <stdio.h> 
#include <stdlib.h> 
#include <time.h>
#include <math.h>


/*
Prototipi delle funzioni.
*/
void StampaScacchiera(char [][8]); 
void PedoneSu(char [][8],char [], int, int); 
void PedoneGiu(char [][8],char [], int, int); 
void PedoneDx(char [][8],char [], int, int); 
void PedoneSx(char [][8],char [], int, int);
void PedoneDiagonale1(char [][8], char [], int, int);
void PedoneDiagonale2(char [][8], char [], int, int);
void PedoneDiagonale3(char [][8], char [], int, int);
void PedoneDiagonale4(char [][8], char [], int, int);


int main() 
{ 
    /*
    Dichiarazione delle variabili.
    */
    int i; /* Contatore per i cicli while.*/
    int posRiga, posCol; /* Variabili utilizzate per riempire la scacchiera in modo pseudo-random*/
    srand(time(NULL)); /* Funzione che inizializza lo pseudo-random. Se non ci fosse, ad ogni avvio del programma
                          la posizione dei pedoni , sarebbe sempre la stessa.*/ 
    char colonne[8] = {'a','b','c','d','e','f','g','h'}; /*Dichiarazione e inizializzazione della stringa utilizzata
                                                         per definire le colonne della scacchiera.*/
    char scacchiera[][8] =                     
    {{'b','n','b','n','b','n','b','n'}, 
    {'n','b','n','b','n','b','n','b'}, 
    {'b','n','b','n','b','n','b','n'}, 
    {'n','b','n','b','n','b','n','b'}, 
    {'b','n','b','n','b','n','b','n'}, 
    {'n','b','n','b','n','b','n','b'}, 
    {'b','n','b','n','b','n','b','n'}, 
    {'n','b','n','b','n','b','n','b'}}; /* Dichiarazione e inizializzazione della scacchiera.*/
    char s;
    i = 0; /* Inizializzazione del contatore.*/ 

    while(i<8) 
    { 
        posRiga = rand()%8; 
        posCol = rand()%8; 

        if(scacchiera[posRiga][posCol] == 'b' || scacchiera[posRiga][posCol] == 'n') 
        { 
            scacchiera[posRiga][posCol] = 'P'; 
            i++; 
        } 
    } /* Ciclo while: ripete il clclo finchè la condizione resta soddisfatta. 
         Posiziona in modo casuale i pedoni nella scacchiera, facendo in modo da non sovrascrivere
         eventuali altri pedoni. Alla fine, il contatore viene autoincrementato.*/
     
    i = 0; /* Il contatore viene nuovamente azzerato in modo da poterlo riutilizzare.*/


    while(i<1)
    { 
        posRiga = rand()%8; 
        posCol = rand()%8; 

        if(scacchiera[posRiga][posCol] == 'n') 
        { 
            scacchiera[posRiga][posCol] = 'T';
            i++;
        }
		
    } /* Altro ciclo while: Posiziona in modo casuale la Torre nella scacchiera, facendo attenzione a non sovrascrivere
         eventuali pedoni.*/

    printf("Torre in %c%d puo' catturare i seguenti pedoni: \n\n",colonne[posCol],8-posRiga); /* Stampiamo la posizione della
                                                                                                  Torre.*/
    PedoneSu(scacchiera,colonne,posRiga,posCol);/* Richiamo della funzione PedoneSu.*/
    PedoneGiu(scacchiera,colonne,posRiga,posCol);/* Richiamo della funzione PedoneGiu.*/
    PedoneDx(scacchiera,colonne,posRiga,posCol);/* Richiamo della funzione PedoneDx.*/
    PedoneSx(scacchiera,colonne,posRiga,posCol);/* Richiamo della funzione PedoneSx.*/
    StampaScacchiera(scacchiera);/* Richiamo della funzione StampaScacchiera*/
    
    
	
    system("pause"); /* Dato che sto utilizzando un ambiente di sviluppo Dev, mi è
                        opportuno inserire questo comando in quanto, senza di esso, la finestra di MS-DOS
                        che si apre all'avvio del programma, si chiuderebbe.*/
} 

/*Inizio funzione*/
void StampaScacchiera(char scacchiera[][8]) /* Funzione StampaScacchiera, a cui passiamo la matrice "scacchiera" di tipo char.*/
{ 
    int i,j; /* Dichiarazione di due variabili interne alla funzione, quindi locali ad essa.*/

    printf("\n"); /*"Stampa" un rigo vuoto*/
    printf("   a b c d e f g h\n\n"); /*Stampa ciò che viene scritto tra le parentesi, e va a capo due volte.*/
    for(i=0;i<8;i++) /*Ciclo for: inizializza la variabile i, la incrementa ad ogni ciclo fatto, e si ferma quando 
                             l'indice raggiunge il valore "8".*/
    { 
        printf("%d ",8-i); 
        for(j=0;j<8;j++) /*Ciclo for innestato.*/
        { 
            printf(" %c", scacchiera[i][j]); 
             
        } 
        printf("\n"); 
    }
} /*La funzione, stampa la scacchiera completa.*/
/*Fine funzione.*/

void PedoneSu(char scacchiera[][8], char colonne[], int posRiga, int posCol){
   
   int i = posRiga;
   int pedoneTrovato = 0;
   
   while(i >= 0 && pedoneTrovato == 0){
      
      if(scacchiera[i][posCol] == 'P'){
         printf("Pedone in %c%d\n", colonne[posCol], 8 - i);
         pedoneTrovato = 1;
      }
      else
         i--;
   }
}

void PedoneGiu(char scacchiera[][8], char colonne[], int posRiga, int posCol){
   
   int i = posRiga;
   int pedoneTrovato = 0;
   
   while(i < 8 && pedoneTrovato == 0){
      
      if(scacchiera[i][posCol] == 'P'){
         printf("Pedone in %c%d\n", colonne[posCol], 8 - i);
         pedoneTrovato = 1;
      }
      else
         i++;
   }
}

void PedoneDx(char scacchiera[][8], char colonne[], int posRiga, int posCol){

   int i = posCol;
   int pedoneTrovato = 0;
   
   while(i < 8 && pedoneTrovato == 0){
      
      if(scacchiera[posRiga][i] == 'P'){
         printf("pedone in %c%d\n", colonne[i], 8 - posRiga);
         pedoneTrovato = 1;
      }
      else
         i++;
   }
}

void PedoneSx(char scacchiera[][8], char colonne[], int posRiga, int posCol){
   
   int i = posCol;
   int pedoneTrovato = 0;
   
   while(i >= 0 && pedoneTrovato == 0){
      
      if(scacchiera[posRiga][i] == 'P'){
         printf("pedone in %c%d\n", colonne[i], 8 - posRiga);
         pedoneTrovato = 1;
      }
      else
         i--;
   }
}

void PedoneDiagonale1(char scacchiera[][8], char colonne[], int posRiga, int posCol){
   
   int i = posRiga, j = posCol;
   int pedoneTrovato = 0;

   while(j >= 0 && i < 8 && pedoneTrovato == 0){
      
      if(scacchiera[i][j] == 'P'){
         printf("Pedone in %c%d\n", colonne[j], 8 - i);
         pedoneTrovato = 1;
      }
      else{
         j--;
         i++;
      }
   }
}

void PedoneDiagonale2(char scacchiera[][8], char colonne[], int posRiga, int posCol){
   
   int i = posRiga, j = posCol;
   int pedoneTrovato = 0;
   
   while(i >= 0 && j < 8 && pedoneTrovato == 0){
      
      if(scacchiera[i][j] == 'P'){
         printf("Pedone in %c%d\n", colonne[j], 8 - i);
         pedoneTrovato = 1;
      }
      else{
         i--;
         j++;
      }
   }
}

void PedoneDiagonale3(char scacchiera[][8], char colonne[], int posRiga, int posCol){
   
   int i = posRiga, j = posCol;
   int pedoneTrovato = 0;
   
   while(i >= 0 && j >= 0 && pedoneTrovato == 0){
      
      if(scacchiera[i][j] == 'P'){
         printf("pedone in %c%d\n", colonne[j], 8 - i);
         pedoneTrovato = 1;
      }
      else{
         i--;
         j--;
      }
   }
}

void PedoneDiagonale4(char scacchiera[][8], char colonne [], int posRiga, int posCol){
   
   int i = posRiga, j = posCol;
   int pedoneTrovato = 0;
   
   while(i < 8 && j < 8 && pedoneTrovato == 0){
      
      if(scacchiera[i][j] == 'P'){
         printf("Pedone in %c%d\n", colonne[j], 8 - i);
         pedoneTrovato = 1;
      }
      else{
         i++;
         j++;
      }
   }
}

9 Risposte

  • Re: Programma che simula gli scacchi

    Sto esaminadno il codice, ma vedo qualcosa che non va a livello logico.

    Vedo solo il while per la Torre e non per l'Alfiere.
    e poi perchè metti la torre solo nelle caselle nere?
    
    
            if(scacchiera[posRiga][posCol] == 'n')
            {
                scacchiera[posRiga][posCol] = 'T';
                i++;
            }
          
     
    le torri possono stare anche in quelle bianche, quindi ti consiglierei di fare come per il pedone.

    Inoltre la torre si muove solo lungo colonne e traverse, l'alfiere solo lungo le diagonali, quindi consiglio di dividere i due casi.
  • Re: Programma che simula gli scacchi

    Non ho riportato l'Alfiere perché non riesco ad inserirlo ...
    La traccia dice che Alfiere e Torre devono essere neri .. non mastico gli scacchi ..
  • Re: Programma che simula gli scacchi

    Allora:
    Gli scacchi sono un gioco di guerra tra pezzi "bianchi" e pezzi "neri", come colore dei pezzi, non delle caselle dove si trovano. diciamo che in modo generico qualsiasi pezzo potrebbe trovarsi in qualsiasi casella. (quasi tutti , in realtà i pedoni non potrebbero trovarsi in 1° e 8° traversa (linea di caselle orrizzontali)

    ora il pezzo di codice che hai usato per il pedone va bene per Torre e Alfiere, basta sostiutuire P con T ed A, visto che opera la sostituzione solo dove trova b o n come caselle
  • Re: Programma che simula gli scacchi

    Così ci ho già provato ...
    ma mi visualizza due scacchiere
    la prima con la Torre , la seconda con l'Alfiere .. però esce sempre e solo la T della Torre nelle due scacchiere ...
  • Re: Programma che simula gli scacchi

    Appena provato... visualizzo una sola scacchiera, con P , A e T (oltre ale caselle b & n)

    attento a come ricopi il codice e ricordati di azzerare il contatore

    Altro piccolo consiglio, forse potresti creare 2 strutture di 2 elementi.

    Ogni struttura contiene cosi le coordinate di T e P (potresti farlo pure per i pedoni, a te la scelta)

    cosi quando cerchi i pedoni catturabili dalla torre, non serve che ti cerchi dove è la Torre, ma hai già le coordinate salvate.
  • Re: Programma che simula gli scacchi

    Così ho provato a fare io
     while(i<8) 
        { 
            posRiga = rand()%8; 
            posCol = rand()%8; 
    
            if(scacchiera[posRiga][posCol] == 'b' || scacchiera[posRiga][posCol] == 'n') 
            { 
                scacchiera[posRiga][posCol] = 'P'; 
                i++; 
            } 
        } /* Ciclo while: ripete il clclo finchè la condizione resta soddisfatta. 
             Posiziona in modo casuale i pedoni nella scacchiera, facendo in modo da non sovrascrivere
             eventuali altri pedoni. Alla fine, il contatore viene autoincrementato.*/
         
        i = 0; /* Il contatore viene nuovamente azzerato in modo da poterlo riutilizzare.*/
    
    
        while(i<2)
        { 
            posRiga = rand()%8; 
            posCol = rand()%8; 
    
            if(scacchiera[posRiga][posCol] == 'b' || scacchiera[posRiga][posCol] == 'n')
            { 
                scacchiera[posRiga][posCol] = 'T';
                i++;
            }
    		if(scacchiera[posRiga][posCol] == 'b' || scacchiera[posRiga][posCol] == 'n')
    		{
    			scacchiera[posRiga][posCol] = 'A';
    			i++;
    		}
        } /* Altro ciclo while: Posiziona in modo casuale la Torre nella scacchiera, facendo attenzione a non sovrascrivere
             eventuali pedoni.*/
        
        printf("Torre in %c%d puo' catturare i seguenti pedoni: \n\n",colonne[posCol],8-posRiga); /* Stampiamo la posizione della
                                                                                                      Torre.*/
        PedoneSu(scacchiera,colonne,posRiga,posCol);/* Richiamo della funzione PedoneSu.*/
        PedoneGiu(scacchiera,colonne,posRiga,posCol);/* Richiamo della funzione PedoneGiu.*/
        PedoneDx(scacchiera,colonne,posRiga,posCol);/* Richiamo della funzione PedoneDx.*/
        PedoneSx(scacchiera,colonne,posRiga,posCol);/* Richiamo della funzione PedoneSx.*/
        StampaScacchiera(scacchiera);/* Richiamo della funzione StampaScacchiera*/
        
        printf("Alfiere in %c%d puo' catturare i seguenti pedoni: \n\n",colonne[posCol],8-posRiga);
        PedoneDiagonale1(scacchiera,colonne,posRiga,posCol);
        PedoneDiagonale2(scacchiera,colonne,posRiga,posCol);
        PedoneDiagonale3(scacchiera,colonne,posRiga,posCol);
        PedoneDiagonale4(scacchiera,colonne,posRiga,posCol);
        
        
    Inoltre mi compaiono sempre sulla stessa casella
  • Re: Programma che simula gli scacchi

    Opera singolarmente
    
    
    /* PEDONE */
    while(i<8)
        {
            posRiga = rand()%8;
            posCol = rand()%8;
    
            if(scacchiera[posRiga][posCol] == 'b' || scacchiera[posRiga][posCol] == 'n')
            {
                scacchiera[posRiga][posCol] = 'P';
                i++;
            }
        } /* Ciclo while: ripete il clclo finchè la condizione resta soddisfatta.
             Posiziona in modo casuale i pedoni nella scacchiera, facendo in modo da non sovrascrivere
             eventuali altri pedoni. Alla fine, il contatore viene autoincrementato.*/
    
        i = 0; /* Il contatore viene nuovamente azzerato in modo da poterlo riutilizzare.*/
       
       /*TORRE*/
        while(i<1)
        {
            posRiga = rand()%8;
            posCol = rand()%8;
    
            if(scacchiera[posRiga][posCol] == 'b' || scacchiera[posRiga][posCol] == 'n')
            {
                scacchiera[posRiga][posCol] = 'T';
                i++;
            }
        } /* Ciclo while: ripete il clclo finchè la condizione resta soddisfatta.
             Posiziona in modo casuale i pedoni nella scacchiera, facendo in modo da non sovrascrivere
             eventuali altri pedoni. Alla fine, il contatore viene autoincrementato.*/
        i=0;
    
    /*ALFIERE*/
        while(i<1)
        {
            posRiga = rand()%8;
            posCol = rand()%8;
    
            if(scacchiera[posRiga][posCol] == 'b' || scacchiera[posRiga][posCol] == 'n')
            {
                scacchiera[posRiga][posCol] = 'A';
                i++;
            }
        } /* Ciclo while: ripete il clclo finchè la condizione resta soddisfatta.
             Posiziona in modo casuale i pedoni nella scacchiera, facendo in modo da non sovrascrivere
             eventuali altri pedoni. Alla fine, il contatore viene autoincrementato.*/
             
             
    Ora il problema è che non si "ricorda" dove ha messo la T.
    2 soluzione : o la cerchi oppure ti porti etro le coordinate
  • Re: Programma che simula gli scacchi

    Caro .. come avevo detto ... mi perdevo in un bicchiere d'acqua ...
    praticamente richiamavo la funzione "StampaScacchiera" prima della printf dell'Alfiere ...
    grazie al c**** che non me lo visualizzava


    Grazie per l'aiuto
  • Re: Programma che simula gli scacchi

    Cmq sto vedendo che ci sono problemi di coordinate. tutto bene ma conteggia i pedoni come se T e A fossero sfasati risdpetto alla loro posizione, ricontrolla bene le coordinate di A e T nelle varie funzioni
Devi accedere o registrarti per scrivere nel forum
9 risposte