Ottimizzare un codice

di il
2 risposte

Ottimizzare un codice

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

2 Risposte

  • Re: Ottimizzare un codice

    Ciao, io farei qualcosa del genere:
    #include <stdio.h>
    #include <string.h>
    
    #define N 16
    #define TENT 10
    
    int main()
    {
        char parola[N];
        char stato[N];
        char input[N];
        int lettere[256] = {0};
        int len = 0;
        int n = 0;
    
        printf("(G1) INSERISCI PAROLA DA INDOVINARE(MAX %d CARATTERI): ", N - 1);
        scanf("%s", parola);
        for(char *ptr = parola; *ptr; ++ptr)
        {
            stato[len++] = '_';
        }
    
        for(int tent = TENT; tent && n < len;)
        {
            for(int i = 0; i < 300; ++i)
            {
                printf("\n");
            }
            for(int i = 0; i < len; ++i)
            {
                printf("%c ", stato[i]);
            }
            printf("\n\nTENTATIVI RIMASTI: %u\nLETTERE INSERITE:", tent);
            for(int i = 0; i < 256; ++i)
            {
                if(lettere[i])
                {
                    printf(" %c", i);
                }
            }
            printf("\n\n(G2) INSERISCI LETTERA O PAROLA(MAX %d CARATTERI): ", N - 1);
            scanf("%s", input);
            int len2 = strlen(input);
            if(len2 == 1)
            {
                if(!lettere[*input])
                {
                    lettere[*input] = 1;
                    int flag = 1;
                    for(int i = 0; i < len; ++i)
                    {
                        if(parola[i] == *input)
                        {
                            stato[i] = *input;
                            flag = 0;
                            ++n;
                        }
                    }
                    tent -= flag;
                }
            }
            else if(len2 == len)
            {
                int i;
                for(i = 0; i < len && input[i] == parola[i]; ++i);
                if(i == len)
                {
                    n = len;
                }
                --tent;
            }
        }
    
        for(int i = 0; i < 300; ++i)
        {
            printf("\n");
        }
        printf("LA PAROLA E': ");
        for(int i = 0; i < len; ++i)
        {
            printf("%c ", parola[i]);
        }
        if(n == len)
        {
            printf("\n\nG2 VINCE!\n\n");
        }
        else
        {
            printf("\n\nG1 VINCE!\n\n");
        }
        return 0;
    }
  • Re: Ottimizzare un codice

    Se ho capito bene, ho provato [CODE] //definisco le librerie e i define #include <stdio.h> #include <string.h> #define N 15 #define TENT 10 //inizio il main int main() { //definizione variabili char parola1[N], parola2[N], lettera, tent[N]; int c1, len, cambio, scelta, tentativi=TENT; //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", parola1); // definire lo stato di ogni carattere se Nascosto o ND len = strlen(parola1); for (c1 = 0; c1 < N; c1++) { parola2[c1]='_'; } //chiedere quando è pronto per passare il pc all'avversario per poi printare tanti \n così da nascondere la parola1 printf("Premere invio quando sei pronto a passare il PC al tuo avversario: "); fflush(stdin); scanf("%c", &tent); for (c1 = 0; c1 < 30; c1++) printf("\n"); //GIOCATORE 2 //le regole printf("Ciao Giocatore 2, benvenuto al gioco dell'impiccato.\n"); printf("Il tuo avversario ha scelto una parola1 per te che dovrai indovinare\n"); printf("In totale avrai %d tentativi per indovinare la parola1 scelta dal tuo avversario\n", tentativi); printf("A ogni tentativo potrai scegliere se indovinare la presenza di una lettera o indovinare la parola1 completa\n"); printf("INIZIAMO\n"); //printa la lunghezza della p da indovinare, i trattini, le vite rimaste printf("La parola1 che devi indovinare e' lunga %d caratteri\n\n", len); // ciclo while fino a quando non indovina la parola1 o finisce i tentativi while (tentativi > 0) { //print parola1 con lettere indovinate e tentativi rimasti for (c1 = 0; c1 < len; c1++) printf("%c ", parola2[c1]); printf("\nHai ancora %d tentativi\n", tentativi); printf("Premere 0 per indovinare una lettera\nPremere 1 per indovinare la parola1 intera\n "); fflush(stdin); scanf("%d", &scelta); // chiedere se vuole indovinare una lettera o la parola1 completa switch (scelta) { //lettera case 0: printf("Quale lettera vuoi provare? "); getchar(); scanf("%c", &lettera); for (c1 = 0; c1 < len; c1++) { if (lettera == parola1[c1]) { parola2[c1]=lettera; } } tentativi--; break; //parola1 case 1: printf("Quale parola1 vuoi provare? "); fflush(stdin); scanf("%s", tent); if (!strcmp(tent,parola1)) { printf("Bravo hai indovinato la parola1\nHai battuto il giocatore 1"); tentativi=-1; } else { printf("Mi dispiace questa non e' la parola1 giusta\n"); tentativi--; } break; } } //finiti i tentativi if (tentativi == 0) { printf("Mi dispiace, hai finito i tentativi\n"); printf("La parola1 era: %s", parola1); } return 0; }
Devi accedere o registrarti per scrivere nel forum
2 risposte