diff --git a/CMakeLists.txt b/CMakeLists.txt
index b387529e0c8c7de876dd82b2ed9a192869463052..b4473491aa34747ed336480fe9273234dd207953 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -3,7 +3,7 @@ project(nhf C)
 
 set(CMAKE_C_STANDARD 99)
 
-add_executable(nhf main.c view.c view.h move.c move.h files.c files.h)
+add_executable(nhf main.c view.c view.h move.c move.h files.c files.h debugmalloc-impl.h debugmalloc.h)
 
 target_link_libraries(nhf m)
 
diff --git a/Dokumentation/progdok.md b/Dokumentation/progdok.md
new file mode 100644
index 0000000000000000000000000000000000000000..3c842a33dd50439be5b05ae5e3540ef6cf9e8977
--- /dev/null
+++ b/Dokumentation/progdok.md
@@ -0,0 +1,307 @@
+# Super Mario szerű játék  
+# InfoC bagollyal
+## Programozói dokumentáció
+
+Réthelyi Bálint  
+IZUM0B
+
+## _view.c_, _view.h_:  
+Adatszerkezet _(view.h):_  
+ 
+```c
+typedef struct Button{
+    int x, y, w, h;
+    char title[50+1];
+    bool over, click;
+}Button;
+```  
+A gombokat kezelem vele.
+ 
+```c
+typedef struct Color{
+    int R, G, B;
+}Color;
+```  
+A színek kezelését oldom meg vele.
+
+```c
+typedef enum{
+    ground,
+    platform,
+    item
+}Type;
+```  
+A generálandó objektumok típusát kezelem ezzel.  
+
+```c
+typedef struct Palyaelem{
+    int x, y;
+    int hossz,  magassag;
+    Color color;
+    Type type;
+    struct Palyaelem *kov;
+}Palyaelem;
+```  
+Úgynevezett pályaelemek struktúráját hozom létre,
+amivel láncoltlistában tárolom az objektumokat a kódomban.  
+  
+```c
+typedef struct Player{
+    char name[50+1];
+    int score;
+    struct Player *kov;
+}Player;
+```  
+A játékosokat kezelem, ezt is láncoltlistában tárolva.
+
+```c
+extern int H;
+extern int W;
+extern int owl;
+
+extern SDL_Window *window;
+extern SDL_Renderer *renderer;
+extern TTF_Font *font;
+```    
+Globális változókban tárolom a megjelenített ablak méreteit,  
+valamint a bagoly méretét és az SDL könyvtár alap változóit,  
+valamint a felhasznált betütípusra mutató pointert.
+  
+függvények:  
+```c
+void sdl_init(int szeles, int magas);
+```  
+A függvény az InfoC oldalról származó sdl_init függvény módosítása.  
+```c
+SDL_Texture *kep_betolt(char *filename)
+{
+    SDL_Texture *kep = IMG_LoadTexture(renderer, filename);
+    if (kep == NULL)
+    {
+        SDL_Log("Nem nyithato meg a kepfajl: %s", IMG_GetError());
+        exit(1);
+    }
+    return kep;
+}
+```  
+A függvény segítségével betöltök egy képet a későbbi megjelenítéshez.  
+
+```c
+void kirajzol(SDL_Texture *kep, int x, int y) {
+
+    SDL_Rect src = {0, 0, 128, 128};
+    SDL_Rect dest = {x, y, owl, owl};
+    SDL_RenderCopy(renderer, kep, &src, &dest);
+}
+```  
+A korábban betöltött kép adott `x y` koordinátára kirajzolása.  
+```c
+int my_rand(int min, int max)
+{
+    return (rand() % (max - min) + min);
+}
+```  
+Mivel a kódomban sokszor kellett random generálnom értékeket,  
+ezért létrehoztam egy saját függvényt a könnyebb átláthatóság miatt.  
+```c
+Palyaelem *gen_elem(Palyaelem *elem, Type type){}
+```  
+A függvény legenerál egy adott típusú pályaelem egy elemét.  
+```c
+Palyaelem *gen_item(Palyaelem *platforms, Type type){}
+```  
+A függvény generál _item_-eket a korábban legenerált _platform_-okra.  
+```c
+Palyaelem* palya_gen(Palyaelem *eleje, Type type, int hany_elem){}
+```  
+Adott pályaelemet generál.
+```c
+void palyaelem_kirajzolo(Palyaelem *elem){}
+```   
+Kirajzol egy pályaelemet.  
+```c
+void palyakirajzol(Palyaelem *elem){}
+```  
+Végigmegy egy listán és kirajzolja az elemeit.  
+```c
+void draw_button(Button button, Color button_color, Color text_color){}
+```  
+Kirajzol egy paraméterként kapott gombot, adott színekkel.  
+```c
+void draw_score_board(Player *players, SDL_Event ev, Menu *gamestate, Button *back){}
+```  
+Kirajzolja a dicsőség táblát, valamint figyeli a _vissza_ gombot.  
+```c
+int last_stand(Palyaelem *elem){}
+```  
+A függvény az adott lista legutolsó elemének 'x' koordinátájával tér vissza.  
+```c
+bool input_text(char *dest, size_t hossz, SDL_Rect teglalap,  
+SDL_Color hatter, SDL_Color szoveg){}
+```  
+Az InfoC oldalon megtalálható függvény. Forrásban megjelölve.  
+  
+## _move.c, move.h:_  
+Adatszerkezet _(move.h):_  
+
+```c
+double v = 2;
+double vj = 8;
+double vx = 0, vy = 0;
+double g = 0.3; //saját gravitáció, mivel a 9.82 túl nehéz lenne... :'(
+int jump_t = 0;
+int score = 0;
+int max_score = 0;
+int startx = 0;
+int endx = 0;
+```  
+Olyan változók, melyek a mozgást hivatottak kezelni, ezért fontos, hogy  
+minden függvény elérje őket.  
+
+Függvénynek (_move.c_):  
+```c
+static bool move(SDL_Event ev, int *x, const int *y){}
+```  
+Belső függvény, mely az irányítást kezeli,  
+_előre, hátra, ugrás/esés_, visszatérési értéke a mozgás állapotától függ.  
+```c
+void keywatcher(SDL_Event ev, int x, int y, Menu *gamestate){}
+```  
+A függvény a kilépést figyeli (_ESC_ billentyű nyomásra kilép) 
+```c
+Palyaelem *palyamozgat(Palyaelem *eleje, int x){}
+```  
+Egy adott pályaelem-listát mozgat.  
+```c
+static void ontheplatform(SDL_Event ev, Palyaelem *platf, int *x, int *y){}
+```  
+Vizsgálom, hogy a játékos rajta van-e valamelyik pályaelemen (_platformon_)  
+és ha rajta van, akkor nem engedi hogy áteshessen rajta.    
+```c
+static void ontheground(SDL_Event ev, Palyaelem *ground_d, int *x, int *y){}
+```  
+A függvény a előzőhöz hasonlóan vizsgálja, hogy a játékos a talajon van-e.
+```c
+static void eattheitems(SDL_Event ev, Palyaelem **itemke, int x, int y){}
+```  
+A függvény az előzőhöz hasonló, vizsgálja, hogy a játékos összeszedte-e  
+az adott _tárgyat_, és kitörli azt a láncolt listából, ha igen.  
+```c
+static void onthecorners(int *x, int *y, Palyaelem *ground_d,  
+Palyaelem *platf, Palyaelem *itemke){}
+```  
+A függvény vizsgálja hogy a karakter elérte-e a pálya szélét.  
+```c
+static void movelogic(SDL_Event ev, int *x, int *y){}
+```  
+Ha a karakter mozog, akkor a koordinátáit növeli a _move_ függvényben generált sebességekkel.  
+```c
+void move_draw(SDL_Event ev, SDL_Texture *kep, int *x, int *y,  
+Palyaelem *ground_d,Palyaelem *platf, Palyaelem **itemke, Menu *gamestate, Player **players, char *username){}
+```  
+A függvény meghívja a mozgás-függvényeket, és kezeli a játék végét/halált.  
+```c
+Button clickwatcher(SDL_Event ev, Button button){}
+```  
+A függvény figyeli, hogy egy gomb felett van-e az egér, vagy, ha rákattintanak.  
+A változást visszatérési értékként adja vissza.  
+```c
+void menu(SDL_Event ev, Button *start, Button *load, Button *scoreboard, Button  *close, Menu *gamestate){}
+```  
+Kirajzolja a menüt és figyeli a menü gombjait.  
+
+## _files.c, files.h:_  
+Függvények (_files.c_):  
+
+```c
+Player *beolvas(FILE *fp, Player *lista){}
+```  
+Beolvassa egy fájlból az adatokat, és beírja egy listába, mellyel visszatér.  
+```c
+Player *hozzafuz(Player *lista, Player *elem){}
+```  
+Hozzáfűz egy elemet a listához (az elejére)  
+```c
+Player *osszefuz(Player *egyik, Player *masik){}
+```  
+Összefűz két listát.  
+```c
+Player *rendez(Player *lista){}
+```  
+A függvény rendezi a listát. A függvény nem saját, forrásban jelölöm.  
+```c
+Player *egy_elem(char *name, int score_point){}
+```  
+Létrehoz egy _Player_ típusú elemet, és feltölti az adatait.  
+```c
+void lista_filebair(Player *lista, FILE *fp){}
+```  
+Egy listát beír egy fájlba.  
+```c
+Player *open_file_to_read(char *filename){}
+```  
+Olvasásra nyit meg egy fájlt és visszatér egy listával, amit beolvasott és rendezett.  
+```c
+void open_file_to_write(char *filename, Player *players){}
+```  
+A függvény megnyit egy fájlt és beleírja a _players_ lista elemeit.  
+
+## _main.c:_  
+
+Függvények:
+```c
+void freeing(Palyaelem *elem)
+{
+    Palyaelem *mozgo = elem;
+    while (mozgo != NULL)
+    {
+        Palyaelem *kov = mozgo->kov;
+        free(mozgo);
+        mozgo = kov;
+    }
+}
+```  
+```c
+void freeing_player(Player *elem)
+{
+    Player *mozgo = elem;
+    while (mozgo != NULL)
+    {
+        Player *kov = mozgo->kov;
+        free(mozgo);
+        mozgo = kov;
+    }
+}
+```  
+A függvényekkel szabadítom fel a kódban használt listákat.
+
+```c
+Uint32 idozit(Uint32 ms, void *param) {
+    SDL_Event ev;
+    ev.type = SDL_USEREVENT;
+    SDL_PushEvent(&ev);
+    return ms;   /* ujabb varakozas */
+}
+```  
+Az SDL időzítéséhez használt függvény.
+
+```c
+int main(int argc, char *argv[]) {
+    .
+    .
+    .
+}
+```  
+A main függvényben beállítom az _SDL_-t, hogy a megfelelő megjelenítést biztosítsa  
+valamint a játék-változókat alaphelyzetbe állítom.  
+
+Legenerálom a pályát (pálya _alap_-ja, _pálya elemek_ és az összegyűjtendő _tárgyakat_).  
+
+Ezek után legenerálom a képernyő függvényében a képernyőn megjelenő gombokat:  
+_start, load, scoreboard, close, back, scoretitle_  
+
+Majd elindítom a játék ciklust (_game loop_), ahol a korábbi függvények segítségével  
+kezelem a játékmenetet.
+
+
+  
\ No newline at end of file
diff --git a/cmake-build-debug/CMakeFiles/nhf.dir/C.includecache b/cmake-build-debug/CMakeFiles/nhf.dir/C.includecache
index 1c78782560361d9c6bfff55590643da049869509..3e7a8c26beb21a058f1ffe6bcedcefc18b0f4a83 100644
--- a/cmake-build-debug/CMakeFiles/nhf.dir/C.includecache
+++ b/cmake-build-debug/CMakeFiles/nhf.dir/C.includecache
@@ -6,6 +6,32 @@
 
 #IncludeRegexTransform: 
 
