Oppure

Loading
11/01/07 15:20
pierotofy
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: piero.dev
11/01/07 16:33
clikkami
scusa se nn seguo i tuoi consiji ma certe volte mi sembrano troppo difficili...io cerco di farlo nel modo + semplice possibile...
ora ho ricominciato a farlo vedi ora cosa c'è ke non va...penso di essere sulla buona strada:

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

void main ()
{
    int i=0,j=0,nx=0,ny=0;
    float x_casuale;
    float a[][8]=
    {{' ',' ',' ',' ',' ',' ',' ',' '},
    {' ',' ',' ',' ',' ',' ',' ',' '},
    {' ',' ',' ',' ',' ',' ',' ',' '},
    {' ',' ',' ',' ',' ',' ',' ',' '},
    {' ',' ',' ',' ',' ',' ',' ',' '},
    {' ',' ',' ',' ',' ',' ',' ',' '},
    {' ',' ',' ',' ',' ',' ',' ',' '},
    {' ',' ',' ',' ',' ',' ',' ',' '}};

    float a_diffuso[8][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";);
        }

    i=0;j=0;
    for (i=0;i<8;i++)
    {
        for (j=0;j<8;j++)
        {
            if (a[i][j]=a[0][0])
                a_diffuso[0][0]=(a[1][0]+a[0][1])/2;
            else if (a[i][j]=a[0][4])
                a_diffuso[0][4]=(a[0][6]+a[1][7])/2;
            else if (a[i][j]=a[4][0])
                a_diffuso[4][0]=(a[6][0]+a[7][1])/2;
            else if (a[i][j]=a[4][4])
                a_diffuso[4][4]=(a[6][7]+a[7][6])/2;
        }
    }
    
    
    for (nx=1;nx<7;nx++)
    {
        for(ny=1;ny<7;ny++)
        {
            a_diffuso[nx][ny]=(a[i-1][j]+a[i+1][j]+a[i][j-1]+a[i][j+1])/4;
        }
    }


    for (nx=1;nx<7;nx++)
    {
            a_diffuso[nx][ny]=(a[i-1][0]+a[i+1][0]+a[i][1])/3;
    }
    

    for (nx=1;nx<7;nx++)
    {
            a_diffuso[nx][ny]=(a[i-1][7]+a[i+1][7]+a[i][6])/3;
    }
    

    for (ny=1;ny<7;ny++)
    {
            a_diffuso[nx][ny]=(a[0][j-1]+a[0][j+1]+a[1][j])/3;
    }


    for (ny=1;ny<7;ny++)
    {
            a_diffuso[nx][ny]=(a[7][j-1]+a[7][j+1]+a[6][j])/3;
    }

    printf("\n\n\n";);
    for (nx=0;nx<8;nx++)
    {
        for(ny=0;ny<8;ny++)
        {
            printf(" %.2f ",a_diffuso[nx][ny]);
        }
        printf("\n";);
    }
}
aaa
14/01/07 1:51
pierotofy
Postato originariamente da clikkami:
scusa se nn seguo i tuoi consiji ma certe volte mi sembrano troppo difficili...io cerco di farlo nel modo + semplice possibile...


Qual'è il punto in cui non sono stato abbastanza chiaro nel spiegarti i punti da seguire?

Devi suddividere il programma in funzioni, altrimenti è ovvio che viene fuori confusione. Inoltre non devi scrivere l'intero programma e poi incrociando le dita provarlo ad eseguire e vedere se funziona, un programma dev'essere costruito passo per passo, pianificare un percorso (i punti che ti ho scritto lo fanno in maniera molto riassuntiva) e procedere, uno ad uno, completando tutti i punti, assicurandosi di volta in volta che siano corretti.
Il mio blog: piero.dev
17/03/09 16:07
pollon85
Ciao,scusate se ho ripresto questo post abbastanza vecchio,ma ho anche io il progetto degli scacchi da implementare,quindi vi ringrazio in anticipo perchè devo dire che già con questo post mi avete aiutato molto. :k: La mia traccia è uguale,solo che oltre ai pedoni bianchi ho solo un Cavallo nero(quindi niente regina o torre).
Però mi sono bloccata in un punto che non capisco ed è per questo che gentilmente vorrei chiedere il vostro aiuto

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

void printScacchiera(char [][8]); 
void 1PassoSu2Destra(char [][8],char [], int, int); 
void 1PassoSu2Sinistra(char [][8],char [], int, int); 
void 1PassoGiu2Sinistra(char [][8],char [], int, int); 
void 1PassoGiu2Destra(char [][8],char [], int, int); 
void 1PassoDestra2Su(char [][8],char [], int, int); 
void 1PassoDestra2Giu(char [][8],char [], int, int); 
void 1PassoSinistra2Su(char [][8],char [], int, int); 
void 1PassoSinistra2Giu(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] = 'C'; //Cavallo
            i++; 
        } 
    } 



