informatico91
02-07-2011, 11:15
Ciao a tutti stavo svolgendo un programma c con la seguente traccia:
Gioco dell’impiccato
Si realizzi un programma in linguaggio C che permetta di giocare al gioco dell’impiccato. Il
gioco si svolge tra due giocatori: il primo giocatore inserisce la parola segreta da indovinare,
mentre il secondo la deve indovinare.
Il secondo giocatore conosce la lunghezza della parola segreta, e ad ogni tentativo specifica
una lettera (si considerino le lettere maiuscole equivalenti alle minuscole): se tale
lettera compare nella parola, il programma indica in quali posizioni, altrimenti il tentativo
è considerato un errore. Il gioco termina quando il secondo giocatore ha indovinato tutte
le lettere della parola (ed in tal caso egli vince) oppure quando ha totalizzato 10 errori (nel
qual caso perde).
Codice:
#include<stdio.h>
int main()
{
char parola_g1[] = {0};
int i, j, k, lunghezza_p1, uscita = 0, fine = 0, tent = 0;
char car1, car2;
printf("Giocatore 1: Inserisci la parola segreta: ");
scanf("%s", parola_g1); //in questo caso poichè nel vettore viene memorizzata una parola e non una stringa si può usare lo
//scanf anzichè la funzione gets. Anche perchè scanf accoda alla fine della stringa anche il carattere nullo
for ( i = 0; parola_g1[i] != '\0'; i++ )
{
lunghezza_p1++;
}
int posizioni[lunghezza_p1];
char parola_g2[lunghezza_p1];
for ( i = 0; i < lunghezza_p1; i++)
{
parola_g2[i] = '-';
}
printf("\nGiocatore 2: La parola che devi indovinare e' formata da %d caratteri.\nInserisci la tua parola. Hai 10 tentativi!!!\n ", lunghezza_p1);
for ( i = 0; i < 10; i++ ) // for per i tentativi massimi
{
uscita = 0;
fine = 0;
for ( j = 0; j < lunghezza_p1; j++) //Azzera gli elementi della matrice delle posizioni. Questo va fatto in modo tale che
{ // ogni volta che rientra nel ciclo più esterno si sappia la posizione delle lettere trovate
posizioni[j] = 0;
}
fflush(stdin);
printf("\nTentativo %d. Inserisci una lettera: ", i + 1);
scanf("%c", &car1);
/*Considera i casi maiuscolo e minuscolo*/
if ( car1 >= 97 )
{
car2 = car1 - 32;
}
else if ( car1 <= 90 )
{
car2 = car1 + 32;
}
/*Scorre la parola alla ricerca di caratteri uguali a quello immesso*/
for ( j = 0; j < lunghezza_p1; j++ )
{
if ( parola_g1[j] == car1 || parola_g1[j] == car2)
{
posizioni[j]++;
parola_g2[j] = car1;
}
else if ( parola_g1[j] != car1 || parola_g1[j] != car2 )
{
uscita++;
}
//printf("%d\n", uscita);
}
if ( uscita == lunghezza_p1 )
{
printf("La lettera digita non è stata trovata\n");
}
else
{
i--;// Il tentativo corrente sarà ancora valido
printf("La lettera '%c' e' stata trovata nella/e posizione/i: ", car1);
for ( j = 0; j < lunghezza_p1; j++ )
{
if ( posizioni[j] != 0 )
{
printf("%d, ", j + 1);
}
}
printf("\n");
for ( j = 0; j < lunghezza_p1; j++ )
{
printf("%c", parola_g2[j]);
}
for ( j = 0; j < lunghezza_p1; j++)
{
if ( parola_g2[j] != '-' )
{
fine++;
}
}
//printf("%d\n", uscita);
if ( fine == lunghezza_p1 )
{
printf("\nComplimenti hai indovinato la parola!!!!");
i = lunghezza_p1 + 1;
break; // questo serve per evitare che venga svolta la successiva istruzione if e non è questa istruzione a dare
// il problema dell'invio segnalazione errori
}
}
if ( i == 9 )
{
printf("Hai superato il numero massimo di tentativi per indovinare la parola. Rigioca sarai piu' fortunato!!");
}
}
printf("\nProgramma terminato");
return 0;
}
Ho fatto diversi tentativi di esecuzione e l'algoritmo sembra funzionare correttamente. Succede però che qualsiasi strada prendo (o decido di indovinare la parola o di finire i tentavi) ogni volta che termina il main mi esce la solita finestrella di windows invia segnalazione errori.
Secondo voi perchè si comporta così???
Gioco dell’impiccato
Si realizzi un programma in linguaggio C che permetta di giocare al gioco dell’impiccato. Il
gioco si svolge tra due giocatori: il primo giocatore inserisce la parola segreta da indovinare,
mentre il secondo la deve indovinare.
Il secondo giocatore conosce la lunghezza della parola segreta, e ad ogni tentativo specifica
una lettera (si considerino le lettere maiuscole equivalenti alle minuscole): se tale
lettera compare nella parola, il programma indica in quali posizioni, altrimenti il tentativo
è considerato un errore. Il gioco termina quando il secondo giocatore ha indovinato tutte
le lettere della parola (ed in tal caso egli vince) oppure quando ha totalizzato 10 errori (nel
qual caso perde).
Codice:
#include<stdio.h>
int main()
{
char parola_g1[] = {0};
int i, j, k, lunghezza_p1, uscita = 0, fine = 0, tent = 0;
char car1, car2;
printf("Giocatore 1: Inserisci la parola segreta: ");
scanf("%s", parola_g1); //in questo caso poichè nel vettore viene memorizzata una parola e non una stringa si può usare lo
//scanf anzichè la funzione gets. Anche perchè scanf accoda alla fine della stringa anche il carattere nullo
for ( i = 0; parola_g1[i] != '\0'; i++ )
{
lunghezza_p1++;
}
int posizioni[lunghezza_p1];
char parola_g2[lunghezza_p1];
for ( i = 0; i < lunghezza_p1; i++)
{
parola_g2[i] = '-';
}
printf("\nGiocatore 2: La parola che devi indovinare e' formata da %d caratteri.\nInserisci la tua parola. Hai 10 tentativi!!!\n ", lunghezza_p1);
for ( i = 0; i < 10; i++ ) // for per i tentativi massimi
{
uscita = 0;
fine = 0;
for ( j = 0; j < lunghezza_p1; j++) //Azzera gli elementi della matrice delle posizioni. Questo va fatto in modo tale che
{ // ogni volta che rientra nel ciclo più esterno si sappia la posizione delle lettere trovate
posizioni[j] = 0;
}
fflush(stdin);
printf("\nTentativo %d. Inserisci una lettera: ", i + 1);
scanf("%c", &car1);
/*Considera i casi maiuscolo e minuscolo*/
if ( car1 >= 97 )
{
car2 = car1 - 32;
}
else if ( car1 <= 90 )
{
car2 = car1 + 32;
}
/*Scorre la parola alla ricerca di caratteri uguali a quello immesso*/
for ( j = 0; j < lunghezza_p1; j++ )
{
if ( parola_g1[j] == car1 || parola_g1[j] == car2)
{
posizioni[j]++;
parola_g2[j] = car1;
}
else if ( parola_g1[j] != car1 || parola_g1[j] != car2 )
{
uscita++;
}
//printf("%d\n", uscita);
}
if ( uscita == lunghezza_p1 )
{
printf("La lettera digita non è stata trovata\n");
}
else
{
i--;// Il tentativo corrente sarà ancora valido
printf("La lettera '%c' e' stata trovata nella/e posizione/i: ", car1);
for ( j = 0; j < lunghezza_p1; j++ )
{
if ( posizioni[j] != 0 )
{
printf("%d, ", j + 1);
}
}
printf("\n");
for ( j = 0; j < lunghezza_p1; j++ )
{
printf("%c", parola_g2[j]);
}
for ( j = 0; j < lunghezza_p1; j++)
{
if ( parola_g2[j] != '-' )
{
fine++;
}
}
//printf("%d\n", uscita);
if ( fine == lunghezza_p1 )
{
printf("\nComplimenti hai indovinato la parola!!!!");
i = lunghezza_p1 + 1;
break; // questo serve per evitare che venga svolta la successiva istruzione if e non è questa istruzione a dare
// il problema dell'invio segnalazione errori
}
}
if ( i == 9 )
{
printf("Hai superato il numero massimo di tentativi per indovinare la parola. Rigioca sarai piu' fortunato!!");
}
}
printf("\nProgramma terminato");
return 0;
}
Ho fatto diversi tentativi di esecuzione e l'algoritmo sembra funzionare correttamente. Succede però che qualsiasi strada prendo (o decido di indovinare la parola o di finire i tentavi) ogni volta che termina il main mi esce la solita finestrella di windows invia segnalazione errori.
Secondo voi perchè si comporta così???