+/home/blint/projects/nhf/debugmalloc-impl.h
+stdbool.h
+-
+stddef.h
+-
+stdlib.h
+-
+stdio.h
+-
+ctype.h
+-
+string.h
+-
+stdarg.h
+-
+process.h
+-
+unistd.h
+-
+
+/home/blint/projects/nhf/debugmalloc.h
+stdbool.h
+-
+debugmalloc-impl.h
+/home/blint/projects/nhf/debugmalloc-impl.h
+
 /home/blint/projects/nhf/files.h
 view.h
 /home/blint/projects/nhf/view.h
@@ -13,6 +39,8 @@ stdlib.h
 -
 stdio.h
 -
+debugmalloc.h
+/home/blint/projects/nhf/debugmalloc.h
 
 /home/blint/projects/nhf/main.c
 view.h
@@ -23,10 +51,46 @@ files.h
 /home/blint/projects/nhf/files.h
 time.h
 -
+debugmalloc.h
+/home/blint/projects/nhf/debugmalloc.h
+
+/home/blint/projects/nhf/move.c
+move.h
+/home/blint/projects/nhf/move.h
+view.h
+/home/blint/projects/nhf/view.h
+files.h
+/home/blint/projects/nhf/files.h
+debugmalloc.h
+/home/blint/projects/nhf/debugmalloc.h
 
 /home/blint/projects/nhf/move.h
 view.h
 /home/blint/projects/nhf/view.h
