Problema con gioco dell'impiccato

di mattia06 il
19 risposte
Salve a tutti, sto scrivendo il gioco dell'impiccato e ho riscontrato due bug nel programma che non riesco a risolvere. In sostanza, quando vado ad inserire la parola da indovinare dovrebbe accettarmi solo parole con lettere minuscole e nessun altro carattere, ma il controllo che ho fatto per questo scopo non sembra funzionare bene. Inoltre avevo implementato un controllo per scalare il monte errori solo nel caso in cui la lettera scelta fosse stata sbagliata ma anche questo non accade. Sarei molto felice se mi poteste aiutare a risolvere questo problema! Grazie in anticipo!
Vi posto il codice:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 30
#define ASCII 32 //costante di conversione

int main(){
    char parola_indovinare[MAX], parola[MAX], lettera;
    int indice_tentativi, tentativi, grandezza_parola, x, y, controllo=0, i=0;

    printf("**************Gioco dell'impiccato!****************");        //presentazione gioco

    int 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("cls");

    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(" ");
    }

    for(indice_tentativi=0;indice_tentativi<tentativi;){
        printf("\nHai %d tentativi.",i);
        printf("\nInserisci la lettera: ");
        fflush(stdin);
        scanf("%c",&lettera);                     //inserimento lettera

        if((lettera>=65) && (lettera<=90)){     //conversione maiuscole in minuscole tramite codice ASCII
            lettera=lettera+ASCII;
        }

        for(x=0;x<grandezza_parola;x++){
            if(lettera==parola_indovinare[x]){          //ciclo assegnazione lettera a vettore parola
                parola[x]=lettera;
                controllo=1;
            }
            else
                controllo=0;
        }

        if(controllo==1){
            for(x=0;x<grandezza_parola;x++){
                printf("%c",parola[x]);
                printf(" ");
            }
        }

        else{
            indice_tentativi++;
            i--;
            for(x=0;x<grandezza_parola;x++)
                printf("%c ",parola[x]);
        }
    }

    printf("\nGioco finito!");          //fine gioco
    system("\nPause");
    return 0;
}

19 Risposte

  • Una cosa per volta ... intanto

    z=0;

    deve stare NEL ciclo subito dopo la do{
  • Grazie, il primo problema si è risolto!
  • Il secondo problema come potrei risolvere?
  • Il secondo non è chiaro. Esponi meglio, facendo anche riferimento alla parte di codice che non va.
  • Non riesco a spiegarti il problema scrivendolo, potresti eseguire il programma per capire meglio il problema?
  • No, adesso non posso. E comunque dovresti provare a spiegarti, non mi sembra possibile che tu non lo possa fare.
  • Il programma dovrebbe scalare il tentativo soltanto quando la lettera inserita è effettivamente sbagliata, invece alcune volte avviene e altre no, anche se ho sempre inserito una lettera presente nella parola.
  • Scrivi una funzione che verifica, quindi ritorna true o false, se la.parola contiene la lettera inserita
  • Se la variabili si chiama

    tentativi

    e parte da 10, in quale parte del codice esiste il decremento di questa variabile? Io non lo trovo.
  • oregon ha scritto:


    .... in quale parte del codice esiste il decremento di questa variabile? Io non lo trovo.
    In effetti il decremento è svolto dalla variabile intera "i", ma tale variabile viene istanziata nel codice con il valore zero, anziché 10, o comunque non v'è successiva assegnazione ad essa del medesimo valore della variabile "tentativi".
  • La mia idea era di decrementare "i" solo per la stampa dei tentativi, e di incrementare indice_tentativi fino a quando quest'ultimo non era minore di tentativi. Il decremento e l'incremento dovevano avvenire se la lettera inserita non faceva parte della parola ed era quindi sbagliata.
  • La variabile i è istanziata a 10
  • mattia06 ha scritto:


    La variabile i è istanziata a 10
    Scusami, dove è istanziata a 10 ? Non riesco a vederlo lì nel codice.
  • Veramente i è a zero ...

    Comunque, così c'è troppa confusione. Dividi tutto in funzioni, come suggerito e usale nel main. E la variabile dei tentativi chiamala tentativi non i !
Devi accedere o registrarti per scrivere nel forum
19 risposte