Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Rand's
Forum - C/C++ - Rand's "impiccato"

Avatar
cannella (Normal User)
Newbie


Messaggi: 3
Iscritto: 27/10/2005

Segnala al moderatore
Postato alle 9:19
Giovedì, 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
PM Quote
Avatar
cannella (Normal User)
Newbie


Messaggi: 3
Iscritto: 27/10/2005

Segnala al moderatore
Postato alle 10:19
Giovedì, 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

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6116
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 12:11
Venerdì, 28/10/2005
Testo quotato

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).

Testo quotato


- 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

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


Ultima modifica effettuata da pierotofy il 28/10/2005 alle 12:12


Seguimi su Twitter: http://www.twitter.com/pierotofy

Fai quello che ti piace, e fallo bene.
PM Quote
Avatar
Zizzius (Honoris User)
Guru


Messaggi: 675
Iscritto: 28/02/2005

Segnala al moderatore
Postato alle 16:34
Venerdì, 28/10/2005
Testo quotato

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

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


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

Codice sorgente - presumibilmente Plain Text

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


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

Codice sorgente - presumibilmente Plain Text

  1. scanf("&c%*c", &c);
  2. 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
PM Quote
Avatar
cannella (Normal User)
Newbie


Messaggi: 3
Iscritto: 27/10/2005

Segnala al moderatore
Postato alle 11:30
Mercoledì, 02/11/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 :d

Ultima modifica effettuata da cannella il 02/11/2005 alle 11:31
PM Quote
Avatar
Zizzius (Honoris User)
Guru


Messaggi: 675
Iscritto: 28/02/2005

Segnala al moderatore
Postato alle 12:12
Mercoledì, 02/11/2005
Potresti usare degli if nidificati - ecco un abbozzo:

Codice sorgente - presumibilmente C/C++

  1. c = getchar();
  2. if (c == '1')
  3. help();
  4. else if (check_letter [...]

e cos? via.

Oppure uno switch-case:

Codice sorgente - presumibilmente C++

  1. switch (c = getchar()) {
  2. case '1': /* regole del gioco */
  3. help();
  4. break;
  5. case '2': /* esci */
  6. return 0;
  7.  
  8. [...]
  9.  
  10. default:
  11. check_letter(c);
  12. }



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
PM Quote