+files.h
+/home/blint/projects/nhf/files.h
+debugmalloc.h
+/home/blint/projects/nhf/debugmalloc.h
+
+/home/blint/projects/nhf/view.c
+view.h
+/home/blint/projects/nhf/view.h
+move.h
+/home/blint/projects/nhf/move.h
+SDL2/SDL.h
+-
+SDL2/SDL_image.h
+-
+SDL2/SDL2_gfxPrimitives.h
+-
+SDL2/SDL_ttf.h
+-
+stdlib.h
+-
+stdio.h
+-
+debugmalloc.h
+/home/blint/projects/nhf/debugmalloc.h
 
 /home/blint/projects/nhf/view.h
 SDL2/SDL.h
@@ -43,4 +107,6 @@ SDL2/SDL_ttf.h
 -
 stdbool.h
 -
+debugmalloc.h
+/home/blint/projects/nhf/debugmalloc.h
 
diff --git a/cmake-build-debug/CMakeFiles/nhf.dir/depend.internal b/cmake-build-debug/CMakeFiles/nhf.dir/depend.internal
index 98636268ccf5d632df23f927381d76881e099b4d..12b11a6bca32aa21f4ea1e61b3576b7213e47014 100644
--- a/cmake-build-debug/CMakeFiles/nhf.dir/depend.internal
+++ b/cmake-build-debug/CMakeFiles/nhf.dir/depend.internal
@@ -2,20 +2,27 @@
 # Generated by "Unix Makefiles" Generator, CMake Version 3.15
 
 CMakeFiles/nhf.dir/files.c.o
+ /home/blint/projects/nhf/debugmalloc-impl.h
+ /home/blint/projects/nhf/debugmalloc.h
  /home/blint/projects/nhf/files.c
- /home/blint/projects/nhf/files.h
- /home/blint/projects/nhf/move.h
  /home/blint/projects/nhf/view.h
 CMakeFiles/nhf.dir/main.c.o
+ /home/blint/projects/nhf/debugmalloc-impl.h
+ /home/blint/projects/nhf/debugmalloc.h
  /home/blint/projects/nhf/files.h
  /home/blint/projects/nhf/main.c
  /home/blint/projects/nhf/move.h
  /home/blint/projects/nhf/view.h
 CMakeFiles/nhf.dir/move.c.o
+ /home/blint/projects/nhf/debugmalloc-impl.h
+ /home/blint/projects/nhf/debugmalloc.h
+ /home/blint/projects/nhf/files.h
  /home/blint/projects/nhf/move.c
  /home/blint/projects/nhf/move.h
  /home/blint/projects/nhf/view.h
 CMakeFiles/nhf.dir/view.c.o
+ /home/blint/projects/nhf/debugmalloc-impl.h
+ /home/blint/projects/nhf/debugmalloc.h
  /home/blint/projects/nhf/files.h
  /home/blint/projects/nhf/move.h
  /home/blint/projects/nhf/view.c
diff --git a/cmake-build-debug/CMakeFiles/nhf.dir/depend.make b/cmake-build-debug/CMakeFiles/nhf.dir/depend.make
index f61b4035ca7062631f53b995b23385523f39060e..e2d1d1799dca9809fb3b839b744d1facc8a093d0 100644
--- a/cmake-build-debug/CMakeFiles/nhf.dir/depend.make
+++ b/cmake-build-debug/CMakeFiles/nhf.dir/depend.make
@@ -1,20 +1,27 @@
 # CMAKE generated file: DO NOT EDIT!
 # Generated by "Unix Makefiles" Generator, CMake Version 3.15
 
