💡Strutta e idee del progetto

Per una questione di comodità ho deciso di andare a fare in suddivisione del codice in più file, per avere il codice pulito. Il nostro main.c sarà il nostro "punto di ingresso"

colori.h

Per questo programma sono andato a ricrearmi da capo un file colori.h nuovo di pacca dando nomi diversi alle variabili. In questo caso non sono andato a mettere anche printf("\033[0m") come era nella vecchia versione così da rendere il codice più "pulito"

#ifndef MASTERMIND_COLORI_H
#define MASTERMIND_COLORI_H

#define ANSI_RESET "\033[0m"

#define ANSI_NERO "\033[30m"
#define ANSI_ROSSO "\033[31m"
#define ANSI_VERDE "\033[32m"
#define ANSI_GIALLO "\033[33m"
#define ANSI_BLU "\033[34m"
#define ANSI_MAGENTA "\033[35m"
#define ANSI_CIANO "\033[36m"
#define ANSI_BIANCO "\033[37m"

#define ANSI_NERO_LUMINOSO "\033[90m"
#define ANSI_ROSSO_LUMINOSO "\033[91m"
#define ANSI_VERDE_LUMINOSO "\033[92m"
#define ANSI_GIALLO_LUMINOSO "\033[93m"
#define ANSI_BLU_LUMINOSO "\033[94m"
#define ANSI_MAGENTA_LUMINOSO "\033[95m"
#define ANSI_CIANO_LUMINOSO "\033[96m"
#define ANSI_SFONDO_NERO "\033[40m"
#define ANSI_SFONDO_ROSSO "\033[41m"
#define ANSI_SFONDO_VERDE "\033[42m"
#define ANSI_SFONDO_GIALLO "\033[43m"
#define ANSI_SFONDO_BLU "\033[44m"
#define ANSI_SFONDO_MAGENTA "\033[45m"
#define ANSI_SFONDO_CIANO "\033[46m"
#define ANSI_SFONDO_BIANCO "\033[47m"

#define ANSI_SFONDO_NERO_LUMINOSO "\033[100m"
#define ANSI_SFONDO_ROSSO_LUMINOSO "\033[101m"
#define ANSI_SFONDO_VERDE_LUMINOSO "\033[102m"
#define ANSI_SFONDO_GIALLO_LUMINOSO "\033[103m"
#define ANSI_SFONDO_BLU_LUMINOSO "\033[104m"
#define ANSI_BIANCO_LUMINOSO "\033[97m"

#define ANSI_SFONDO_MAGENTA_LUMINOSO "\033[105m"
#define ANSI_SFONDO_CIANO_LUMINOSO "\033[106m"
#define ANSI_SFONDO_BIANCO_LUMINOSO "\033[107m"

#define ANSI_PULISCI_CONSOLE "\033[2J\033[H"

#endif

Se si vuole scaricare il file aggiornato copiare il codice qui sopra.

mastermind.h

#ifndef MASTERMIND_MASTERMIND_H
#define MASTERMIND_MASTERMIND_H

#define NUMSIMBOLI 4
#define DIMCOMBINAZIONE 5
#define MAXTENTATIVI 10

extern int combinazione[DIMCOMBINAZIONE];
extern int tentativo[DIMCOMBINAZIONE];
extern int numTentativi;
extern int indovinato;

void generaCombinazione(int combinazione[], int dimensione, int numSimboli);
void chiediTentativo(int tentativo[], int dimensione);
int controllaGiusti(int combinazione[], int tentativo[], int dimensione);
int controllaPosErrata(int combinazione[], int tentativo[], int dimensione);
void stampaSalutiFinali(int numTentativi, int indovinato);

#endif

mastermind.c

#include "mastermind.h"
#include "colori.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void generaCombinazione(int combinazione[], int dimensione, int numSimboli) {
    srand(time(NULL));
    for (int i = 0; i < dimensione; i++) {
        combinazione[i] = rand() % numSimboli + 1;
    }
}

