cannella (Normal User)
Newbie
Messaggi: 3
Iscritto: 27/10/2005
|
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 http://www.pierotofy.it/data/programs/C-CPP/Rand_Impiccato ... )
grazie mille
Da Zizzius: per favore, leggere il Regolamento della sezione prima di postare.
Ultima modifica effettuata da Zizzius il 28/10/2005 alle 16:38 |
|
cannella (Normal User)
Newbie
Messaggi: 3
Iscritto: 27/10/2005
|
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
|
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
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):
Codice sorgente - presumibilmente Plain Text |
//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 il 28/10/2005 alle 12:12
|
|
Zizzius (Honoris User)
Guru
Messaggi: 675
Iscritto: 28/02/2005
|
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:
Codice sorgente - presumibilmente Plain Text |
Ma il problema pu? essere risolto pi? elegantemente nel modo seguente:
Codice sorgente - presumibilmente Plain Text |
cio?, il secondo carattere viene ignorato. O ancora:
Codice sorgente - presumibilmente Plain Text |
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 il 28/10/2005 alle 16:36 |
|
cannella (Normal User)
Newbie
Messaggi: 3
Iscritto: 27/10/2005
|
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
Ultima modifica effettuata da cannella il 02/11/2005 alle 11:31 |
|
Zizzius (Honoris User)
Guru
Messaggi: 675
Iscritto: 28/02/2005
|
Potresti usare degli if nidificati - ecco un abbozzo:
Codice sorgente - presumibilmente C/C++ |
c = getchar();
if (c == '1')
help();
else if (check_letter [...]
|
e cos? via.
Oppure uno switch-case:
Codice sorgente - presumibilmente C++ |
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 il 02/11/2005 alle 12:14 |
|