diff --git a/main.c b/main.c new file mode 100644 index 0000000..f9aa1c8 --- /dev/null +++ b/main.c @@ -0,0 +1,52 @@ +#include "sudoku.h" + +int main(){ + int scelta; + randomize(); + do{ + system("clear"); + printf("%-66s%-66s%s\n\n", SOTTOLINEATO GIALLO, "Sudoku", RESET BIANCO); + printf("%-48s%s%s\n\n", ROSSO, "[1] "BIANCO, "Inserisci e risolvi uno schema"); + printf("%-48s%s%s\n\n", ROSSO, "[2] "BIANCO, "Genera e gioca uno schema"); + printf("%-48s%s%s\n\n", ROSSO, "[3] "BIANCO, "Informazioni"); + printf("%-48s%s%s\n\n", ROSSO, "[4] "BIANCO, "Esci"); + scanf("\n%d", &scelta); + + switch(scelta){ + //risolvi + case 1:{ + system("clear"); + printf("Da fare.\n"); + pausa(); + } + + //gioca + case 2:{ + inizializza(50); + do{ + system("clear"); + stampa(); + leggi_mossa(); + cancella_errati(); + system("clear"); + stampa(); + }while(!corretto()); + + printf("Hai risolto il sudoku. Complimenti\n"); + pausa(); + break; + } + + //About + case 3:{ + system(clear); + printf("%-66s%-66s%s\n\n", SOTTOLINEATO GIALLO, "Sudoku", RESET BIANCO); + printf("%-15s%s\n","", "Programma sviluppato da Michele Guerini Rocco in una stressante settimana di inizio autunno."); + pausa(); + break; + } + + } + + }while(scelta != 4); +} diff --git a/makefile b/makefile new file mode 100644 index 0000000..7439bb6 --- /dev/null +++ b/makefile @@ -0,0 +1,5 @@ +SHELL = /bin/sh +.SUFFIXES: +.SUFFIXES: .c .o +Tris-in-stile-c : main.c sudoku.c sudoku.h + gcc -std=c99 main.c sudoku.c -o "Sudoku" diff --git a/sudoku.c b/sudoku.c new file mode 100644 index 0000000..c43a4d7 --- /dev/null +++ b/sudoku.c @@ -0,0 +1,355 @@ +#include "sudoku.h" + +/* + * Restituisce un numero casuale nell'intervallo [min, max) + */ +int randomr(int min, int max){ + int base = rand(); + int intervallo = max - min; + if (RAND_MAX == base) + return randomr(min, max); + if (base < RAND_MAX - (RAND_MAX % intervallo)) + return min + base / (RAND_MAX / intervallo); + else + return randomr(min, max); +} + +/* + * Restituisce due numeri casuali diversi + */ +int *randomd(){ + int *r = (int *)malloc(2 * sizeof(int)); + do{ + r[0] = randomr(1,9); + r[1] = randomr(1,9); + }while(r[0] == r[1]); + return r; +} + +/* + * Scambia due variabili. + * Fallisce se si passa la stessa variabile 2 volte. + */ +void scambia(int* a, int* b){ + *a ^= *b; + *b ^= *a; + *a ^= *b; +} + +/* + * Blocca l'esecuzione finchè non viene premuto invio + */ +void pausa(){ + char c; + do + getchar(); + while ((c = getchar()) != '\n' && c != EOF); +} + +/* + * Cancella le evidenziature per i valori errati + */ +void cancella_errati(){ + for(int i=0; i + #include + #include + + /*Colori ANSI*/ + #define NERO "\033[22;30m" + #define BLU "\033[34m" + #define GIALLO "\033[33m" + #define BIANCO "\033[37m" + #define ROSSO "\033[31m" + #define VERDE "\033[32m" + #define RESET "\033[0m" + #define GRASSETTO "\033[1m" + #define SOTTOLINEATO "\033[4m" + + /*Definizioni*/ + #define randomize() srand((unsigned)time(NULL)) + #define n 9 + + /*Funzione specifiche degli os*/ + #ifdef __WIN32__ + + #include + #include + #define os 0 + #define clear "cls" + #define sleep(x) Sleep(x) + + #else + + #include + #include + #define os 1 + #define clear "clear" + #define sleep(x) usleep(x*1000) + + #endif + + /*Prototipi*/ + + int *randomd(void); + int randomr(int min, int max); + void scambia(int* a, int* b); + void stampa(void); + void vuota(void); + void cancella_errati(void); + void evidenzia(int m, int tipo); + void inizializza(int spazi); + int controlla_colonna(int m); + int controlla_riga(int m); + int controlla_quadrante(int m); + int **ottieni_quadrante(int m); + void leggi_mossa(void); + int corretto(void); + void pausa(void); + + /*Variabili globali*/ + int sudoku[n][n][2]; + +#endif