Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Algoritmo scacchi
Forum - C/C++ - Algoritmo scacchi - Pagina 2

Pagine: [ 1 2 3 4 5 ] Precedente | Prossimo
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 16:23
Giovedì, 04/01/2007
Testo quotato

Postato originariamente da clikkami:
come faccio a determinare la posizione dei pedoni?
se un PEDONE sta in B7 come fa a capirlo il programma, se è stato messo casualmente?



Ciclo iterativo nidificato come nella funzione che stampa la scacchiera sullo schermo che controlla se l'elemento alle coordinate [i,j] contiene una 'P'. A quel punto controllando le variabili i e j e' possibile trovare la coordinata.

Testo quotato


La 'P' non può stare nè in linea orizzontale nè in linea verticale alla 'T'...mentre alla 'R' non può stare neanke in linea obliqua. poi se una 'P' è coperta da un'altra 'P' non può essere mangiata... Nn so proprio come iniziare!!!  



Prova a pensare un po'... potresti fare una funzione che controlla se un determinato pedone e' coperto da un altro, qualcosa del tipo:

Codice sorgente - presumibilmente C/C++

  1. boolean pawnCovered(int i, int j){ //i e j: coordinate
  2.   //controllo se c'e' un pedone nella posizione i-1, j-1
  3. }



Poi trovando le coordinate della regina e della torre, controlli quali sono i pedoni che sono nella via della torre (facile, controllando tutte le coordinate poste in linea orizzontale e verticale rispetto alla torre) e della regina (un po' piu' complesso, controllando in orizzontale e verticale come la torre, piu' in diagonale). Dopodiche' per ogni pedone trovato nella via di questo controllo, vedere se e' coperto tramite la funzione creata precedentemente e in caso negativo stampare il risultato sullo schermo.

Ultima modifica effettuata da pierotofy il 04/01/2007 alle 16:25


Il mio blog: https://piero.dev
PM Quote
Avatar
clikkami (Normal User)
Newbie


Messaggi: 14
Iscritto: 01/01/2007

Segnala al moderatore
Postato alle 14:06
Venerdì, 05/01/2007
Ciao guarda a ke punto sn arrivato!!!

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

void printScacchiera(char [][8]);
void ReginaNord(char [][8],char [], int, int);
void ReginaSud(char [][8],char [], int, int);
void ReginaEst(char [][8],char [], int, int);
void ReginaOvest(char [][8],char [], int, int);

void main(void)
{
    int i;
    int posRiga, posCol;

    char colonne[8] = {'a','b','c','d','e','f','g','h'};

    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'}};

    srand(time(NULL));

    i = 0;

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

        if(scacchiera[posRiga][posCol] == 'b' || scacchiera[posRiga][posCol] == 'n')
        {
            scacchiera[posRiga][posCol] = 'P';
            i++;
        }
    }
    
    i = 0;

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

        if(scacchiera[posRiga][posCol] == 'b' || scacchiera[posRiga][posCol] == 'n')
        {
            scacchiera[posRiga][posCol] = 'R'; // Regina
            i++;
        }
    }

    printf("Regina in %c%d puo' catturare i seguenti pedoni: \n\n",colonne[posCol],8-posRiga);
    ReginaNord(scacchiera,colonne,posRiga,posCol);
    ReginaSud(scacchiera,colonne,posRiga,posCol);
    ReginaEst(scacchiera,colonne,posRiga,posCol);
    ReginaOvest(scacchiera,colonne,posRiga,posCol);
    printScacchiera(scacchiera);
}

void printScacchiera(char scacchiera[][8])
{
    int i,j;

    printf("\n");
    printf("  a b c d e f g h\n\n");
    for(i=0;i<8;i++)
    {
        printf("%d",8-i);
        for(j=0;j<8;j++)
        {
            printf(" %c", scacchiera[i ][j]);
            
        }
        printf("\n");
    }
}



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

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

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

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

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

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

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

Le funzioni della torre le ho già messe xò mi funziona quindi nn te le ho fatte vedere... xò adesso mi sn bloccato su un'altra cosa!!!
la regina può mangiare anke in diagonale, quindi devo crearmi altre 4 funzioni con le posizioni NordEst,NordOvest,SudEst,SudOvest...
ma cosa devo cambiare nell'implementazione?
fammi capire solo per nordovest cosa devo fare...
ciao e ti ringrazio nuovamente

