#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();
}