diff --git a/Makefile b/Makefile
index c1eed559bbfedbb2e225a1dab9ef2b04b31c9d65..99cab8ffc4956b6e5f9d65116ef0da1f4babd221 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 CFLAGS=$(shell pkg-config --cflags sdl2 SDL2_image SDL2_ttf) -std=c99 -Wall -Wextra -pedantic -g -O0
 CPPFLAGS=-MMD -MF $*.d # Generate dependency files
 LDLIBS=$(shell pkg-config --libs sdl2 SDL2_image SDL2_ttf) -lm 
-OBJ=output.o map.o rows.o auto.o charac.o main.o init.o
+OBJ=output.o map.o rows.o auto.o charac.o main.o init.o gameLoop.o
 CC=gcc 
 
 all: main 
diff --git a/gameLoop.c b/gameLoop.c
new file mode 100644
index 0000000000000000000000000000000000000000..b26f4f22a363fc4162c173922b0a1b55338626a6
--- /dev/null
+++ b/gameLoop.c
@@ -0,0 +1,73 @@
+#include "header.h"
+#include <time.h>
+#include <stdbool.h>
+
+void gameLoop(SDL_Renderer* renderer, SDL_Window* window) {
+    // Anfangskoordinaten für den Spieler und dessen Größe
+    SDL_Rect player = {
+                    .x = 420,
+                    .y = 820,
+                    .w = 60,
+                    .h = 60};
+
+    bool run = true;
+    int input;
+    SDL_Event e;
+    bool start_game = false;
+    // Character
+    SDL_Rect *character = &player;
+    // erzeuge verkettete Liste, welche die Karte speichert
+    struct LinkedList *list = init_map(character); 
+    Uint32 start = SDL_GetTicks();
+
+    while (run) {
+        while (SDL_PollEvent(&e)) {
+            switch (e.type){
+                case SDL_QUIT:				// Fenster Schließen 
+                      run = false;
+                      break;
+                case SDL_KEYDOWN:				// Keystroke ?
+                      input = e.key.keysym.scancode;
+                      start_game = true; // könnte man auch später für das Menü benutzten
+                      jump(input, character);
+                      break;
+                default: 
+                      break; 
+            }
+        }
+
+        // Wenn der Spieler weit oben ist, dann soll sich 
+        // die Kammera schneller bewegen
+        int speed;
+        if (run){
+            if (!start_game){
+              speed = 0;
+            }else if (character->y < 400){
+                speed = 8;
+            }
+            else{
+              speed = 1;
+            }
+       	    run = !move_map(speed,list,character,renderer);
+        }
+
+        //update Character
+        update_character(speed,character, renderer);
+        paste_score (renderer, playerhighscore, font);
+        
+        SDL_RenderPresent(renderer);
+        SDL_UpdateWindowSurface(window);
+
+        if(character->y >= 965){
+          run = false;
+        }
+
+        // Spiel bekommt eine feste Aktuallisierungsrate von ~60 fps
+        Uint32 end = SDL_GetTicks();
+        while (end - start < 16) {
+            end = SDL_GetTicks();
+        }
+    }
+        free_map(list);
+        return;
+}
diff --git a/header.h b/header.h
index 924116f7ce281ff41bafc091c6df77c5dda53654..3d5b1955d5965837f619e134ef62c4f285c5d85d 100644
--- a/header.h
+++ b/header.h
@@ -50,8 +50,8 @@ struct LinkedList_Auto{
 
 
 //Declarations of Functions
-struct Node* init_row(struct Node*);
-struct LinkedList* init_map();
+struct Node* init_row(struct Node*, SDL_Rect *player);
+struct LinkedList* init_map(SDL_Rect *player);
 int move_map(int,struct LinkedList*,SDL_Rect*,SDL_Renderer*);
 int paste_row(SDL_Renderer*, int , enum row);
 void free_map(struct LinkedList*);
@@ -70,9 +70,11 @@ void move_character(int,SDL_Rect*);
 void start_screen(void);
 void end_screen(int);
 int init(SDL_Renderer*);
-int exitGame(struct LinkedList*, SDL_Renderer*, SDL_Window*);
+int exitGame(SDL_Renderer*, SDL_Window*);
+void gameLoop(SDL_Renderer*, SDL_Window*);
 
 extern SDL_Rect player;
+extern TTF_Font* font;
 
 extern int playerscore;
 extern int playerhighscore;
diff --git a/init.c b/init.c
index 797112201c54007ca2d469406b602520f2c9a4e0..a067facac4c479b34992a320e873faaaf310da24 100644
--- a/init.c
+++ b/init.c
@@ -1,5 +1,6 @@
 #include "header.h"
 #include <SDL_image.h>
+#include <SDL_ttf.h>
 
 SDL_Texture *img_grassDark;
 SDL_Texture *img_grassBright;
@@ -12,11 +13,19 @@ SDL_Texture *img_waterDarkSingle;
 SDL_Texture *img_waterDarkMultiple;
 SDL_Texture *img_finishlineBright;
 SDL_Texture *img_finishlineDark;
+TTF_Font* font;
 
 int playerscore = 0;
 int playerhighscore = 0;
 
 int init(SDL_Renderer* renderer) {
+
+    //Initiiere Text
+    TTF_Init();
+    //this opens a font style and sets a size
+    TTF_Font* font = TTF_OpenFont("Go-Mono.ttf", 50);
+        if (font == NULL) printf("Font Loading failed: %s\n", TTF_GetError());
+    
     // Lade alle Bilder die benötigt werden
     img_grassDark = IMG_LoadTexture(renderer,"images/dark_grass.jpg");
     img_grassBright = IMG_LoadTexture(renderer,"images/bright_grass.jpg");
@@ -49,9 +58,7 @@ int init(SDL_Renderer* renderer) {
 }
 
 
-int exitGame(struct LinkedList* list, SDL_Renderer* renderer, SDL_Window* window) {
-    free_map(list);
-
+int exitGame(SDL_Renderer* renderer, SDL_Window* window) {
     SDL_DestroyRenderer(renderer);
     SDL_DestroyWindow(window);
     SDL_DestroyTexture(img_grassDark);
diff --git a/main.c b/main.c
index 5be5fd86ea5c60c2066258078fe86111640346e9..c145b0d380bb0b09f50145fb63ada1be691dba43 100644
--- a/main.c
+++ b/main.c
@@ -2,14 +2,6 @@
 #include <SDL_image.h>
 #include <stdbool.h>
 #include <time.h>
-#include <SDL_ttf.h>
-
-// Anfangskoordinaten für den Spieler und dessen Größe
-    SDL_Rect player = {
-                    .x = 420,
-                    .y = 820,
-                    .w = 60,
-                    .h = 60};
 
 int main(void) {
 
@@ -43,73 +35,13 @@ int main(void) {
     }
 
     init(renderer);
-
-    //Initiiere Text
-    TTF_Init();
-    //this opens a font style and sets a size
-    TTF_Font* font = TTF_OpenFont("Go-Mono.ttf", 50);
-        if (font == NULL) printf("Font Loading failed: %s\n", TTF_GetError());
     
-    // erzeuge verkettete Liste, welche die Karte speichert
-    struct LinkedList *list = init_map(); 
-
-    // Character
-    SDL_Rect *character = &player;
-    int input;
-    SDL_Event e;
     bool quit = false;
-    bool start_game = false;
 
     while (quit == false) {
-        Uint32 start = SDL_GetTicks();
-        while (SDL_PollEvent(&e)) {
-            switch (e.type){
-                case SDL_QUIT:				// Fenster Schließen 
-                      quit = true;
-                      break;
-                case SDL_KEYDOWN:				// Keystroke ?
-                      input = e.key.keysym.scancode;
-                      start_game = true; // könnte man auch später für das Menü benutzten
-                      jump(input, character);
-                      break;
-                default: 
-                      break; 
-            }
-        }
-
-        // Wenn der Spieler weit oben ist, dann soll sich 
-        // die Kammera schneller bewegen
-        int speed;
-        if (!quit){
-            if (!start_game){
-              speed = 0;
-            }else if (character->y < 400){
-                speed = 8;
-            }
-            else{
-              speed = 1;
-            }
-       	    quit = move_map(speed,list,character,renderer);
-        }
-
-        //update Character
-        update_character(speed,character, renderer);
-        paste_score (renderer, playerhighscore, font);
-        
-        SDL_RenderPresent(renderer);
-        SDL_UpdateWindowSurface(window);
-
-        if(character->y >= 965){
-          quit = true;
-        }
-
-        // Spiel bekommt eine feste Aktuallisierungsrate von ~60 fps
-        Uint32 end = SDL_GetTicks();
-        while (end - start < 16) {
-            end = SDL_GetTicks();
-        }
+        gameLoop(renderer, window);
     }
-
-    exitGame(list, renderer, window);
+    
+    exitGame(renderer, window);
     return(0);
 }
diff --git a/map.c b/map.c
index d7277c7554254343dd3aaa6aaa734e3b7bdb3e19..35cd6e9c8df54d5db451d0811456e88c6defcec4 100644
--- a/map.c
+++ b/map.c
@@ -9,7 +9,7 @@
 // WICHTIG: Bei jeder Reihe OHNE Autos muss der Wert autos auf NULL
 // gesetzt werde, da es sonts zu Fehlern kommt
 
-struct LinkedList* init_map(void){
+struct LinkedList* init_map(SDL_Rect* character){
 
     struct LinkedList *list = malloc(sizeof(*list));
     
@@ -24,7 +24,7 @@ struct LinkedList* init_map(void){
     // erzeuge 9 weitere Knoten mit zufälligem Typ
     for(int i = 0;i<9;i++){
 
-        struct Node *m = init_row(n);
+        struct Node *m = init_row(n, character);
         n->next = m;
         n = m;
         
@@ -39,7 +39,7 @@ struct LinkedList* init_map(void){
 // Wenn die unterste Reihe aus dem Fenster geschoben wurde, dann wird diese gelöscht
 // Gleichzeitig wird ein neue Reihe erzeugt, welche am Ende der verketteten Liste eingefügt wird
 
-int move_map(int delta_y,struct LinkedList *list,SDL_Rect *character,SDL_Renderer* renderer){
+int move_map(int delta_y,struct LinkedList *list,SDL_Rect *character, SDL_Renderer* renderer){
 
     int water;
     struct Node *cur = list->head;
@@ -92,7 +92,7 @@ int move_map(int delta_y,struct LinkedList *list,SDL_Rect *character,SDL_Rendere
     // Das Schachbrettmuster bleibt erhalten
     if (newNode){
 
-        struct Node *n = init_row(cur);
+        struct Node *n = init_row(cur, character);
         cur->next = n;
         n->next = NULL;
     }
diff --git a/rows.c b/rows.c
index a7341d168391d759edf632024a635be19c4ba1dc..bd4102d4d81ed72fcbd470b5fe7713d67c5f6d80 100644
--- a/rows.c
+++ b/rows.c
@@ -102,12 +102,12 @@ struct Node* water(bool first,bool dark,int y_pos){
 // Initalisert alle Werte für eine neu erzeugte Reihe
 // WICHTIG: Bei jeder Reihe OHNE Autos muss der Wert autos auf NULL
 // gesetzt werde, da es sonst zu Fehlern kommt
-struct Node* init_row(struct Node *m){
+struct Node* init_row(struct Node *m, SDL_Rect *character){
     struct Node *n;
     int p;
 
     // Ziellinie erscheint alle 100 Punkte
-    if((playerhighscore + (player.y/100)) % 100 == 99){
+    if((playerhighscore + (character->y/100)) % 100 == 99){
         if (m->row_type != grassDark && m->row_type != waterDarkSingle && m->row_type != waterDarkMultiple){
             n = grass(true,true,m->y_pos - 100);
         }else{
@@ -141,7 +141,7 @@ struct Node* init_row(struct Node *m){
 
         // Es wird verhindert, dass nur eine Flussreihe erzeugt wird,
         // da jedes 100. Feld durch eine goldene Grasreihe ersetzt wird
-        }else if (p == 2 && ((playerhighscore + (player.y/100)) % 100 != 98)){
+        }else if (p == 2 && ((playerhighscore + (character->y/100)) % 100 != 98)){
             if (m->row_type == grassDark ){
                 n = water(true,false,m->y_pos - 100);
             }else{