Ciao a tutti,
da buon studente di ingegneria informatica ritengo che un codice non debba limitarsi a funzionare bene, ma anche essere nella sua versione migliore (più breve etc...). Di recente ho fatto la mia versione del gioco dell'impiccato e ho usato circa 130 linee di codice, commenti inclusi, e per i piccoli test che ho fatto io sembra funzionare bene. Volevo però condividerla con voi e farmi aiutare sull'ottimizzazione di questo codice.
Non serve che la riscriviate da capo, mi accontento anche di qualche piccolo consiglio con riferimento alle linee.
Grazie in anticipo a tutti!
//definisco le librerie e i define
#include <stdio.h>
#include <string.h>
#define N 15
#define TENT 10
//typedef
typedef enum {nascosto, indovinato, ND } stato;
typedef struct {
stato situazione;
char let;
}posizione;
//inizio il main
int main() {
//definizione variabili
posizione indovinato[N];
char parola[N], lettera, tent[N];
int trovato=0, i, len, cambio, scelta, tentativi=TENT, contatore=0;
//GIOCATORE 1
//printf+scanf per fargli inserire la parola
printf("Ciao Giocatore 1, benvenuto al gioco dell'impiccato\n");
printf("Tu hai l'incarico di scegliere una parola di massimo 15 caratteri che il tuo avversario dovra' indovinare\n");
printf("Sei pronto?\nINIZIAMO!\n");
printf("Inserire la parola che vuoi far indovinare al tuo avversario:\n");
fflush(stdin);
scanf("%s", parola);
// definire lo stato di ogni carattere se Nascosto o ND
len = strlen(parola);
for (i = 0; i < len; i++) {
indovinato[i].situazione = nascosto;
indovinato[i].let = parola[i];
}
for (i = len; i <= N; i++) {
indovinato[i].situazione = ND;
}
//chiedere quando è pronto per passare il pc all'avversario per poi printare tanti \n così da nascondere la parola
do {
printf("Premere 1 quando sei pronto a passare il PC al tuo avversario: ");
fflush(stdin);
scanf("%d", &cambio);
if (cambio = 1) {
for (i = 0; i < 30; i++)
printf("\n");
}
} while (cambio =! 1);
//GIOCATORE 2
//le regole
printf("Ciao Giocatore 2, benvenuto al gioco dell'impiccato.\n");
printf("Il tuo avversario ha scelto una parola per te che dovrai indovinare\n");
printf("In totale avrai %d tentativi per indovinare la parola scelta dal tuo avversario\n", tentativi);
printf("A ogni tentativo potrai scegliere se indovinare la presenza di una lettera o indovinare la parola completa\n");
printf("INIZIAMO\n");
//printa la lunghezza della p da indovinare, i trattini, le vite rimaste
printf("La parola che devi indovinare e' lunga %d caratteri\n\n", len);
for (i = 1; i <= len; i++)
printf("_ ");
printf("\n\n");
printf("Hai ancora %d tentativi\n", tentativi);
// ciclo while fino a quando non indovina la parola o finisce i tentativi
while (tentativi > 0 && !(trovato)) {
printf("Premere 0 per indovinare una lettera\nPremere 1 per indovinare la parola intera\n ");
scanf("%d", &scelta);
// chiedere se vuole indovinare una lettera o la parola completa
switch (scelta) {
//lettera
case 0:
printf("Quale lettera vuoi provare? ");
getchar();
scanf("%c", &lettera);
for (i = 0; i < len; i++) {
if (lettera == parola[i]) {
indovinato[i].situazione++;
}
}
tentativi--;
break;
//parola
case 1:
printf("Quale parola vuoi provare? ");
fflush(stdin);
scanf("%s", tent);
contatore = 0;
for (i = 0; i < len; i++) {
if (tent[i] == parola[i]) {
contatore++;
}
}
if (contatore == len) {
printf("Bravo hai indovinato la parola\n");
for (i = 0; i < len; i++){
indovinato[i].situazione++;
}
trovato = 1;
}
else {
printf("Mi dispiace questa non e' la parola giusta\n");
tentativi--;
}
break;
}
//print parola con lettere indovinate e tentativi rimasti
for (i = 0; i < len; i++) {
if (indovinato[i].situazione == 0) {
printf("_ ");
}
else printf("%c ", indovinato[i].let);
}
printf("\n");
printf("Hai ancora %d tentativi\n", tentativi);
}
//finiti i tentativi
if (tentativi == 0) {
printf("Mi dispiace, hai finito i tentativi\n");
printf("La parola era: %s", parola);
}
//indovinata la parola
if (trovato == 1) {
printf("Hai battuto il giocatore 1");
}
}