Problema con gioco dell'impiccato

di il
19 risposte

19 Risposte - Pagina 2

  • Re: Problema con gioco dell'impiccato

    Io, partendo dal tuo codice, ho applicato qualche aggiustamento come segue (io uso Linux):
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    
    #define MAX 30
    #define ASCII 32 	//costante di conversione
    
    int main(){
    
        int z;
        char parola_indovinare[MAX], parola[MAX], lettera;
        int indice_tentativi, tentativi, grandezza_parola, x=0, y, controllo=0, i=10;
    
        printf("**************Gioco dell'impiccato!****************");    //presentazione gioco
    
        z=0;
    
        do{ 
            // controllo lunghezza della parola e se sono tutte maiuscole
            printf("\n\nInserisci la parola da indovinare da 1 a 30 lettere minuscole: ");
            fflush(stdin);
            scanf("%s",parola_indovinare);
            for(y=0;y<strlen(parola_indovinare);y++){
                if((parola_indovinare[y]<97) || (parola_indovinare[y]>122))
                    z=1;
            }
        }while((strlen(parola_indovinare)>MAX) || (strlen(parola_indovinare)<=0) || z==1);
    
    //    system("clear");
    
        printf("\n\nIl tentativo viene scalato solo quando si sbaglia.");
        printf("\nI tratti sono le vocali, i puntini le consonanti.");
        printf("\n\nIndovina la parola: ");
    
        tentativi=10;
    
        grandezza_parola=strlen(parola_indovinare);     //misura grandezza parola
    
        for(y=0;y<grandezza_parola;y++){        //ciclo assegnazione tratti e punti
            if((parola_indovinare[y]==97) || (parola_indovinare[y]==101) || (parola_indovinare[y]==105) || (parola_indovinare[y]==111) || parola_indovinare[y]==117)
                parola[y]='_';
            else
                parola[y]='.';
            printf("%c",parola[y]);
            printf(" ");
        }
    
        i = tentativi;
    
        for(indice_tentativi=0; indice_tentativi<tentativi;) {
            printf("\nHai %d tentativi.",i);
            printf("\nInserisci la lettera: ");
    	while(getchar() != '\n');
            scanf("%c",&lettera);                     //inserimento lettera
    
    /* conversione maiuscole in minuscole tramite codice ASCII */
            if((lettera>=65) && (lettera<=90)) {
                lettera=lettera+ASCII;
            }
    
    /* Verifica assegnazione lettera a vettore parola */
            if(lettera==parola_indovinare[x]){ 
                 parola[x]=lettera;
                 controllo=1;
            }else{
                 controllo=0;
            }
    
            if(controllo==1){
                 for(y=0;y<grandezza_parola;y++) {
                    printf("%c",parola[y]);
                    printf(" ");
                 }
    
    	     if (x == (grandezza_parola - 1)) {
    		printf("\nGioco finito!\n");          //fine gioco
    		return 0;
    	     }
    	    ++x;
            }else{
                indice_tentativi++;
                i--;
                for(y=0;y<grandezza_parola;y++)
                    printf("%c ",parola[y]);
            }
        }
        
    	printf("\nGioco finito senza successo !\n");
    	return (0);
    
    }
  • Re: Problema con gioco dell'impiccato

    vuott ha scritto:


    Io, partendo dal tuo codice, ho applicato qualche aggiustamento come segue (io uso Linux)
    Ho avuto la stessa idea, spero possa essere d'aiuto:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    //necessaria per tolower() e isalpha()
    #include <ctype.h>
    
    #define MAX 30
    
    int main(){
        char parola_indovinare[MAX], parola_nascosta[MAX], lettera;
        int grandezza_parola, tentativi = 10, conta_lettere = 0;
        bool lettera_trovata;
    
        //presentazione gioco
        printf("**************Gioco dell'impiccato!****************");
    
        //input parola da indovinare
        do {
          printf("\n\nInserisci la parola da indovinare da 1 a 30 lettere minuscole: ");
          fflush(stdin);
          scanf("%s",parola_indovinare);
    
          //misura grandezza parola
          grandezza_parola = strlen(parola_indovinare);
    
          for (int i = 0; i < grandezza_parola; i++) {
            /*se non è una lettera dell'alfabeto azzera la lunghezza ed interrompe
            il ciclo.*/
            if (!isalpha(parola_indovinare[i])) {
              grandezza_parola = 0;
              break;
            }
            //converte eventuali maiuscole in minuscole
            parola_indovinare[i] = tolower(parola_indovinare[i]);
          }
        } while(grandezza_parola <= 0 || grandezza_parola > MAX);
    
        //system("cls");
    
        printf("\n\nHai %d tentativi. Il tentativo viene scalato solo quando si sbaglia.", tentativi);
        printf("\nI tratti sono le vocali, i puntini le consonanti.");
    
        //ciclo assegnazione tratti e punti
        for (int i = 0; i < grandezza_parola; i++){
            if((parola_indovinare[i]==97) || (parola_indovinare[i]==101) || (parola_indovinare[i]==105) || (parola_indovinare[i]==111) || parola_indovinare[i]==117)
                parola_nascosta[i]='_';
            else
                parola_nascosta[i]='.';
        }
    
        /*il ciclo si ripete fintanto che la parola non è stata indovinata e
        ci saranno dei tentativi a disposizione*/
        while(tentativi > 0){
            lettera_trovata = false;
    
            printf("\nHai %d tentativi.\n",tentativi);
            printf("Indovina la parola: ");
            printf("%s",parola_nascosta);
            printf("\nInserisci la lettera: ");
    
            //inserimento lettera
            do {
              fflush(stdin);
              scanf("%c",&lettera);
            } while (!isalpha(lettera));
    
            //converti in minuscola
            tolower(lettera);
    
            //ciclo assegnazione lettera a vettore parola
            for (int i = 0; i < grandezza_parola; i++) {
                if (lettera == parola_indovinare[i]) {
                    lettera_trovata = true;
                    parola_nascosta[i] = lettera;
                    //conta lettere trovate
                    conta_lettere++;
                }
            }
    
            //se non ha trovato nessuna lettera scala di uno il numero di tentativi
            if (!lettera_trovata) {
              tentativi--;
            }
    
            /*se ho trovato tutte le lettere ho trovato la parola; esce dal ciclo
            azzerando i tentativi.*/
            if (conta_lettere == grandezza_parola) {
                printf("\nHai indovinato!\n");
                tentativi = 0;
            }
        }
    
        //fine gioco
        printf("\nGioco finito!");
        //system("\nPause");
        return 0;
    }
    
  • Re: Problema con gioco dell'impiccato

    Va bene, grazie comunque!
  • Re: Problema con gioco dell'impiccato

    Alla fine ho capito in cosa sbagliavo, l'idea era giusta ma implementata male. Ho riorganizzato il codice in funzioni e ora tutto funziona alla perfezione! Grazie ancora per i consigli!
  • Re: Problema con gioco dell'impiccato

    Con le funzioni è tutto più facile
Devi accedere o registrarti per scrivere nel forum
19 risposte