fin qui tutto bene perchè ho messo le pedine e il cavallo e ho dichiarato le 8 funzioni delle possibili mosse del Cavallo.
Ora i miei dubbi sono questi,questo Printf,nel mio caso,come si traduce perchè la Regina non ha un numero di passi limitati,mentre il mio Cavallo si :doubt:
    printf("Regina in %c%d puo' catturare i seguenti pedoni: \n\n",colonne[posCol],8-posRiga)

.....
E poi quando vado a scrivere le funzioni dichiarate all'inizio


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

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


Quello che ho evidenziato in blu è la parte che non capisco come scrivere nel mio caso...e poi è un problema che ho messo la i come indice di riga e j come colonne?
Grazie in anticipo e mi scuso per il post lungo :hail:
aaa
18/03/09 13:34
gigisoft
Postato originariamente da pollon85:

Ciao,scusate se ho ripresto questo post abbastanza vecchio,ma ho anche io il progetto degli scacchi da implementare,quindi vi ringrazio in anticipo perchè devo dire che già con questo post mi avete aiutato molto. :k: La mia traccia è uguale,solo che oltre ai pedoni bianchi ho solo un Cavallo nero(quindi niente regina o torre).
Però mi sono bloccata in un punto che non capisco ed è per questo che gentilmente vorrei chiedere il vostro aiuto

[...]

void 1PassoSu2Destra(char [][8],char [], int, int); 
void 1PassoSu2Sinistra(char [][8],char [], int, int); 
void 1PassoGiu2Sinistra(char [][8],char [], int, int); 
void 1PassoGiu2Destra(char [][8],char [], int, int); 
void 1PassoDestra2Su(char [][8],char [], int, int); 
void 1PassoDestra2Giu(char [][8],char [], int, int); 
void 1PassoSinistra2Su(char [][8],char [], int, int); 
void 1PassoSinistra2Giu(char [][8],char [], int, int); 
[...]


fin qui tutto bene perchè ho messo le pedine e il cavallo e ho dichiarato le 8 funzioni delle possibili mosse del Cavallo.

Forse era il caso di riunire gli otto controlli in un'unica funzione?

Ora i miei dubbi sono questi,questo Printf,nel mio caso,come si traduce perchè la Regina non ha un numero di passi limitati,mentre il mio Cavallo si :doubt:
    printf("Regina in %c%d puo' catturare i seguenti pedoni: \n\n",colonne[posCol],8-posRiga)

.....



Basta che individui le case controllate dalla regina.
Sia (h,k) la casa in cui risiede la regina, la casa (a,b) sarà controllata dalla regina se:

('a' <= a <= 'h') And (1 <= b <= 8) And (una delle seguenti)

h - k == a - b // Diagonale NE -> SO
h + k == a + b // Diagonale NO -> SE
h == a // Stessa colonna
k == b // Stessa riga

:k:

Ciao.

Luigi
Ultima modifica effettuata da gigisoft 18/03/09 13:36
aaa
18/03/09 15:47
pollon85
Inizio con il ringraziarti per la risposta :)
Forse sono stata poco chiara e chiedo scusa...ma non capisco :-| perchè diciamo che la prima parte va bene,quindi ho la scacchiera,gli 8 pedoni, il Cavallo e gli 8 metodi per i possibili movimenti del Cavallo. Ora prima di dichiarare i metodi c'è un "printf" del tipo
printf("Cavallo in %c%d puo'catturare i seguenti pedoni:\n\n",....
qui non riesco a capiere le coordinate di posCol e posRiga che devo inserire per dire i pedoni catturabili dal Cavallo.

E l'altro dubbio amletico è che quando vado a dichiarare ogni metodo,quindi ad esempio
void UnPassoSuDueSinistra (char scacchiera [][8],char colonne[],int posRiga, int posCol) 
{ 
int i,j, pedoneTrovato = 0; 

i=posRiga;j=posCol;1<i<8 && 1<j<8;i=i+1;j=j+2;

a questo punto vanno i 2 if per vedere se incrementando le 2 variabili delle possibili mosse del Cavallo ,si trova il pedone da mangiare...anche qui ho il dubbio sugli indici che devo mettere per le variabili;io ho provato così
{ 
if((scacchiera[i][j] == 'P') && (pedoneTrovato == 0)) 
{ 
if((scacchiera[i+1][j+2] != 'P') && (scacchiera[i+1][j+2] != 'P')) 
{ 
printf("Pedone in %c%d\n",colonne[i],riga[j]); 
pedoneTrovato = 1; 
} 
else 
{ 
pedoneTrovato = 1; 
} 
} 
} 
}

ma naturalmente non va :d
Scusami per la poca chiarezza :hail:
aaa
18/03/09 16:31
gigisoft
Postato originariamente da pollon85:

Inizio con il ringraziarti per la risposta :)


Prego, non c'e' di che.

