Salve a tutti,
Mi scuso anticipatamente perchè non sono riuscito ad essere conciso, ma non saprei come esprimermi meglio...
sto realizzando un'applicazione (linguaggio C su ambiente Linux Fedora Core 4) che implementi una battaglia navale tra 2processi (ogni processo parte lanciando dalla shell l'eseguibile. Poi i due processi cominciano a giocare coordinandosi tra di loro attraverso dei semafori).
All'avvio dell'applicazione ad ogni giocatore (quindi ad ogni processo), viene chiesto se vuole posizionarsi le proprie navi da se o se lasciare che a farlo sia una funzione random automatica. Riporto il codice relativo a questo passaggio
....
do {
printf("puoi decidere (1) se posizionare da te le tue navi (scrivi 1)\n");
printf(" (2) o se lasciare che sia il computer a farlo(scrivi 2);\n");
printf("\n");
scanf("%d", &scelta);
}
while ((scelta != 1) && (scelta != 2));
scelta = (int) scelta;
if (scelta == 1)
posizionaMYSELF(grigliaPLAYER1);
else if (scelta == 2)
posiziona(grigliaPLAYER1);
...
la funzione "posizionaMYSELF" è appunto quella che permette di scegliere dove posizionare le proprie navi, la funzione "posiziona" invece è quella che le posiziona automaticamente.
Se un giocatore sceglie di avviare la funzione "posizionaMYSELF" e di decidere quindi dove posizionare le proprie navi, parte il seguente codice:
int posizionaMYSELF(int griglia[8][8])
{
int k;
int quanteCoord;
int nrCoord1, nrCoord2;
char primaCoord, secondaCoord;
char prendi[256];
for (k = 0; k < NUMERONAVI; k++)
{
if (k == 0) {
printf("\n");
printf("%sScegli le coordinate dove posizionare la PRIMA nave%s\n",ROSSO,STANDARD);
}
else if (k == 1) {
printf("\n");
printf("%sScegli le coordinate dove posizionare la SECONDA nave%s\n", ROSSO, STANDARD);
}
else if (k == 2) {
printf("\n");
printf("%sScegli le coordinate dove posizionare la TERZA nave%s\n", ROSSO, STANDARD);
}
else if (k == 3) {
printf("\n");
printf("%sScegli le coordinate dove posizionare la QUARTA nave%s\n", ROSSO, STANDARD);
}
else if (k == 4) {
printf("\n");
printf("%sScegli le coordinate dove posizionare l' ULTIMA nave%s\n", ROSSO, STANDARD);
}
printf("\n");
printf("ATTENZIONE! Inserisci le coordinate una alla volta!\n");
printf("\n");
do {
do {
do {
printf ("Inserisci la %sPRIMA COORDINATA%s(una lettera tra 'a'-'h')\n", VERDE, STANDARD);
fgets(prendi, 256, stdin);
quanteCoord = lunghezza(prendi);
}
while (quanteCoord != 2);
primaCoord = prendi[0];
}
while ((primaCoord != 'a') && (primaCoord != 'b') && (primaCoord != 'c') && (primaCoord != 'd') && (primaCoord != 'e') && (primaCoord != 'f') && (primaCoord != 'g') && (primaCoord != 'h'));
nrCoord1 = trasforma(primaCoord);
do {
do {
printf ("Inserisci la %sSECONDA COORDINATA%s(una lettera tra 'a'-'h' oppure 'q' per uscire)\n", VERDE, STANDARD);
fgets(prendi, 256, stdin);
quanteCoord = lunghezza(prendi);
}
while (quanteCoord != 2);
secondaCoord = prendi[0];
}
while ((secondaCoord != 'a') && (secondaCoord != 'b') && (secondaCoord != 'c') && (secondaCoord != 'd') && (secondaCoord != 'e') && (secondaCoord != 'f') && (secondaCoord != 'g') && (secondaCoord != 'h'));
nrCoord2 = trasforma(secondaCoord);
if (griglia[nrCoord1][nrCoord2] == 8)
{
printf("\n");
printf("%sATTENZIONE! hai gia' posizionato una nave su questa coordinata%s, inseriscine una diversa!\n", SOTTOLINEATO, STANDARD);
printf("\n");
}
}
while (griglia[nrCoord1][nrCoord2] != 0);
griglia[nrCoord1][nrCoord2] = 8;
}
}
che prende una coordinata alla volta di ogni nave (sono in tutto 5 navi ciascuna di lunghezza unitaria) controllando che la coordinata passata sia valida.
IL MIO PROBLEMA è che appena parte la funzione "posizionaMYSELF" chiede sempre 2volte
Inserisci la %sPRIMA COORDINATA%s(una lettera tra 'a'-'h')
Inserisci la %sPRIMA COORDINATA%s(una lettera tra 'a'-'h')
io credo che dipenda dal fatto che prima di far partire quella funzione, si debba indicare "1" o "2" per scegliere se posizionare le navi o lasciare che lo faccia il computer, e che questa scelta in qualche modo venga interpretata come un passaggio di coordinata alla funzione "posizionaMYSELF".
Quest'ultima facendo i controlli sulla legalità della coordinata trova naturalmente che non è ammissibile e quindi chiede per la seconda volta di inserire la prima coordinata.
Esiste un modo per aggirare questo problema? Oppure il problema non è questo? Conosco la funzione "flush" che ripulisce il buffer di un canale, ma non so come usarla...
Aiutatemi, vi prego! Sto diventando matto!![]()