Ultima modifica effettuata da pierotofy il 05/01/2007 alle 16:00
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 16:06
Venerdì, 05/01/2007
La funzione e' la stessa, solamente che devi controllare in diagonale (quindi oltre che a muoverti in orizzontale, devi muoverti in verticale), per la funzione ReginaNordOvest potresti fare qualcosa come:

Codice sorgente - presumibilmente C#

  1. void ReginaNordOvest(char scacchiera[][8],char colonne[], int posRiga, int posCol)
  2. {
  3. int i,j, pedoneTrovato = 0;
  4.  
  5. [b]for(i=posCol, j=posRiga; i>=0 && j>=0;i--, j--) [/b]
  6. {
  7. if((scacchiera[j][i ] == 'P') && (pedoneTrovato == 0))
  8. {
  9. if((scacchiera[j-1][i-1] != 'P') && (scacchiera[j-1][i+1] != 'P'))
  10. {
  11. printf("Pedone in %c%d\n",colonne[i ],8-j);
  12. pedoneTrovato = 1;
  13. }
  14. else
  15. {
  16. pedoneTrovato = 1;
  17. }
  18. }
  19. }
  20. }



Non ho testato il codice, ma dovrebbe funzionare. Ho evidenziato le parti differenti rispetto a ReginaOvest.


Il mio blog: https://piero.dev
PM Quote
Avatar
clikkami (Normal User)
Newbie


Messaggi: 14
Iscritto: 01/01/2007

Segnala al moderatore
Postato alle 17:20
Venerdì, 05/01/2007
Grazie Mille...sn riuscito finalmente a finire il progetto della scacchiera...ora devo dedicarmi a quello delle medie!!!
Spero  ci metta meno tempo!!!
mi farò sentire
ciao grazie

PM Quote
Avatar
clikkami (Normal User)
Newbie


Messaggi: 14
Iscritto: 01/01/2007

Segnala al moderatore
Postato alle 13:08
Domenica, 07/01/2007
#include <stdio.h>
#include <stdlib.h>
void calcolo_media(int , int );
//* MAIN //
void main()
{
float A_diffuso1[][8];
float A_diffuso2[][10];
float A_diffuso3[][15];
float A_diffuso4[][20];
float x_casuale=-100.0F+200.0F*(float)rand()/(float)RAND_MAX;
float x_media,a,b;
int cont,ga,i,j;

//* input dimensioni //
printf("Inserire i numeri 8,10,15,20, per ricevere un'array quadrato delle dimensioni inserite,\n")
("\formato da numeri casuali nell'intervallo [-100,100]: ");
scanf("%d", &ga);

//* costruzione array //
if (ga==8) { costr_a_diffuso1; }
if (ga==10){ costr_a_diffuso2; }
if (ga==15) { costr_a_diffuso3; }
if (ga==20) { costr_a_diffuso4; }

//* calcolo media //
calcolo_media;
}

//* Function //
//* costruzione array2D //
costr_a_diffuso1(float a,b);
{
for (i=1;i<=9;i++)
for (j=1;j<=9;j++) {
a=x_casuale;
b=x_casuale;
}
printf("A_diffuso1[a]");
}

costr_a_diffuso2(float a,b);
{
for (i=1;i<=11;i++)
for (j=1;j<=11;j++) {
a=x_casuale;
b=a_casuale;
}
printf("A_diffuso2[a]");
}

costr_a_diffuso3(float a,b);
{
for (i=1;i<=16;i++)
for (j=1;j<16;j++) {
a=x_casuale;
b=x_casuale;
}
printf("A_diffuso3[a]");
}

