💡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