+CMakeFiles/nhf.dir/files.c.o: ../debugmalloc-impl.h
+CMakeFiles/nhf.dir/files.c.o: ../debugmalloc.h
 CMakeFiles/nhf.dir/files.c.o: ../files.c
-CMakeFiles/nhf.dir/files.c.o: ../files.h
-CMakeFiles/nhf.dir/files.c.o: ../move.h
 CMakeFiles/nhf.dir/files.c.o: ../view.h
 
+CMakeFiles/nhf.dir/main.c.o: ../debugmalloc-impl.h
+CMakeFiles/nhf.dir/main.c.o: ../debugmalloc.h
 CMakeFiles/nhf.dir/main.c.o: ../files.h
 CMakeFiles/nhf.dir/main.c.o: ../main.c
 CMakeFiles/nhf.dir/main.c.o: ../move.h
 CMakeFiles/nhf.dir/main.c.o: ../view.h
 
+CMakeFiles/nhf.dir/move.c.o: ../debugmalloc-impl.h
+CMakeFiles/nhf.dir/move.c.o: ../debugmalloc.h
+CMakeFiles/nhf.dir/move.c.o: ../files.h
 CMakeFiles/nhf.dir/move.c.o: ../move.c
 CMakeFiles/nhf.dir/move.c.o: ../move.h
 CMakeFiles/nhf.dir/move.c.o: ../view.h
 
+CMakeFiles/nhf.dir/view.c.o: ../debugmalloc-impl.h
+CMakeFiles/nhf.dir/view.c.o: ../debugmalloc.h
 CMakeFiles/nhf.dir/view.c.o: ../files.h
 CMakeFiles/nhf.dir/view.c.o: ../move.h
 CMakeFiles/nhf.dir/view.c.o: ../view.c
diff --git a/cmake-build-debug/CMakeFiles/nhf.dir/main.c.o b/cmake-build-debug/CMakeFiles/nhf.dir/main.c.o
index 83454226fd48a42f6a3fc0517dd5f370136e629a..9fdaf31e1e891fc76cf4e576a2a8b7d4fecdb6a1 100644
Binary files a/cmake-build-debug/CMakeFiles/nhf.dir/main.c.o and b/cmake-build-debug/CMakeFiles/nhf.dir/main.c.o differ
diff --git a/cmake-build-debug/CMakeFiles/nhf.dir/move.c.o b/cmake-build-debug/CMakeFiles/nhf.dir/move.c.o
index 817aeae99375a1c07d6ba704bfafe0c38356c613..03db692ffca3b1f7f3182117418acf1ed8a36180 100644
Binary files a/cmake-build-debug/CMakeFiles/nhf.dir/move.c.o and b/cmake-build-debug/CMakeFiles/nhf.dir/move.c.o differ
diff --git a/cmake-build-debug/CMakeFiles/nhf.dir/view.c.o b/cmake-build-debug/CMakeFiles/nhf.dir/view.c.o
index 66256bf5c466f6c93b1f5fe5caed78c1da282633..d6081389efec378d60855dd8ef3564d212e60809 100644
Binary files a/cmake-build-debug/CMakeFiles/nhf.dir/view.c.o and b/cmake-build-debug/CMakeFiles/nhf.dir/view.c.o differ
diff --git a/cmake-build-debug/asd.txt b/cmake-build-debug/asd.txt
index 3586ded5029adb4ae179d6d331d292f23dac5910..272a31a6b8fafb001f29cdddd47b8178a5792e21 100644
--- a/cmake-build-debug/asd.txt
+++ b/cmake-build-debug/asd.txt
@@ -1,6 +1,43 @@
-Blint Mester | 2
+azt mondta próbáljam ki | 9140
+Mike was here | 8888
+ydfhfgsh| 8348
+ggg| 8347
+fapapucs | 8289
+Jani :D | 7777
+aa| 7716
+unknown Player | 6666
+Cirkos Cica hajj| 2924
+Gajdos 4 president| 2874
+random string| 2387
+b| 1519
+bb| 1519
+vjodka| 1288
+alma| 1273
+Janos Pannonius Maximus Superbolicus| 1266
+c| 1184
+asd| 583
+ddd| 579
+a| 504
+f*ck the world| 438
+új játék| 438
+még újaabbb| 438
+a| 395
+aeálgkmkámmklás| 395
+sfgjgfkuigléoi| 262
+a| 220
+krumpli| 200
+fuck that shit | 192
+asd| 189
+asd| 179
+körte| 179
+asdasd| 154
+yssfg| 154
+alma| 153
+próba elemér | 141
+aaa| 139
+alma| 136
+ődflksdfb | 130
+hello world | 129
 Player1 a | 12
-unknown Player | 25023
-Mike was here | 999999
-Jani :D | 999997
-egy rakás szar vagyok | 88321
\ No newline at end of file
+Blint Mester | 2
+Próba János 42| 1805
diff --git a/cmake-build-debug/nhf b/cmake-build-debug/nhf
index 98b32a20847536e700586e17457cb968dcc2836d..ec0523ed3bd7bcbf30b620fe56823d4ee8953844 100755
Binary files a/cmake-build-debug/nhf and b/cmake-build-debug/nhf differ
diff --git a/cmake-build-debug/nhf.cbp b/cmake-build-debug/nhf.cbp
index 02469daf3d20c027886e31bab66575649db04c02..e92dd4109db19a9e1870b7b1997478b21bda2e8d 100644
--- a/cmake-build-debug/nhf.cbp
+++ b/cmake-build-debug/nhf.cbp
@@ -80,6 +80,12 @@
 				</MakeCommands>
 			</Target>
 		</Build>
