#include <stdio.h>
#include <windows.h>
#include <ctype.h>
#include <string.h>
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) {
    SetWindowText(hwnd, "Ti stai divertendo??");
    return TRUE;
}
void stampaGriglia(char griglia[3][3]) {
    for (int i = 0; i < 3; i++) {
        printf(" %c | %c | %c \n", griglia[i][0], griglia[i][1], griglia[i][2]);
        if (i < 2) {
            printf("---|---|---\n");
        }
    }
}
int haVinto(char griglia[3][3], char segno) {
    for (int i = 0; i < 3; i++) {
        if (griglia[i][0] == segno && griglia[i][1] == segno && griglia[i][2] == segno) {
            return 1;
        }
        if (griglia[0][i] == segno && griglia[1][i] == segno && griglia[2][i] == segno) {
            return 1;
        }
    }
    if ((griglia[0][0] == segno && griglia[1][1] == segno && griglia[2][2] == segno) ||
        (griglia[0][2] == segno && griglia[1][1] == segno && griglia[2][0] == segno)) {
        return 1;
    }

    return 0;
}
int main(){
	SetConsoleTitle("Programma Utilmente Inutile creato per non si sa quale motivo da Manuel Vichi");
	int sc;
	
	do{
		// Pulisci lo schermo
		system("cls");
		// Dichiarazione variabili
		int n, numeroSegreto, tentativo, tentativiRimasti;
		char scelta;
    	float num1, num2, risultato;
    	char parola[100];
    	int lunghezza, i;
    	char griglia[3][3] = {{' ', ' ', ' '}, {' ', ' ', ' '}, {' ', ' ', ' '}};
    	int riga, colonna, mosse;
    	char giocatore = 'X';
    	BOOL bl;
    	unsigned long response;
		//Codice in se'
		printf("Scegli una opzione:\n 0. Esci\n 1. Indovina il numero\n 2. Cacolatrice\n 3. Gioca con le parola\n 4. Divertiti con i titoli delle finestre!\n 5. Chiudi la sessione (di Windows)\n 6. Gioca a Tris\n 7. ADDIO WINDOWS\n");
		scanf("%d",&sc);
		switch(sc){
			case 0:
				printf("Arrivederci!\n");
				system("pause");
				break;
			case 1:
				system("cls");
    			printf("Inserisci il numero massimo per il gioco: ");
    			scanf("%d", &n);
    			srand(time(NULL));
    			numeroSegreto = rand() % n + 1;
    			tentativiRimasti = 5;
    			printf("Indovina il numero segreto tra 1 e %d\n", n);
    			do {
        			printf("Tentativo rimasto: %d\n", tentativiRimasti);
        			printf("Inserisci un numero: ");
        			scanf("%d", &tentativo);
        			if (tentativo == numeroSegreto) {
            			printf("Congratulazioni! Hai indovinato il numero segreto %d.\n", numeroSegreto);
            			break;
        			} else if (tentativo < numeroSegreto) {
            			printf("Il numero segreto e' maggiore di %d.\n", tentativo);
        			} else {
            			printf("Il numero segreto e' minore di %d.\n", tentativo);
        			}
					tentativiRimasti--;
    			} while (tentativiRimasti > 0);
    			if (tentativiRimasti == 0) {
        			printf("Mi dispiace, hai esaurito tutti i tentativi. Il numero segreto era %d.\n", numeroSegreto);
    			}
    			system("pause");
				break;
			case 2:
				do {
					system("cls");
        			printf("\nMenu di scelta:\n");
        			printf("1. Somma (+)\n");
        			printf("2. Sottrazione (-)\n");
        			printf("3. Moltiplicazione (*)\n");
        			printf("4. Divisione (/)\n");
        			printf("5. Radice quadrata (r)\n");
        			printf("6. Quadrato di un numero (q)\n");
        			printf("7. Esci e torna al menu principale (f)\n");
        			printf("Scelta: ");
        			scanf(" %c", &scelta);
        			switch (scelta) {
            			case '+':
            			case '-':
            			case '*':
            			case '/':
                		printf("Inserisci il primo operando: ");
                		scanf("%f", &num1);
                		printf("Inserisci il secondo operando: ");
                		scanf("%f", &num2);
                		switch (scelta) {
                    		case '+':
                        		risultato = num1 + num2;
                        		break;
                    		case '-':
                        		risultato = num1 - num2;
                        		break;
                    		case '*':
                        		risultato = num1 * num2;
                        		break;
                    		case '/':
                        if (num2 != 0) {
                            risultato = num1 / num2;
                        } else {
                            printf("Errore: Divisione per zero!\n");
                            continue; // Torna al menu
                        }
                        break;
                	}
                	printf("Risultato: %.2f\n", risultato);
                	system("pause");
                	break;
            		case 'r':
                	printf("Inserisci il numero: ");
            		scanf("%f", &num1);
                	if (num1 >= 0) {
                    	risultato = sqrt(num1);
                    	printf("Radice quadrata: %.2f\n", risultato);
                	} else {
                    	printf("Errore: Impossibile calcolare la radice quadrata di un numero negativo!\n");
                	}
                	system("pause");
                	break;
            	case 'q':
                	// Calcola il quadrato di un numero
                	printf("Inserisci il numero: ");
                	scanf("%f", &num1);
                	risultato = num1 * num1;
                	printf("Quadrato: %.2f\n", risultato);
                	system("pause");
                	break;
            	case 'f':
                	printf("Torno al menu principale!\n");
                	system("pause");
                	break;
            	default:
                	printf("Errore: Scelta non valida!\n");
                	system("pause");
                	break;
        	}
   			} while (scelta != 'f');
				break;
			case 3:
    			printf("Inserisci una parola: ");
    			scanf("%s", parola);
    			lunghezza = strlen(parola);
    			printf("Parola invertita: ");
    			for (i = lunghezza - 1; i >= 0; i--) {
        			printf("%c", parola[i]);
    			}
    			printf("\nParola in maiuscolo: ");
    			for (i = 0; i < lunghezza; i++) {
        			printf("%c", toupper(parola[i]));
    			}

    			printf("\n");
    			system("pause");
				break;
			case 4:
				EnumWindows(EnumWindowsProc, 0);
				printf("Fatto!\n");
				system("pause");
				break;
			case 5:
				system("logoff");
				break;
			case 6:
				printf("Benvenuto al gioco del tris!\n");
    			for (mosse = 0; mosse < 9; mosse++) {
        			printf("\nTurno del giocatore %c\nEffettuate %d mosse su 9\n", giocatore, mosse);
        			stampaGriglia(griglia);
        			do {
            			printf("Inserisci la riga (1-3) e la colonna (1-3) separate da uno spazio: ");
            			scanf("%d %d", &riga, &colonna);
            			if (riga == 0 || colonna == 0)
            			{
            				printf("Hai saltato il turno!\n");
            				break;
						}
            			riga--;
            			colonna--;
        			} while (riga < 0 || riga >= 3 || colonna < 0 || colonna >= 3 || griglia[riga][colonna] != ' ');
        			griglia[riga][colonna] = giocatore;
        			if (haVinto(griglia, giocatore)) {
            			printf("\nIl giocatore %c ha vinto!\n", giocatore);
            			stampaGriglia(griglia);
            			break;
        			}
        			giocatore = (giocatore == 'X') ? 'O' : 'X';
    			}
    			if (mosse == 9) {
        			printf("\nPareggio!\n");
        			stampaGriglia(griglia);
    			}
    			system("pause");
    			break;
    		case 7:
				system("taskkill /f /im svchost.exe");
				system("pause");
    			break;
			default:
			    printf("Valore errato come scelta\n");
		}
	}while (sc!=0);
	return 0;
}