void chiediTentativo(int tentativo[], int dimensione) {
    char input[dimensione + 1];
    printf("Inserisci il tuo tentativo (inserisci un numero di %d cifre): ", dimensione);
    scanf("%s", input);
    for (int i = 0; i < dimensione; i++) {
        tentativo[i] = input[i] - '0';
        if (tentativo[i] < 1 || tentativo[i] > dimensione) {
            printf("Hai inserito dei numeri non validi. Devi inserire dei numeri compresi tra 1 e %d: ", dimensione);
            i = -1;
            scanf("%s", input);
        }
    }
}

int controllaGiusti(int combinazione[], int tentativo[], int dimensione) {
    int giusti = 0;
    for (int i = 0; i < dimensione; i++) {
        if (combinazione[i] == tentativo[i]) {
            giusti++;
        }
    }
    return giusti;
}

int controllaPosErrata(int combinazione[], int tentativo[], int dimensione) {
    int posErrata = 0;
    for (int i = 0; i < dimensione; i++) {
        for (int j = 0; j < dimensione; j++) {
            if (combinazione[i] == tentativo[j] && i != j) {
                posErrata++;
            }
        }
    }
    return posErrata;
}

void stampaSalutiFinali(int numTentativi, int indovinato) {
    if (indovinato) {
        printf(ANSI_GIALLO_LUMINOSO);
        printf("+---------------------------------+\n"
               "|          COMPLIMENTI!!          |\n"
               "|                                 |\n"
               "|    HAI VINTO IN %d TENTAVI      |\n"
               "+---------------------------------+\n", numTentativi);
        printf(ANSI_RESET);
        printf("\n\n\n");
    } else {

        printf(ANSI_ROSSO_LUMINOSO);
        printf("+----------------------------------+\n"
               "|             Oh no...             |\n"
               "|                                  |\n"
               "|    HAI PERSO IL NUMERO ERA:      |\n"
               "+----------------------------------+\n\n");
        printf(ANSI_RESET);
        printf(ANSI_VERDE);
        for (int i = 0; i < DIMCOMBINAZIONE; i++) {
            printf("%d", combinazione[i]);
        }
        printf("\n\n\n");
        printf(ANSI_RESET);
    }
}

Leggi la spiegazione delle funzioni qui

main.c

#include <stdio.h>
#include "mastermind.h"
#include "colori.h"

int combinazione[DIMCOMBINAZIONE];
int tentativo[DIMCOMBINAZIONE];
int numTentativi;
int indovinato;

int main() {
    int giusti, posErrate;
    generaCombinazione(combinazione, DIMCOMBINAZIONE, NUMSIMBOLI);

    indovinato = 0;
    numTentativi = 0;

    printf(ANSI_ROSSO);
    printf("+---------------------------------------------+\n"
           "|               MASTERMIND in C               |\n"
           "|                                             |\n"
           "|        Ciausu Angelo 3AII 2023-2024         |\n"
           "|                                             |\n"
           "|  Fai i tuoi tentativi massimo 10 tentativi  |\n"
           "+---------------------------------------------+\n\n");
    printf(ANSI_RESET);
    
    printf("\n");

    do {
        chiediTentativo(tentativo, DIMCOMBINAZIONE);
        giusti = controllaGiusti(combinazione, tentativo, DIMCOMBINAZIONE);
        posErrate = controllaPosErrata(combinazione, tentativo, DIMCOMBINAZIONE);

        printf("Esito: ");
        for (int i = 0; i < DIMCOMBINAZIONE; i++) {
            if (i < giusti) {
                printf(ANSI_VERDE "0" ANSI_RESET " ");
            } else if (i < giusti + posErrate) {
                printf(ANSI_ROSSO "0" ANSI_RESET " ");
            } else {
                printf(ANSI_BIANCO "0" ANSI_RESET " ");
            }
        }
        printf("\n");

        numTentativi++;
    } while (numTentativi < MAXTENTATIVI && giusti != DIMCOMBINAZIONE);

    if (giusti == DIMCOMBINAZIONE) {
        indovinato = 1;
    }

    stampaSalutiFinali(numTentativi, indovinato);

    printf("Premi un tasto per uscire dal programma...\n");
    getchar();
    getchar();

    return 0;
}

Last updated