+		<Unit filename="/home/blint/projects/nhf/debugmalloc-impl.h">
+			<Option target="nhf"/>
+		</Unit>
+		<Unit filename="/home/blint/projects/nhf/debugmalloc.h">
+			<Option target="nhf"/>
+		</Unit>
 		<Unit filename="/home/blint/projects/nhf/files.c">
 			<Option target="nhf"/>
 		</Unit>
diff --git a/files.c b/files.c
index 267599e9ba6d1bb9c8e1f49144acd5f694c44a88..5df93290b1d8b35dd7723ca216f4382825b29bbe 100644
--- a/files.c
+++ b/files.c
@@ -2,11 +2,9 @@
 // Created by blint on 2019. 11. 30..
 //
 
-#include "files.h"
 #include "view.h"
-#include "move.h"
-#include <stdlib.h>
 #include <stdio.h>
+#include "debugmalloc.h"
 
 Player *beolvas(FILE *fp, Player *lista)
 {
@@ -19,8 +17,6 @@ Player *beolvas(FILE *fp, Player *lista)
         lista = uj;
     }
 
-
-
     Player *mozgo;
     for (mozgo = lista; mozgo->kov != NULL; mozgo = mozgo->kov);
 
@@ -94,14 +90,14 @@ Player *egy_elem(char *name, int score_point)
     return elem;
 }
 
-void listakiir(Player *lista)
+void lista_filebair(Player *lista, FILE *fp)
 {
     if (lista == NULL)
         return;
     Player *mozgo;
     for (mozgo = lista; mozgo != NULL; mozgo = mozgo->kov)
     {
-        printf("%s %d\n", mozgo->name, mozgo->score);
+        fprintf(fp,"%s| %d\n", mozgo->name, mozgo->score);
     }
 }
 
@@ -117,4 +113,12 @@ Player *open_file_to_read(char *filename)
     //listakiir(elem);
     fclose(fp);
     return elem;
+}
+
+void open_file_to_write(char *filename, Player *players)
+{
+    FILE *fp;
+    fp = fopen(filename, "wt");
+    lista_filebair(players, fp);
+    fclose(fp);
 }
\ No newline at end of file
diff --git a/files.h b/files.h
index b67f770a23078c184e8e301a3e7caa69a2ab8ef1..77fae3b9dbe072928cef0199ea29014a24ac203e 100644
--- a/files.h
+++ b/files.h
@@ -8,8 +8,13 @@
 #include "view.h"
 #include <stdlib.h>
 #include <stdio.h>
+#include "debugmalloc.h"
 
 
 Player *open_file_to_read(char *filename);
 
+void open_file_to_write(char *filename, Player *players);
+
+Player *egy_elem(char *name, int score_point);
+
 #endif //NHF_FILES_H
diff --git a/main.c b/main.c
index 3f067741825628a3d4ef6691a75d02716f04522f..0e3f5878bcd04f7904ca02420a0bd5f008a68ccf 100644
--- a/main.c
+++ b/main.c
@@ -2,6 +2,7 @@
 #include "move.h"
 #include "files.h"
 #include <time.h>
+#include "debugmalloc.h"
 
 void freeing(Palyaelem *elem)
 {
@@ -14,6 +15,17 @@ void freeing(Palyaelem *elem)
     }
 }
 
