See More

#include #include #include #include #include #include #include "struct.cpp" #include "fWork.cpp" HANDLE hstdout = GetStdHandle(STD_OUTPUT_HANDLE); // äëÿ óïðàâëåíèÿ âûâîäîì(äåñòðóêòîð êîíñîëè) const int LEFT = 75, RIGHT = 77, DOWN = 80, UP = 72, ESC = 27, ENTER = 13; //ñèñòåìíûå êëàâèøè const int Black = 0, White = 15; // öâåòà êîíñîëè void shapka_Y (const char **menu_this, int cur_oper, int size) { //âåðòèêàëüíî âûâîäèò ïóíêòû ìåíþ for (int i = 0; i < size; i++) { if (i == cur_oper) { // åñëè ýëåìåíò êîòîðûé âûâîäèì àêòèâíûé SetConsoleTextAttribute (hstdout, (White << 4 | Black)); // ñìåíà öâåòà âûâîäà â êîíñîëü } else { SetConsoleTextAttribute (hstdout, (Black << 4 | White)); } printf ("%s\n", menu_this[i]); } SetConsoleTextAttribute (hstdout, (Black << 4 | White)); } char* nameOfnTest (int n) { // âûâîäèò èìÿ àêòèâíîãî òåñòà WIN32_FIND_DATA FindFileData; // ñòðóêòóðà ôàéëîâ â âèíäå HANDLE hf = FindFirstFile ("./tests/*.txt", &FindFileData); // ïîèñê ïåðâîãî ôàéëà â äèðåêòîðèè int i = 0; if (hf != INVALID_HANDLE_VALUE) { // ïðîâåðêà íà ïðàâèëüíîñòü ïóòè do { if (n == i) // åñëè ýòî íóæíûé íàì ôàéë return FindFileData.cFileName; // âîçâðàùàåì èìÿ ôàééëà i++; } while (FindNextFile(hf, &FindFileData)); // ïîêà åñòü ñëåäóþùèé ôàéë FindClose (hf); // çàêðûâàåì äèðåêòîðèþ } } GAME* chuseDificalte (int n) { // ïîäãîòàâëèâàåì èãðó ê íà÷àëó GAME *game = (GAME*)malloc(sizeof(GAME)); game->next = NULL; game->rightQuest = 0; game->nQuest = 0; game->mark = 0; strcpy(game->dificalt, nameOfnTest(n)); // ñîõðàíÿåì èìÿ òåñòà return game; } int randRange (int max, int min) { // ãåíåðàöèÿ ðàíäîìíîãî ÷èñëà â äèàïîçîíå [a, b] return rand() % (max - min + 1) + min; } QUESTION* getNextQuestion (FILE *ft, QUESTION *quest) { fgets(quest->question, sizeof(quest->question), ft); // ñ÷èòûâàåì âñå ïîëÿ äëÿ âîïðîñà fgets(quest->true_answer, sizeof(quest->true_answer), ft); fgets(quest->answer1, sizeof(quest->answer1), ft); fgets(quest->answer2, sizeof(quest->answer2), ft); fgets(quest->answer3, sizeof(quest->answer3), ft); if (feof(ft)) // åñëè âîïðîñà íå áûëî, òî âåðíåì NULL return NULL; return quest; } USER* start (USER* user, GAME* game) { // ñàì òåñò char str[strlen(game->dificalt) + strlen("./tests/")]; strcpy (str, "./tests/"); strcat (str, game->dificalt); // ñîáèðàåì ïîëíûé ïóòü ê âûáðàííîìó òåñòó FILE *ft = fopen(str, "r"); // îòêðûòèå ôàéëà ñ òåñòîì QUESTION *cur = (QUESTION*)malloc(sizeof(QUESTION)); char *answer[4]; int nHelp = 3; cur = getNextQuestion (ft, cur); srand (time(NULL)); // íà÷èíàåì ïñåâäîðàíäîìíóþ ïîñëåäîâàòåëüíîñòü ñ òåêóùåãî âðåìåíè â ñåêóíäàõ for (cur; cur; cur = getNextQuestion (ft, cur)) { // ñ÷èòûâàåì âîïðîñû ïîêà íå äîéäåì äî êîíöà ôàéëà game->nQuest++; // ñ÷èòàåì êîë-âî âîïðîñîâ â òåñòå answer[0] = cur->true_answer; // ñ÷èòûâàåì âàðèàíòû îòâåòîâ answer[1] = cur->answer1; answer[2] = cur->answer2; answer[3] = cur->answer3; for (int i = 0; i < 10; i++) { // ïåðåìåøèâàåì îòâåòû int n1 = randRange(3, 0), n2 = randRange(3, 0); char *boof = answer[n1]; answer[n1] = answer[n2]; answer[n2] = boof; } system("cls"); printf ("%s", cur->question); for (int i = 0; i < 4; i++) // âûâîäèì îòâåòû íà ýêðàí printf ("%d. %s", i + 1, answer[i]); printf ("Âàø âûáîð?\n"); repid: ; int key = getch(); // ââîäèì íîìåð îòâåòà if (key - '0' >= 1 && key - '0' <= 4) { // ïðîâåðÿì íà êîððåêòíîñòü îòâåò if (!strcmp(answer[(key - '0') - 1], cur->true_answer)) // ïðîâåðÿåì âåðíûé ëè îòâåò game->rightQuest++; } else if (key == 'h' || key == 'ð') { // åñëè èñïîëüçîâàííà ïîäñêàõêà if (!nHelp) { // ïðîâåðÿåì îñòàëèñü ëè ïîäñêàçêè printf ("Çàêîí÷èëèñü ïîäñêàçêè\n"); goto repid; } nHelp--; system ("cls"); printf ("%s", cur->question); int n; if (!randRange(1, 0)) { // ïåðâûì áóäåò âåðíûé âàðèàíò îòâåòà answer[0] = cur->true_answer; do { n = randRange (3, 0); } while(!strcmp(answer[n], cur->true_answer)); answer[1] = answer[n]; printf ("1. %s2. %s", answer[0], answer[1]); } else { // ïåðâûì áóäåò íåâåðíûé âàðèàíò îòâåòà do { n = randRange (3, 0); } while(!strcmp(answer[n], cur->true_answer)); answer[0] = answer[n]; answer[1] = cur->true_answer; printf ("1. %s2. %s", answer[0], answer[1]); } repidEase: ; key = getch(); if (key - '0' >= 1 && key - '0' <= 2) { // òîæå ïðîâåðêà íà êîððåêòíîñòü if (!strcmp(answer[(key - '0') - 1], cur->true_answer)) game->rightQuest++; } else goto repidEase; } else // åñëè âûáðàí íåêêîðåêòíûé îòâåò goto repid; } game->next = user->rez; // ñîõðàíÿåò ðåçóëüòàò òåñòà â ñòàòèñòèêó ïîëüçîâàòåëÿ user->rez = game; if (game->rightQuest == 0) // âûñòàâëÿåì îöåíêó ïîëüçîâàòåëþ game->mark = 0; else game->mark = (float)game->rightQuest / (float)game->nQuest * 10; fclose(ft); free(cur); return user; // âîçâðàùàåì ïîëüçîâàòåëÿ } int sizeOfDir () { // óçíàåì êîë-âî ôàéëîâ â äèðåêòîðèè WIN32_FIND_DATA FindFileData; // âñå àíàëîãè÷íî ñ ôóíêöèåé nameOfnTest HANDLE hf = FindFirstFile ("./tests/*.txt", &FindFileData); int n = 0; if (hf != INVALID_HANDLE_VALUE){ do { n++; } while (FindNextFile(hf, &FindFileData)); FindClose (hf); } return n; } void writeTests (int activ) { // âûâîäèì âñå ôàéëà â äèðåêòîðèè WIN32_FIND_DATA FindFileData; HANDLE hf = FindFirstFile ("./tests/*.txt", &FindFileData); int n = 0; do { if (n == activ) // åñëè ôàéë àêòèâíûé, âûäåëÿåì åãî áåëûì SetConsoleTextAttribute (hstdout, (White << 4 | Black)); else SetConsoleTextAttribute (hstdout, (Black << 4 | White)); printf ("%s\n", FindFileData.cFileName); n++; } while (FindNextFile(hf, &FindFileData)); SetConsoleTextAttribute (hstdout, (Black << 4 | White)); } USER* startGame (USER *user) { int cur_oper = 0, // îòâå÷àåò çà òåêóùèé ïóíêò size = sizeOfDir() - 1; // áóäåò ïðîâåðÿòü íà âûõîä çà ïðåäåëû while (1) { system("cls"); writeTests(cur_oper); // âûâîäèì íàçâàíèÿ òåñòîâ switch(getch()){ // ñêðîëëèíã case DOWN: cur_oper++; if (cur_oper > size) // ïðîâåðÿåì íà âûõîä çà ïðåäåëû cur_oper = 0; break; case UP: cur_oper--; if (cur_oper < 0) cur_oper = size; break; case ENTER: return start (user, chuseDificalte(cur_oper)); // íà÷èíàåì òåñò ïîä ýòèì ïîëüçîâàòåëåì break; } } } void showRezult(USER* user) { // âûâîäèì ðåçóëüòàòû ïîëüçîâàòåëñÿ system("cls"); if (user->rez) { // åñëè ïîëüçîâàòåëü ïðîõîäèë õîòü îäèí òåñò GAME *cur = user->rez; for (cur; cur; cur = cur->next) // ïåðåõîäèì íà ñëåäóþùèé ðåçóëüòàò ïîêà îí åñòü printf ("Íàçâàíèå òåñòà: %s\n Ðåçóëüòàò: %d / %d \n îöåíêà %d \n", cur->dificalt, cur->rightQuest, cur->nQuest, cur->mark); } else printf ("Ðåçóëüòàòîâ íåò\n\n"); system ("pause"); } void gameMenu (USER *user) { // ìåíþ ïîñëå àâòîðèçàöèè const char *menu[] = {"Íà÷àòü òåñò", "Ïîêàçàòü ðåçóëüòàòû ïîëüçîâàòåëÿ", "Âûõîä èç àêêàóíòà"}; int cur_oper = 0; int size = sizeof(menu) / sizeof(char*); // êîë-âî ïóíêòîâ â ìåíþ while (1) { system("cls"); shapka_Y(menu, cur_oper, sizeof(menu) / sizeof(char*)); // îòðèñîâêà ìåíþ switch(getch()) { // ïî íàæàòîé êíîïêå case DOWN: // ñêðîëëèíã ïî ìåíþ cur_oper++; if (cur_oper > size - 1) // ïðîâåðêà íà âûõîä çà ïðåäåëû cur_oper = 0; break; case UP: cur_oper--; if (cur_oper < 0) cur_oper = (sizeof(menu) / sizeof(char*)) - 1; break; case ENTER: switch(cur_oper) { // íà êàäóþ êíîïêó ïðèâÿçàííà ñâîÿ ôóíêöèÿ. Âûïîëíÿåì åå â çàâèñèìîñòè îò cur_oper case 0: user = startGame (user); break; case 1: showRezult(user); break; case 2: saveUser (user); return; } break; default: break; } } } void startScreen () { // èíòåðàêòèâ ðàáîòàåò êàê è âî âñåõ îñòàëüíûõ ôóíêöèÿõ ìåíþ const char *menu[] = {"Ðåãèñòðàöèÿ", "Àâòîðèçàöèÿ", "Ïîìîùü", "Âûõîä"}; int cur_oper = 0; int size = sizeof(menu) / sizeof(char*); USER *user; while (1) { system ("cls"); shapka_Y (menu, cur_oper, size); switch (getch()) { case DOWN: cur_oper++; if (cur_oper > size - 1) cur_oper = 0; break; case UP: cur_oper--; if (cur_oper < 0) cur_oper = (sizeof(menu) / sizeof(char*)) - 1; break; case ENTER: switch (cur_oper) { case 0: user = registration(); if (user) gameMenu(user); break; case 1: user = autorisation(); if (user) gameMenu(user); break; case 2: { FILE *f = fopen ("HELP.txt", "r"); printFile (f); fclose (f); break; } case 3: return; } } } } int main() { system ("chcp 1251"); system ("cls"); // FILE *f = fopen ("splashScreen.txt", "r"); printFile (fopen ("splashScreen.txt", "r")); // fclose (f); startScreen(); }