#include <stdio.h>
#include <time.h>
#include <windows.h>
#include <locale.h> //ékezetes karakterek miatt


/* Szöveges képernyőn pozícionál */
void gotoxy(short x, short y) {
    HANDLE hConsoleOutput;
    COORD dwCursorPosition;
    
    dwCursorPosition.X = x;
    dwCursorPosition.Y = y;
    hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE); 
    SetConsoleCursorPosition(hConsoleOutput,dwCursorPosition);
}

/* Szöveges képernyő adott pozícióján lévő karakter kiolvasása */
char charAt(short x, short y){
	CONSOLE_SCREEN_BUFFER_INFO screenBufferInfo;
	HANDLE hStd = GetStdHandle(STD_OUTPUT_HANDLE);
	if (!GetConsoleScreenBufferInfo(hStd, &screenBufferInfo))
		printf("GetConsoleScreenBufferInfo (%d)\n", GetLastError());
	char buf[2]; 
    COORD c = {x,y};
    DWORD num_read;
	if( !ReadConsoleOutputCharacter(hStd,(LPTSTR)buf,1,c,(LPDWORD)&num_read) )
		return ' ';
	return buf[0];
}

/* Beállítja a rajzolási színt. 7 a default szürke */
void setColor(short color) {
     HANDLE hConsole;
     hConsole=GetStdHandle(STD_OUTPUT_HANDLE);
     SetConsoleTextAttribute(hConsole, color);
}

/* c karaktert kiírja az x,y koordinátára color színnel */
void printxy(short x, short y, char c, short color) {
     gotoxy(x,y);
     setColor(color);
     printf("%c",c);
}




main() {
       setlocale(LC_ALL,""); //ékezetes karakterek miatt
       
       char map[10][10] =    {{'*','*','*','*','*','*','*','*','*','*'},
                                {'*','.','*','.','.','.','.','.','.','*'},
                                {'*','*','*','*','.','.','.','.','.','*'},
                                {'*','.','.','.','.','.','.','.','.','*'},
                                {'*','.','.','.','.','.','.','.','.','*'},
                                {'*','.','.','.','.','.','.','.','.','*'},
                                {'*','.','.','.','.','.','.','.','.','*'},
                                {'*','.','.','.','.','.','.','.','.','*'},
                                {'*','.','.','.','.','.','.','.','.','*'},
                                {'*','*','*','*','*','*','*','*','*','*'}
                                };
        int px=1,py=1;
        int fps=0;
        int last_time = time(NULL); 
        int sleep_value = 0;
        int tick_value = 0;
        const int GAME_FPS = 20; //ennyiszer mozgatjuk a játékost egy másodperc alatt
        
        while (1) {
            //PALYA KIRAJZOLASA
            gotoxy(0,0);
            for (int y=0; y<10; y++) {
               for (int x=0; x<10; x++) {
                   if (charAt(x,y)!=map[x][y]) {
                      if ((x!=px)||(y!=py)) {
                         if (map[y][x]=='*') //a falakat pirossal rajzoljuk
                            printxy(x,y,map[y][x],12);
                         else //egyéb elemeket szürkével
                            printxy(x,y,map[y][x],7);
                      }
                   }
               }
               printf("\n");
            }
            
            //JATEKOS KIRAJZOLASA
            printxy(px,py,'Ő',11);
            setColor(7); //visszaállítjuk a színt szürkére
                              
           
            //JATEKOS MOZGATASAS
            if (tick_value!=0 && fps%tick_value == 0) { //lassitja a jatekos mozgatasat masodpercenkent csak GAME_FPS-szer lép be ide
                if (GetAsyncKeyState(VK_LEFT)) {
                   px--;
                }
                if (GetAsyncKeyState(VK_RIGHT)) {
                   px++;
                }
                if (GetAsyncKeyState(VK_UP)) {
                   py--;
                }
                if (GetAsyncKeyState(VK_DOWN)) {
                   py++;
                }
                // KILEPES
                if (GetAsyncKeyState(VK_ESCAPE)) {
                  break;
                }
            }
            
            
            //FPS számolás
            fps++; //ennyiszer rajzoljuk ki a képrenyőre az adatokat egy másodperc alatt
            if (time(NULL)-last_time>=1) { //igaz ha eltelik egy másodperc
               tick_value = fps/GAME_FPS;
               gotoxy(1,11);
               printf("%dFPS",fps);
               gotoxy(1,12);
               printf("tick_value Értéke: %d",tick_value);
               fps = 0;
               last_time = time(NULL);
            }                        
        }
}