Forse sono stata poco chiara e chiedo scusa...ma non capisco :-| perchè diciamo che la prima parte va bene,quindi ho la scacchiera,gli 8 pedoni, il Cavallo e gli 8 metodi per i possibili movimenti del Cavallo. Ora prima di dichiarare i metodi c'è un "printf" del tipo
printf("Cavallo in %c%d puo'catturare i seguenti pedoni:\n\n",....
qui non riesco a capiere le coordinate di posCol e posRiga che devo inserire per dire i pedoni catturabili dal Cavallo.


Non ho capito cosa vuoi dire, me lo spiegheresti meglio?

E l'altro dubbio amletico è che quando vado a dichiarare ogni metodo,quindi ad esempio
void UnPassoSuDueSinistra (char scacchiera [][8],char colonne[],int posRiga, int posCol) 
{ 
 int i,j, pedoneTrovato = 0; 

 i = posRiga;
 j = posCol; // posRiga e posCol sono le coordinate del cavallo giusto?
 1<i<8 && 1<j<8; // Non capisco questa istruzione...
 i = i + 1; // perché la doppia assegnazione? Non potevi fare i = posRiga + 1?
 j = j + 2; // come sopra


a questo punto vanno i 2 if per vedere se incrementando le 2 variabili delle possibili mosse del Cavallo ,si trova il pedone da mangiare...anche qui ho il dubbio sugli indici che devo mettere per le variabili;io ho provato così
{ 
 if((scacchiera[i][j] == 'P') && 
    (pedoneTrovato == 0))
   { 
    if((scacchiera[i+1][j+2] != 'P') &&
       (scacchiera[i+1][j+2] != 'P')) // perche' fai l'if con due condizioni uguali?
      { 
       printf("Pedone in %c%d\n",colonne[i],riga[j]); 
       pedoneTrovato = 1; 
      } 
    else 
      { 
       pedoneTrovato = 1; 
      } 
   } 
} 
}

ma naturalmente non va :d
Scusami per la poca chiarezza :hail:


Beh il codice che hai postato e' poco chiaro, non capisco cosa vuoi fare esattamente.
aaa
18/03/09 17:16
pollon85
Ti chiedo davvero scusa e grazie del tempo che stai perdendo con me...il problema è che non sono proprio capace con la programmazione(e si è notato :doubt:)
Cerco di essere più chiara,il mio progetto è come quello che sta all'inizio del post,ho scacchiera,8 pedoni e un cavallo.Io ho cercato di modificare il programma che "clikkami" aveva postato per il suo progetto
#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#include <math.h> 
void printScacchiera(char [][8]); //8metodi per i possibili spostamenti Cavallo//
void UnPassoSuDueDestra(char [][8],char [], int, int); 
void UnPassoSuDueSinistra(char [][8],char [], int, int); 
void UnPassoGiuDueSinistra(char [][8],char [], int, int); 
void UnPassoGiuDueDestra(char [][8],char [], int, int);    
void UnPassoDestraDueSu(char [][8],char [], int, int); 
void UnPassoDestraDueGiu(char [][8],char [], int, int);  
void UnPassoSinistraDueSu(char [][8],char [], int, int);  
void UnPassoSinistraDueGiu(char [][8],char [], int, int); 

void main(void) 
{ 
    int i; 
    int posRiga, posCol; 
	
	char riga[8] = {'1','2','3','4','5','6','7','8'}; 

    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] = 'C'; // Cavallo 
            i++; 
        } 
    } //a questo punto posRiga e posCol hanno le coord del Cavallo,ultimo dichiarato//


A questo punto nel programma che ho visto di "clikkami" sempre in questo post,c'è in
printf("Regina in %c%d puo'catturare i seguenti pedoni:\n\n",colonne[posCol],8-posRiga); //questo lo dovrei modificare per il mio caso e quindi dovrei scrivere un printf("Cavallo in...puo'catturare.... e questo non riesco a capirlo// 

Poi c'è
  UnPassoSuDueDestra(scacchiera,colonne,posRiga,posCol); 
    UnPassoSuDueSinistra(scacchiera,colonne,posRiga,posCol); 
	UnPassoGiuDueSinistra(scacchiera,colonne,posRiga,posCol); 
	UnPassoGiuDueDestra(scacchiera,colonne,posRiga,posCol); 
	UnPassoDestraDueSu(scacchiera,colonne,posRiga,posCol); 
	UnPassoDestraDueGiu(scacchiera,colonne,posRiga,posCol); 
	UnPassoSinistraDueSu(scacchiera,colonne,posRiga,posCol); 
	UnPassoSinistraDueGiu(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"); 
    } 
} 
//dichiarato tutto,ora devo scrivere i movimenti del Cavallo per vedere se trova i Pedoni//

Nel programma di "clikkami" un metodo ad esempio era

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

Io invece ho il metodo ad esempio UnPassoSuDueDestra,a differenza del metodo che ho scritto prima della Regina di "clikkami" io non ho inserito il ciclo for perche il Cavallo ha i passi limitati a differenza della Regina,quindi per questo io dovrei avere una situazione del genere
i=posRiga;j=posCol;1<i<8 && 1<j<8;i=i+1;j=j+2; // ho messo gli indici tra 1 e 8 perchè cmq non devo uscire fuori dalla scacchiera,perchè si deve gestire anche il caso in cui i passo su e i 2 a destra non si possano fare//

In parole povere,come ti ho detto all'inizio ho tentato di modificare il programma di "clikkami" per le mie esigenza 8-|
aaa