Oppure

Loading
03/01/07 15:45
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?
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!!!
aaa
04/01/07 15:23
pierotofy
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.

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:

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


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 04/01/07 15:25
Il mio blog: piero.dev
05/01/07 13:06
clikkami
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 05/01/07 15:00
aaa
05/01/07 15:06
pierotofy
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:

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

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


Non ho testato il codice, ma dovrebbe funzionare. Ho evidenziato le parti differenti rispetto a ReginaOvest.
Il mio blog: piero.dev
05/01/07 16:20
clikkami
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
aaa
07/01/07 12:08
clikkami
#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][b]";);
}

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][b]";);
}

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][b]";);
}

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!!!
aaa
08/01/07 15:05
pierotofy
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 08/01/07 15:06
Il mio blog: piero.dev
10/01/07 16:20
clikkami
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[i][j]=x_casuale;
        }
    }
for (i=0;i<8;i++)
        {
            for (j=0;j<8;j++)
                
                printf(" %.2f ",a[i][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[i][j-1]+a[i][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
        
    
aaa