+void freeing_player(Player *elem)
+{
+    Player *mozgo = elem;
+    while (mozgo != NULL)
+    {
+        Player *kov = mozgo->kov;
+        free(mozgo);
+        mozgo = kov;
+    }
+}
+
 Uint32 idozit(Uint32 ms, void *param) {
     SDL_Event ev;
     ev.type = SDL_USEREVENT;
@@ -33,21 +45,16 @@ int main(int argc, char *argv[]) {
 
     SDL_RenderPresent(renderer);
 
-    bool quit = false;
-    bool moving = false;
-    bool starting = false;
-    bool loading = false;
-    bool scoring = false;
-
     int elozo_x = 0;
     int elozo_y = W - 2*owl;
 
-    Palyaelem *platf = NULL, *itemke = NULL;
+    Palyaelem *platf = NULL, *itemke = NULL, *ground_d = NULL;
 
+    ground_d = palya_gen(ground_d, ground,50);
     platf = palya_gen(platf, platform,50);
     itemke = gen_item(platf, item);
 
-    endx = last_stand(platf) - 300;
+    endx = last_stand(platf);
 
     Button start;
 
@@ -86,6 +93,14 @@ int main(int argc, char *argv[]) {
     close.over = false;
     close.click = false;
 
+    Button back;
+    strcpy(back.title, "Visszamegyek, mert ez uncsi");
+    back.x = W/6;
+    back.w = W - (2*W/6);
+    back.y = H/9 * 5 + (H/18 * (5-1));
+    back.h = H/9;
+    back.click = false;
+
     Button scoretitle;
     scoretitle.x = 0;
     scoretitle.y = 0;
@@ -96,44 +111,48 @@ int main(int argc, char *argv[]) {
     Color white = (Color){255, 255, 255};
 
 
+    char username[50+1];
     Player *players = open_file_to_read("asd.txt");
 
-    while (!quit) {
+    Menu gamestate = on_menu;
+
+    while (gamestate != quit) {
 
         SDL_Event ev;
         SDL_WaitEvent(&ev);
         SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
         SDL_RenderClear(renderer);
+        palyakirajzol(ground_d);
         palyakirajzol(platf);
 
-        keywatcher(ev, bagoly, elozo_x, elozo_y,  &quit, &starting);
-        moving = starting;
+        keywatcher(ev, elozo_x, elozo_y,  &gamestate);
 
-        if (moving){
+        if (gamestate == on_game){
             SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
             SDL_RenderClear(renderer);
+            palyakirajzol(ground_d);
             palyakirajzol(platf);
             palyakirajzol(itemke);
-            move_draw(ev, bagoly, &elozo_x, &elozo_y, platf, &itemke);
+            kirajzol(bagoly, elozo_x, elozo_y);
+            move_draw(ev, bagoly, &elozo_x, &elozo_y, ground_d, platf, &itemke, &gamestate, &players, username);
             sprintf(scoretitle.title, "Score: %6d", max_score);
             draw_button(scoretitle, green, white);
         }
 
-        if (!scoring && !moving && !starting)
+        if (gamestate == on_menu) //draw menu
         {
-            menu(ev, &start, &load, &scoreboard, &close, &starting, &loading, &scoring, &quit);
+            menu(ev, &start, &load, &scoreboard, &close, &gamestate);
         }
 
-        if (!moving && !starting && scoring)
+        if (gamestate == on_score) //draw scoreboard
         {
             SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
             SDL_RenderClear(renderer);
-            draw_score_board(players, ev, &scoring);
+            draw_score_board(players, ev, &gamestate, &back);
         }
 
-        if (!moving && starting)
+        if (gamestate == on_start) //ask  for username
         {
-            char username[50+1];
             SDL_Rect r;
             r.x = W/6;
             r.y = (2*H/9 + H/18);
@@ -142,16 +161,18 @@ int main(int argc, char *argv[]) {
             SDL_Color text = {255, 255, 255, 255};
             SDL_Color bg = {0, 0, 0, 255};
             input_text(username, 50+1, r, bg,  text);
-            printf("%s\n", username);
-            moving = true;
+            //printf("%s\n", username);
+            gamestate = on_game;
         }
-
         SDL_RenderPresent(renderer);
     }
 
     SDL_DestroyTexture(bagoly);
     freeing(platf);
+    freeing(ground_d);
     freeing(itemke);
+    freeing_player(players);
+    SDL_RemoveTimer(timer_id);
     SDL_Quit();
 
     return 0;
diff --git a/move.c b/move.c
index 4e3d9c098124f97d17fec841eacae45d29e77c63..c6c4ef8727fa4871ae7ef303e88c03af5fa39b81 100644
--- a/move.c
+++ b/move.c
@@ -4,7 +4,8 @@
 
 #include "move.h"
 #include "view.h"
-
+#include "files.h"
+#include "debugmalloc.h"
 
 double v = 2;
 double vj = 8;
@@ -78,26 +79,26 @@ static bool move(SDL_Event ev, int *x, const int *y)
 
 }
 
-void keywatcher(SDL_Event ev, SDL_Texture *kep, int x, int y, bool *quit, bool *starting)
+void keywatcher(SDL_Event ev, int x, int y, Menu *gamestate)
 {
     switch (ev.type) {
         case SDL_KEYDOWN:
             switch (ev.key.keysym.sym) {
                 case SDLK_ESCAPE:
-                    *quit = true;
+                    *gamestate = quit;
                     break;
             }
 
         case SDL_KEYUP:
             switch (ev.key.keysym.sym) {
                 case SDLK_ESCAPE:
-                    *quit = true;
+                    *gamestate = quit;
                     break;
             }
             break;
 
         case SDL_QUIT:
-            *quit = true;
+            *gamestate = quit;
             break;
     }
 }
@@ -162,7 +163,9 @@ static void eattheitems(SDL_Event ev, Palyaelem **itemke, int x, int y)
             {
                 max_score += 50;
                 lemarado->kov = mozgo->kov;
+                lemarado = mozgo->kov;
                 free(mozgo);
+                mozgo = lemarado;
             }
         }
 
@@ -172,22 +175,37 @@ static void eattheitems(SDL_Event ev, Palyaelem **itemke, int x, int y)
     }
 }
 
-static void ontheground(int *x, int *y)
+static void ontheground(SDL_Event ev, Palyaelem *ground_d, int *x, int *y)
 {
-    if (*y >= (H - 2*owl))
+
+    Palyaelem *mozgo;
+    for (mozgo = ground_d; mozgo != NULL; mozgo = mozgo->kov)
     {
-        *y = H - 2*owl;
-        jump_t = 0;
+        if ((*x <= mozgo->x && (*x + owl) > (mozgo->x) ) || (*x >= mozgo->x && *x <= (mozgo->x + mozgo->hossz)))
+        {
+            if (*y >= (mozgo->y - owl))
+            {
+                *y = mozgo->y - owl;
+                vy = 0;
+                jump_t = 0;
+                if (ev.key.keysym.sym == SDLK_w || ev.key.keysym.sym == SDLK_UP || ev.key.keysym.sym == SDLK_SPACE)
+                {
+                    jump_t++;
+                }
+
+            }
+        }
     }
 }
 
-static void onthecorners(int *x, int *y, Palyaelem *platf, Palyaelem *itemke)
+static void onthecorners(int *x, int *y, Palyaelem *ground_d,Palyaelem *platf, Palyaelem *itemke)
 {
     //pálya bal szélénél eltolja a koordinátákat
     if (*x > (W - 5*owl))
     {
         *x = W - 5*owl;
         if (endx >= 0) {
+            palyamozgat(ground_d, (int) v);
             palyamozgat(platf, (int) v);
             palyamozgat(itemke, (int) v);
             startx += (int) v;
@@ -219,22 +237,35 @@ static void movelogic(SDL_Event ev, int *x, int *y)
     }
 }
 
-void move_draw(SDL_Event ev, SDL_Texture *kep, int *x, int *y, Palyaelem *platf, Palyaelem **itemke)
+void move_draw(SDL_Event ev, SDL_Texture *kep, int *x, int *y, Palyaelem *ground_d,Palyaelem *platf, Palyaelem **itemke, Menu *gamestate, Player **players, char *username)
 {
     //call move logic
     movelogic(ev, x, y);
 
     //platformokon ott marad
     ontheplatform(ev, platf, x, y);
+    //ontheplatform(ev, ground_d, x, y);
 
     //megeszi az itemeket
     eattheitems(ev, itemke, *x, *y);
 
     //talajszintnél lejjebb nem ugrik
-    ontheground(x, y);
+    ontheground(ev, ground_d, x, y);
 
     //a szeleknel eltolja a koordinatakat
-    onthecorners(x, y, platf, *itemke);
+    onthecorners(x, y, ground_d, platf, *itemke);
+
+    if ((*y >= H) || (*x >= endx + 650))
+    {
+        *gamestate = on_score;
+        Player *mozgo;
+        for (mozgo = *players; mozgo->kov != NULL; mozgo = mozgo->kov);
+        Player *uj = egy_elem(username, max_score);
+        mozgo->kov = uj;
+        open_file_to_write("asd.txt", *players);
+        *x = 0;
+        *y = 0;
+    }
 
     kirajzol(kep, *x, *y);
 }
@@ -268,7 +299,7 @@ Button clickwatcher(SDL_Event ev, Button button)
     return button;
 }
 
-void menu(SDL_Event ev, Button *start, Button *load, Button *scoreboard, Button  *close, bool *moving, bool *loading, bool *scoring, bool *quit)
+void menu(SDL_Event ev, Button *start, Button *load, Button *scoreboard, Button  *close, Menu *gamestate)
 {
     Color red = (Color){255, 0, 0};
     Color green = (Color){0, 255, 0};
@@ -301,25 +332,27 @@ void menu(SDL_Event ev, Button *start, Button *load, Button *scoreboard, Button
         draw_button(*close, red, white);
 
 
-    if (start->click)
-        *moving = true;
-    else
-        *moving = false;
+    if (start->click){
+        *gamestate = on_start;
+        start->click = false;
+    }
+
 
     if (load->click)
-        *loading = true;
-    else
-        *loading = false;
+    {
+        *gamestate = on_load;
+        load->click = false;
+    }
 
     if (scoreboard->click)
-        *scoring = true;
-    else
-       // *scoring = false;
-    {}
+    {
+        *gamestate = on_score;
+        scoreboard->click = false;
+    }
 
     if (close->click)
-        *quit = true;
-    else
-        //*quit = false;
-    {}
+    {
+        *gamestate = quit;
+        close->click = false;
+    }
 }
\ No newline at end of file
diff --git a/move.h b/move.h
index e21c41672199c250c0963ab83d5fabb6c9164338..63d9bd6c74e222b93516a112af93a2e1909314b7 100644
--- a/move.h
+++ b/move.h
@@ -6,6 +6,8 @@
 #define NHF_MOVE_H
 
 #include "view.h"
+#include "files.h"
+#include "debugmalloc.h"
 
 extern double v;
 extern double vx;
@@ -16,14 +18,14 @@ extern int max_score;
 extern int startx;
 extern int endx;
 
-void keywatcher(SDL_Event ev, SDL_Texture *kep, int x, int y, bool *quit, bool *starting);
+void keywatcher(SDL_Event ev, int x, int y, Menu *gamestate);
 
-void move_draw(SDL_Event ev, SDL_Texture *kep, int *x, int *y, Palyaelem *platf, Palyaelem **itemke);
+void move_draw(SDL_Event ev, SDL_Texture *kep, int *x, int *y, Palyaelem *ground_d,Palyaelem *platf, Palyaelem **itemke, Menu *gamestate, Player **players, char *username);
 
 Palyaelem *palyamozgat(Palyaelem *eleje, int x);
 
 Button clickwatcher(SDL_Event ev, Button button);
 
-void menu(SDL_Event ev, Button *start, Button *load, Button *scoreboard, Button *close, bool *moving, bool *loading, bool *scoring, bool *quit);
+void menu(SDL_Event ev, Button *start, Button *load, Button *scoreboard, Button *close, Menu *gamestate);
 
 #endif //NHF_MOVE_H
\ No newline at end of file
diff --git a/view.c b/view.c
index f9f7c3de6fc2f83669c30fffc211ec8b2f183a71..44b1db493353df735ae9abda63003cd79c657045 100644
--- a/view.c
+++ b/view.c
@@ -3,7 +3,6 @@
 //
 
 #include "view.h"
-#include "files.h"
 #include "move.h"
 #include <SDL2/SDL.h>
 #include <SDL2/SDL_image.h>
@@ -11,6 +10,7 @@
 #include <SDL2/SDL_ttf.h>
 #include <stdlib.h>
 #include <stdio.h>
+#include "debugmalloc.h"
 
 int H = 600;
 int W = 900;
@@ -65,6 +65,11 @@ void kirajzol(SDL_Texture *kep, int x, int y) {
     SDL_RenderCopy(renderer, kep, &src, &dest);
 }
 
+int my_rand(int min, int max)
+{
+    return (rand() % (max - min) + min);
+}
+
 Palyaelem *gen_elem(Palyaelem *elem, Type type)
 {
     Palyaelem *uj = (Palyaelem *) malloc(sizeof(Palyaelem));
@@ -75,8 +80,10 @@ Palyaelem *gen_elem(Palyaelem *elem, Type type)
         switch (type){
             case ground:
             {
-
-
+                uj->x = 0;
+                uj->y = H - owl;
+                uj->hossz = W;
+                uj->magassag = owl;
                 uj->color.R = 101;
                 uj->color.G = 67;
                 uj->color.B = 33;
@@ -114,6 +121,15 @@ Palyaelem *gen_elem(Palyaelem *elem, Type type)
     switch (type){
         case ground:
         {
+            uj->hossz = my_rand((W/2), W);
+
+            int xmin = mozgo->x + mozgo->hossz + owl;
+            int xmax = mozgo->x + mozgo->hossz + owl*5;
+            uj->x = my_rand(xmin, xmax);
+
+            uj->y = H - owl;
+            uj->magassag = owl;
+
             uj->color.R = 101;
             uj->color.G = 67;
             uj->color.B = 33;
@@ -125,11 +141,12 @@ Palyaelem *gen_elem(Palyaelem *elem, Type type)
 
             int xmin = mozgo->x + mozgo->hossz + owl;
             int xmax = mozgo->x + mozgo->hossz + owl*3;
-            uj->x = rand() % (xmax - xmin) + xmin;
+            uj->x = my_rand(xmin, xmax);
 
             int ymin = (mozgo->y - owl) < (H - 3*owl) ? (mozgo->y - owl) : (H - 3*owl);
             int ymax = mozgo->magassag + (4*owl);
-            uj->y = rand() % (ymax - ymin) + ymin;
+            uj->y = my_rand(ymin, ymax);
+
             if (uj->y >= (H - owl))
                 uj->y -= (3*owl);
             uj->magassag = 20;
@@ -169,7 +186,7 @@ Palyaelem *gen_item(Palyaelem *platforms, Type type)
         mozgo_i->hossz = owl/2;
         mozgo_i->magassag = owl/2;
         mozgo_i->type = item;
-        mozgo_i->color = (Color){255, 0, 0};
+        mozgo_i->color = (Color){255, 255, 0};
         mozgo_i->kov = (Palyaelem *) malloc(sizeof(Palyaelem));
         mozgo_i = mozgo_i->kov;
 
@@ -201,20 +218,9 @@ Palyaelem* palya_gen(Palyaelem *eleje, Type type, int hany_elem)
 
 void palyakirajzol(Palyaelem *elem)
 {
-    Palyaelem alap;
-    alap.x = 0;
-    alap.y = 550;
-    alap.hossz = 900;
-    alap.magassag = 50;
-    alap.color.R = 101;
-    alap.color.G = 67;
-    alap.color.B = 33;
-
-    palyaelem_kirajzolo(&alap);
     Palyaelem * mozgo;
     for (mozgo = elem; mozgo != NULL; mozgo = mozgo->kov)
         palyaelem_kirajzolo(mozgo);
-
 }
 
 void draw_button(Button button, Color button_color, Color text_color)
@@ -247,7 +253,7 @@ int last_stand(Palyaelem *elem)
     return mozgo->x;
 }
 
-void draw_score_board(Player *players, SDL_Event ev, bool *scoring)
+void draw_score_board(Player *players, SDL_Event ev, Menu *gamestate, Button *back)
 {
     int i = 1;
     Player *mozgo = players;
@@ -276,21 +282,16 @@ void draw_score_board(Player *players, SDL_Event ev, bool *scoring)
         mozgo = mozgo->kov;
     }
 
-    strcpy(button.title, "Visszamegyek, mert ez uncsi");
-    button.x = W/6;
-    button.w = W - (2*W/6);
-    button.y = last_y * i + (H/18 * (i-1));
-    button.h = H/9;
-    button.click = false;
-
-    draw_button(button, red, white);
+    *back = clickwatcher(ev, *back);
 
-    button = clickwatcher(ev, button);
-
-    if (button.click)
-        *scoring = false;
+    if (back->over)
+        draw_button(*back, green, white);
     else
-        *scoring = true;
+        draw_button(*back, red, white);
+
+    if (back->click) {
+        *gamestate = on_menu;
+    }
 }
 
 bool input_text(char *dest, size_t hossz, SDL_Rect teglalap, SDL_Color hatter, SDL_Color szoveg) {
diff --git a/view.h b/view.h
index eb404d153b9481e09c2a099edc19cfbb5cc71910..005b47b95a6559d26049fd795140cd844897e4fb 100644
--- a/view.h
+++ b/view.h
@@ -12,6 +12,7 @@
 #include <stdio.h>
 #include <SDL2/SDL_ttf.h>
 #include <stdbool.h>
+#include "debugmalloc.h"
 
 typedef enum{
     ground,
@@ -19,6 +20,15 @@ typedef enum{
     item
 }Type;
 
+typedef enum {
+    on_menu,
+    on_start,
+    on_game,
+    on_load,
+    on_score,
+    quit
+} Menu;
+
 typedef struct Color{
     int R, G, B;
 }Color;
@@ -71,7 +81,7 @@ Palyaelem *gen_item(Palyaelem *platforms, Type type);
 
 int last_stand(Palyaelem *elem);
 
-void draw_score_board(Player *players, SDL_Event ev, bool *scoring);
+void draw_score_board(Player *players, SDL_Event ev, Menu *gamestate, Button *back);
 
 bool input_text(char *dest, size_t hossz, SDL_Rect teglalap, SDL_Color hatter, SDL_Color szoveg);