costr_a_diffuso4(float a,b);
{
for (i=1;i<=21;i++)
for (j=1;j<=21;j++) {
a=x_casuale;
b=x_casuale;
}
void calcolo_media(int riga, int colonna)
{
double somma = 0;
int count = 0;
if (riga-1 >=0 )
{
somma += matrice[riga-1][colonna];
count++;
}
/* faccio lo stesso con riga+1, colonna-1, colonna+1, attento alle condizioni di bordo*/
media[riga][colonna] = somma / count;
}

Secondo me ho sbajato molte cose...ma nn riesco a capire dove!!!

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 16:05
Lunedì, 08/01/2007
Direi che c'e' parecchia confusione nel codice, ma non voglio correggertelo tutto io (senno' dopo non ti diverti pure tu :) ).

Prova a ristrutturare il programma facendo in modo che:

- Ci sia una variabile globale in cui salvare le dimensioni (chiedendo all'utente) dell'array
- Usare gli operatori new e delete del C++ per creare l'array in maniera dinamica (qui non sto a spiegarti come funziona l'allocamento dinamico in C++, ma in internet puoi trovare dozzine di articoli)
- Creare una funzione calculate_new_array_coord(int i, int j) che calcoli nell'array di output il valore preso dalle coordinate dell'array di input[i ][j].
- Per comodita' ti suggerisco di definire le variabili degli array di input/output come globali.

Fammi sapere.

Ultima modifica effettuata da pierotofy il 08/01/2007 alle 16:06


Il mio blog: https://piero.dev
PM Quote
Avatar
clikkami (Normal User)
Newbie


Messaggi: 14
Iscritto: 01/01/2007

Segnala al moderatore
Postato alle 17:20
Mercoledì, 10/01/2007
Ho pensato di rifarlo...
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
void main ()
{
    int i=0,j=0;
    float x_casuale;
    float a[][8]=
    {{' ',' ',' ',' ',' ',' ',' ',' '},
    {' ',' ',' ',' ',' ',' ',' ',' '},
    {' ',' ',' ',' ',' ',' ',' ',' '},
    {' ',' ',' ',' ',' ',' ',' ',' '},
    {' ',' ',' ',' ',' ',' ',' ',' '},
    {' ',' ',' ',' ',' ',' ',' ',' '},
    {' ',' ',' ',' ',' ',' ',' ',' '},
    {' ',' ',' ',' ',' ',' ',' ',' '}};
         srand(time(NULL));
    for (i=0;i<8;i++)
    {
        for (j=0;j<8;j++)
        {
            x_casuale=-100.0F+200.0F*(float)rand()/(float)RAND_MAX;
            a[j]=x_casuale;
        }
    }
         for (i=0;i<8;i++)
        {
            for (j=0;j<8;j++)
                
                printf(" %.2f ",a[j]);
        
            printf("\n");
        }
}

Fino a qui tto ok...
mi genera l'array 2D di 8X8 dimensioni.
Ora io ho pensato di fare una function ke mi calcola la media di 4 elementi, per gli elementi ke stanno al centro...quindi metto un for ke va da 2 a 6 e calcola la media degli elementi ke stanno sopra, sotto, a destra e a sinistra.
Poi faccio una function per ogni elemento all'angolo. e poi faccio altre 4 function con gli elementi ke toccano i bordi...
penso ke così sia semplice, ma nn riesco a capire come devo implementarla...
guarda un pò qui:
Questa è quella degli elementi al centro...VA BENE?
void mediaNordSudOvestEst(float a[][8],float a_diffuso[][8],int nx,int ny)
{
    int i=0,j=0;

    for (nx=2;nx<6;nx++)
    {
        for (ny=2;ny<6;ny++)
        {
            a_diffuso[nx][ny]=(a[i-1][j]+a[i+1][j]+a[j-1]+a[j+1])/4;
            
        }
        
    }
    for (i=0;i<8;i++)
    {
        for (j=0;j<8;j++)
            printf(" %.2f ",a_diffuso[nx][ny]);
        printf("\n");
    }
    
}
ciao grazie
        
    

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 16:20
Giovedì, 11/01/2007
Si vabbe', ma se non segui i miei suggerimenti io che ci sto a scrivere?

Non serve che costruisci 4 funzioni, basta che ogni volta esegui alcuni controlli condizionali sulle coordinate... ad esempio se i = 0 allora vuol dire che siamo sulla prima riga e di conseguenza non occorre che calcoliamo la media anche sui numeri che stanno sopra, se j = 0 allora vuol dire che stiamo sull'estrema sinistra e non serve che calcoliamo le medie sui numeri che stanno a sinistra.

Segui le mie indicazioni che ho scritto sopra, se qualche argomento non ti e' chiaro (variabili globali, operatori new e delete) prova a documentarti un po' oppure chiedi.


Il mio blog: https://piero.dev
PM Quote
Pagine: [ 1 2 3 4 5 ] Precedente | Prossimo