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