Oppure

Loading
27/10/05 7:19
cannella
Ciao ragazzi,
vorrei chiedervi una piccola spiegazione sul codice del gioco dell'impiccato che ho trovato qui (Rand Impiccato -versione standard-)...

Il pezzo di codice che non capisco ? questo:

//stampo la parola mascherata aggiornata
stampa_parola();
printf("\n\n'%s' inserisci una lettera: ", nome);
scanf("%c", &c);
scanf("%c", &c);
doit=1;
started=1;


Le mie domande sono:
- perch? ci sono 2 scanf dopo il printf ?
- cosa sono e cosa servono doit e started ?

spero di essere stato chiaro (per il condice intero ovviamente potete guardare sul sito pierotofy.it/data/programs/C-CPP/… )

grazie mille :)

Da Zizzius: per favore, leggere il Regolamento della sezione prima di postare.
Ultima modifica effettuata da Zizzius 28/10/05 14:38
aaa
27/10/05 8:19
cannella
Sempre io...perch? ho scoperto che il programma quando hai indovinato la parola intera ti chiede ancora di inserire una lettera, dopo di che qualsiasi cosa si metta ti dice che hai vinto perch? "legge" sempre la lettera inserita nel ciclo successivo del "do-while"...(se ho be capito)...
qualcuno saprebbe risolvere questo problema ? o almeno suggerirmi qualcosa ?

grazie ancora
aaa
28/10/05 10:11
pierotofy
Postato originariamente da cannella:
- perch? ci sono 2 scanf dopo il printf ?


Non vorrei sbagliarmi, ma siccome penso che Rand l'abbia sviluppato in Linux, ha inserito 2 scanf perch? se se ne scrive uno solo, non viene considerato (non chiedetemi il motivo, ma avevo riscontrato anch'io questo problema in Linux).

- cosa sono e cosa servono doit e started ?


Sono due variabili intere e servono a quest'istruzione condizionale (a occhio, direi che serve per non eseguire il codice al primo ciclo):

      //controllo la lettera immessa e se ? necessario stampare un pezzo dell'omino
      if(check_parola(c)==0 && doit==1 && started==1) {

//...
Ultima modifica effettuata da pierotofy 28/10/05 10:12
Il mio blog: piero.dev
28/10/05 14:34
Zizzius
Postato originariamente da cannella:

perch? ci sono 2 scanf dopo il printf ?

Questo ? legato da una peculiarit? di Windows (mentre non so il comportamento di Linux).

In Windows, il carattere che va a capo viene rappresentato con due codici ASCII: carriage return (13) + line feed (10).
Ne codice del programma, l'utente inserisce il carattere poi seguito da INVIO, di cui il primo carattere va a terminare l'inserimento, mentre il secondo va a "sporcare" il buffer circolare: per vuotare quest'ultimo si pu? operare come Rand, inserendo nuovamente uno scanf, oppure riassumento le due chiamate a funzione in una sola:

scanf("%c%c", &c, &c);

Ma il problema pu? essere risolto pi? elegantemente nel modo seguente:

scanf("&c%*c", &c);

cio?, il secondo carattere viene ignorato. O ancora:

scanf("&c%*c", &c);
fflush(stdin);

che effettua il flushing dello stram di input impostato come standard (redirezionamenti a parte, si tratta dello schermo).
Ultima modifica effettuata da Zizzius 28/10/05 14:36
aaa
02/11/05 10:30
cannella
Ragazzi, grazie per le risposte mi sono state utili ma ora ho un'altro problema...come posso implementare in quel programma una "sezione chiamata help, richiamabile in qualsiasi momento all'interno dell'applicazione, che ci permetta di conoscere le regole del gioco" ???

Io avevo pensato di mettere un controllo quando chiede di inserire una lettera (e anche il nome se ? possibile) e se al posto di una lettera si inserisce un numero l'"else" richiama la sezione help ma non so assolutamente come fare (forse con "isdigit (c)" )...

aiutooo :d
Ultima modifica effettuata da cannella 02/11/05 10:31
aaa
02/11/05 11:12
Zizzius
Potresti usare degli if nidificati - ecco un abbozzo:

c = getchar();
if (c == '1')
help();
else if (check_letter [...]
e cos? via.

Oppure uno switch-case:

switch (c = getchar()) {
case '1': /* regole del gioco */
help();
break;
case '2': /* esci */
return 0;

[...]

default:
check_letter(c);
}


Ma non so come Rand abbia affrontato il problema; aspetta un suo giudizio in proposito. ;)
Ultima modifica effettuata da Zizzius 02/11/05 11:14
aaa