diff --git a/auto.c b/auto.c
index 27d3bca97846b2512f58f627f77e6b66d9603b51..97007d696a4aee18d73dbf3bfbb67ce500df1d83 100644
--- a/auto.c
+++ b/auto.c
@@ -3,7 +3,7 @@
 #include "header.h"
 
 // Es wird ein Auto/Boot mit den Parametern erzeugt und zurückgegeben
-struct Auto* init_car(int speed,int width,int height,int pred_pos,int pred_width){
+struct Auto* init_car(int speed,int width,int height,int pred_pos,int pred_width,enum vehicle t){
     struct Auto *b = malloc(sizeof(*b));
     
     if (b == NULL){
@@ -11,34 +11,31 @@ struct Auto* init_car(int speed,int width,int height,int pred_pos,int pred_width
     }
 
     int p = rand() % 10;
-    // Münze 10 %
     
-    if (p != 0){
-        b->coin = 0;
-        b->width = width;
-        b->height = height;
-
+    if (p == 0 && t == car){
+        b->width = 50;
+        b->height = 50;
+        b->type = coin;
         if (pred_width == 0){
             b->x_pos = pred_pos;
         }else{
-            int min_distance = 100 * abs(speed);
-            int distance = (rand() % 300) + min_distance;
+            int distance = 25;
 
             if (speed < 0){
                 b->x_pos = pred_pos + pred_width + distance;
             }else{
                 b->x_pos = pred_pos - b->width - distance;
             }
-
         }
-    }else{ // Initialisierung einer Münze
-        b->coin = 1;
-        b->width = 50;
-        b->height = 50;
+    }else{
+        b->width = width;
+        b->height = height;
+        b->type = t;
         if (pred_width == 0){
             b->x_pos = pred_pos;
         }else{
-            int distance = 25;
+            int min_distance = 100 * abs(speed);
+            int distance = (rand() % 300) + min_distance;
 
             if (speed < 0){
                 b->x_pos = pred_pos + pred_width + distance;
@@ -52,19 +49,19 @@ struct Auto* init_car(int speed,int width,int height,int pred_pos,int pred_width
 }
 
 // erzeugt eine verkettete Liste an Autos
-struct LinkedList_Auto* init_car_list(int speed,int length,int width,int start_pos){
+struct LinkedList_Auto* init_car_list(int speed,int length,int width,int start_pos,enum vehicle t){
     struct LinkedList_Auto *list = malloc(sizeof(*list));
 
     if (list == NULL){
             perror("kein Speicherplatz");
         }
 
-    struct Auto *a = init_car(speed,length,width,start_pos,0);
+    struct Auto *a = init_car(speed,length,width,start_pos,0,t);
     list->head = a;
 
     for(int i = 0;i<5;i++){
     
-        struct Auto *b = init_car(speed,length,width,a->x_pos,a->width);
+        struct Auto *b = init_car(speed,length,width,a->x_pos,a->width,t);
 
         a->next = b;
         a = b;
@@ -79,42 +76,48 @@ struct LinkedList_Auto* init_car_list(int speed,int length,int width,int start_p
 // und ruft die Ausgabe-Funktion auf
 // Es wird 0 zurückgegeben, wenn es keine Kollision moit einem aut gab oder eine Kollision mit einem Boot
 // Sonst wird 1 zurückgegeben und das Spiel wird beendet
-int car_move(SDL_Renderer* renderer,struct Node *n,SDL_Rect *character,bool water){
+int car_move(SDL_Renderer* renderer,struct Node *n,SDL_Rect *character){
 
     int length;
     int height;
-    int boat = false;
+    int onBoat = false;
 
     struct LinkedList_Auto *list = n->autos;
     struct Auto *cur = list->head;
 
     bool newAuto = false;
+    enum vehicle newAutotype;
 
     if ((cur->x_pos < -(cur-> width) && n->speed < 0) || (cur->x_pos > SCREEN_WIDTH && n->speed > 0)){
         struct Auto *temp = cur;
         cur = cur->next;
         list->head = cur;
         newAuto = true;
+        newAutotype = cur->type;
         free(temp);
     }
 
     while (true){
 
         if (n->y_pos <=character->y && character->y <=n->y_pos + 100 && kollision(character,cur->x_pos,cur->width)){
-            if (!water){
+            if (cur->type == car || cur->type == train){
                 return(1);
-            }else{
-                boat = true;
+            }else if (cur -> type == boat){
+                onBoat = true;
+            }else if(cur ->type == coin){
+                playerscore += 5;
+                playerhighscore += 5;
+				paste_score (renderer);
+                cur->type = coin_gathered;
             }
         }
-
         cur->x_pos += n->speed;
-        paste_auto(renderer,cur->x_pos,n->y_pos,cur->width,cur->height,water);
+        paste_auto(renderer,cur->x_pos,n->y_pos,cur->width,cur->height,cur->type);
         if (cur->next == NULL){
             break;
         }
-        cur = cur->next;
-    }   
+        cur = cur->next;  
+    }
 
     if (newAuto){
 
@@ -128,13 +131,14 @@ int car_move(SDL_Renderer* renderer,struct Node *n,SDL_Rect *character,bool wate
             length = 200;
             height = 60;
         }
-        struct Auto *new = init_car(n->speed,length,height,cur->x_pos,cur->width);
+        struct Auto *new = init_car(n->speed,length,height,cur->x_pos,cur->width,newAutotype);
         cur->next = new;
         new->next= NULL;
     }
 
-    if (water){
-        return(!boat);
+    if (n->row_type == waterDarkSingle || n->row_type == waterBrightSingle ||
+        n->row_type == waterDarkMultiple || n->row_type == waterBrightMultiple){
+        return(!onBoat);
     }else{
         return(0);
     }
diff --git a/gameLoop.c b/gameLoop.c
index 3d02328a1ad143efaf36329e6d071f5026b6bcff..7580046a16b545cc7d230ab4cea85f2e0ad273d4 100644
--- a/gameLoop.c
+++ b/gameLoop.c
@@ -19,16 +19,19 @@ void gameLoop(SDL_Renderer* renderer, SDL_Window* window) {
     bool start_game = false;
     // Character
     SDL_Rect *character = &player;
+
+    enum vehicle theme = train; // bestimme das Map-Thema
+    
     // erzeuge verkettete Liste, welche die Karte speichert
-    struct LinkedList *list = init_map(character); 
+    struct LinkedList *list = init_map(theme,character); 
+
     Uint32 start = SDL_GetTicks();
 
-    move_map(0,list,character,renderer);
+    move_map(theme,0,list,character,renderer);
     // Menü
 
-    start_screen(character, list, renderer);
-    start_game = true;
-
+    //start_screen(theme,character, list, renderer);
+    start_game = false;
     while (run) {
         while (SDL_PollEvent(&e)) {
             switch (e.type){
@@ -41,6 +44,7 @@ void gameLoop(SDL_Renderer* renderer, SDL_Window* window) {
                         //start_screen(renderer);
                         //start_game = true; // könnte man auch später für das Menü benutzten
                       //}
+                      start_game = true;
                       jump(input, character);
                       break;
                 default: 
@@ -60,13 +64,15 @@ void gameLoop(SDL_Renderer* renderer, SDL_Window* window) {
             else{
               speed = 1;
             }
-       	    run = !move_map(speed,list,character,renderer);
+            SDL_RenderClear(renderer);
+       	    run = !move_map(theme,speed,list,character,renderer);
         }
 
         //update Character
         update_character(speed,character, renderer);
         paste_score (renderer);
-        
+
+
         SDL_RenderPresent(renderer);
         SDL_UpdateWindowSurface(window);
 
diff --git a/header.h b/header.h
index 6a60511dc5be05b5497fd5a00414e5924ea96d7a..2ce59556ef1d763469c476f47035b46a06d6b288 100644
--- a/header.h
+++ b/header.h
@@ -23,12 +23,12 @@ enum row{
     waterDarkMultiple
 };
 
-enum object_type {
-    car, boat, coin, coin_gathered
+enum vehicle{
+    car, train,boat, coin, coin_gathered
 };
 
 struct Auto{
-    int coin; // coin = 0 => Auto, coin = 1 => Münze, coin = 2 => eingesammelt
+    enum vehicle type ;
     int x_pos;
     int width;
     int height;
@@ -58,23 +58,26 @@ struct LinkedList_Auto{
 
 //Declarations of Functions
 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*);
+struct LinkedList* init_map(enum vehicle,SDL_Rect *player);
+int move_map(enum vehicle,int,struct LinkedList*,SDL_Rect*,SDL_Renderer*);
 int paste_row(SDL_Renderer*, int , enum row);
 void free_map(struct LinkedList*);
 int paste_score (SDL_Renderer*);
 //int charac_init(SDL_Renderer*);
-struct LinkedList_Auto* init_car_list( int, int,int,int);
+struct LinkedList_Auto* init_car_list( int, int,int,int,enum vehicle);
 struct Node* grass(bool,bool,int);
-int paste_auto (SDL_Renderer*, int, int, int, int,bool);
-int car_move(SDL_Renderer* ,struct Node*,SDL_Rect*,bool);
+struct Node* street(bool,int);
+struct Node* track(int);
+struct Node* water(bool,bool,int);
+int paste_auto (SDL_Renderer*, int, int, int, int,enum vehicle);
+int car_move(SDL_Renderer* ,struct Node*,SDL_Rect*);
 void free_auto(struct Node*);
 bool kollision(SDL_Rect*,int,int);
 //SDL_Rect charac_init(SDL_Renderer*);
 void jump(int, SDL_Rect*);
 void update_character(int,SDL_Rect*, SDL_Renderer*);
 void move_character(int,SDL_Rect*);
-int start_screen(SDL_Rect*, struct LinkedList*, SDL_Renderer*);
+int start_screen(enum vehicle,SDL_Rect*, struct LinkedList*, SDL_Renderer*);
 bool end_screen(int, SDL_Renderer*);
 int init(SDL_Renderer*);
 int exitGame(SDL_Renderer*, SDL_Window*);
@@ -98,3 +101,4 @@ extern SDL_Texture *img_waterDarkSingle;
 extern SDL_Texture *img_waterDarkMultiple;
 extern SDL_Texture *img_finishlineBright;
 extern SDL_Texture *img_finishlineDark;
+extern SDL_Texture *img_coin;
diff --git a/init.c b/init.c
index 1494da246ae26edca11140fe8253e20f719c79ee..fd2395878c095436a0eb0942a982d933cd0985ae 100644
--- a/init.c
+++ b/init.c
@@ -13,6 +13,7 @@ SDL_Texture *img_waterDarkSingle;
 SDL_Texture *img_waterDarkMultiple;
 SDL_Texture *img_finishlineBright;
 SDL_Texture *img_finishlineDark;
+SDL_Texture *img_coin;
 TTF_Font* font;
 
 int playerscore;
@@ -37,6 +38,7 @@ int init(SDL_Renderer* renderer) {
     img_waterDarkMultiple = IMG_LoadTexture(renderer,"images/waterDarkMultiple.jpg");
     img_finishlineBright = IMG_LoadTexture(renderer,"images/finishlineBright.jpg");
     img_finishlineDark = IMG_LoadTexture(renderer,"images/finishlineDark.jpg");
+    img_coin = IMG_LoadTexture(renderer,"images/coin.jpg");
 
     //Initiierung der Bilder
     int flags = IMG_INIT_PNG | IMG_INIT_JPG;
@@ -48,7 +50,8 @@ int init(SDL_Renderer* renderer) {
 
     if (img_grassDark == NULL || img_grassBright == NULL || img_streetSingle == NULL || img_streetMultiple == NULL || 
         img_traintrack == NULL || img_waterBrightSingle== NULL|| img_waterBrightMultiple == NULL || img_waterDarkSingle == NULL ||
-        img_waterDarkMultiple == NULL || img_finishlineBright == NULL || img_finishlineDark == NULL) {
+        img_waterDarkMultiple == NULL || img_finishlineBright == NULL || img_finishlineDark == NULL ||
+        img_coin == NULL) {
         SDL_Log("Bild konnte nicht geladen werden! SDL_image Error: %s\n",IMG_GetError());
         return(-1);
     }
@@ -71,6 +74,7 @@ int exitGame(SDL_Renderer* renderer, SDL_Window* window) {
     SDL_DestroyTexture(img_waterDarkMultiple);
     SDL_DestroyTexture(img_finishlineBright);
     SDL_DestroyTexture(img_finishlineDark);
+    SDL_DestroyTexture(img_coin);
 
     SDL_Quit();
     return 0;
diff --git a/main.c b/main.c
index 7e68ed67940d6ce1b8ce7c4cc5477f8c347a3e11..6647bfb3d50d63dc832fd435ed5475808a2f8ccc 100644
--- a/main.c
+++ b/main.c
@@ -39,10 +39,7 @@ int main(void) {
     bool quit = false;
 
     while (quit == false) {
-        // Welt
-        // Menü 
         gameLoop(renderer, window);
-        // quit = 2.Menü
         quit = end_screen(0,renderer);
 
     }
diff --git a/map.c b/map.c
index 35cd6e9c8df54d5db451d0811456e88c6defcec4..068e03f0f661560faa837c2fa048a98f3fe38acc 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(SDL_Rect* character){
+struct LinkedList* init_map(enum vehicle theme,SDL_Rect* character){
 
     struct LinkedList *list = malloc(sizeof(*list));
     
@@ -23,8 +23,17 @@ struct LinkedList* init_map(SDL_Rect* character){
 
     // erzeuge 9 weitere Knoten mit zufälligem Typ
     for(int i = 0;i<9;i++){
-
-        struct Node *m = init_row(n, character);
+        struct Node *m;
+        if (theme == coin){
+            m = init_row(n, character);
+        }else if(theme == car){
+            m = street(i==0, n->y_pos - 100);
+        }else if(theme == boat){
+            m = water(i==0,(i+1)%2, n->y_pos - 100);
+        }else if(theme == train){
+            m = track( n->y_pos - 100);
+        }
+        
         n->next = m;
         n = m;
         
@@ -39,9 +48,8 @@ struct LinkedList* init_map(SDL_Rect* character){
 // 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(enum vehicle theme,int delta_y,struct LinkedList *list,SDL_Rect *character, SDL_Renderer* renderer){
 
-    int water;
     struct Node *cur = list->head;
     bool newNode = false;
 
@@ -67,23 +75,17 @@ int move_map(int delta_y,struct LinkedList *list,SDL_Rect *character, SDL_Render
         cur->y_pos += delta_y;
         if (paste_row(renderer,cur->y_pos,cur->row_type))
             return(1);
-        water = -1;
 
-        if (cur->row_type == streetSingle || cur->row_type == streetMultiple || cur->row_type == traintrack){
-            water = 0;
-        }else if ((cur->row_type == waterBrightSingle ||cur->row_type == waterBrightMultiple ||
-                   cur->row_type == waterDarkSingle ||cur->row_type == waterDarkMultiple)){
-            water = 1;
-        }
-        if (water !=-1){
-            if (car_move(renderer,cur,character,water) && cur->y_pos <= character->y && character->y <= cur->y_pos + 100){
+        if (cur->autos != NULL){
+            if (car_move(renderer,cur,character) && cur->y_pos <= character->y 
+                && character->y <= cur->y_pos + 100){
                 return(1);
-                }
+            }
         }
 
         if (cur->next == NULL){
                     break;
-                }
+        }
 
         cur = cur->next;
     }
@@ -91,8 +93,20 @@ int move_map(int delta_y,struct LinkedList *list,SDL_Rect *character, SDL_Render
     // Füge eine neue Reihe hinzu, wenn ein Reihe gelöscht wurde
     // Das Schachbrettmuster bleibt erhalten
     if (newNode){
-
-        struct Node *n = init_row(cur, character);
+        struct Node *n;
+        if (theme == car){
+            n = street(false, cur->y_pos - 100);
+        }else if (theme == train){
+            n = track(cur->y_pos - 100);
+        }else if (theme == boat){
+            if (cur->row_type == waterDarkMultiple)
+                n = water(false,false, cur->y_pos - 100);
+            else{
+                n = water(false,true, cur->y_pos - 100);
+            }
+        }else{
+            n = init_row(cur, character);
+        }
         cur->next = n;
         n->next = NULL;
     }
@@ -109,6 +123,5 @@ void free_map(struct LinkedList *list){
         }
         free(temp);
     }
-
     free(list);
 }
\ No newline at end of file
diff --git a/menu.c b/menu.c
index 509390159d645f2b6a59e290b05c41b0a3ccea5e..caa5d1b690d55873704158b167a6890231a30329 100644
--- a/menu.c
+++ b/menu.c
@@ -6,7 +6,7 @@
 # include <SDL.h>
 # include <stdio.h>
 
-int start_screen(SDL_Rect *character, struct LinkedList *list, SDL_Renderer* renderer) {
+int start_screen(enum vehicle theme,SDL_Rect *character, struct LinkedList *list, SDL_Renderer* renderer) {
   
   // Print Title screen
   // Press Space to start
@@ -34,9 +34,9 @@ int start_screen(SDL_Rect *character, struct LinkedList *list, SDL_Renderer* ren
   
   SDL_Rect rect = {
                 .x = 0,
-                .y = 300,
-                .w = 900,
-                .h = 300 };
+                .y = 0,
+                .w = 600,
+                .h = 200 };
   
   if (SDL_RenderFillRect(renderer,&rect)!=0) {
 
@@ -60,7 +60,7 @@ int start_screen(SDL_Rect *character, struct LinkedList *list, SDL_Renderer* ren
   //SDL_RenderPresent(renderer);
 
   while (quit == false) {
-    move_map(0,list,character,renderer);
+    move_map(theme,0,list,character,renderer);
     update_character(0, character, renderer);
     if (SDL_SetRenderDrawColor(renderer,255,255,255,120) !=0) {
       SDL_Log("Farbe konnte nicht gesetzt werden! SDL_Error %s\n",SDL_GetError());
@@ -79,7 +79,7 @@ int start_screen(SDL_Rect *character, struct LinkedList *list, SDL_Renderer* ren
       case SDL_KEYDOWN:
           input = e.key.keysym.scancode;
           
-          if (input == 44) {
+          if (input) { //Spiel startet für beliebigen Input
             SDL_FreeSurface(surfaceMessage);
             SDL_DestroyTexture(Message);
             quit = true;
@@ -116,9 +116,9 @@ bool end_screen(int playerhighscore, SDL_Renderer* renderer) {
   
   SDL_Rect rect = {
                 .x = 0,
-                .y = 300,
-                .w = 900,
-                .h = 300 };
+                .y = 0,
+                .w = 400,
+                .h = 100 };
   
   if (SDL_RenderFillRect(renderer,&rect)!=0) {
 
diff --git a/output.c b/output.c
index 33828a8a9a9840571dfdf836de7ea100f5ce76b7..13cf507da31b928555bf573091cf0b7809de2364 100644
--- a/output.c
+++ b/output.c
@@ -63,31 +63,45 @@ int paste_row(SDL_Renderer* renderer, int y, enum row row_type){
     return 0;
 }
 
-int paste_auto (SDL_Renderer* renderer, int x, int y, int width, int height,bool water) {
+int paste_auto (SDL_Renderer* renderer, int x, int y, int width, int height,enum vehicle type) {
     SDL_Rect rect = {
                 .x = x,
                 .y = y + 20, // Autos und Boote werden um 20 Pixel nach unten gesetzt, um sie zu zentrieren
                 .w = width,   
                 .h = height};
-    if (water){
+    if (type == boat){
         if (SDL_SetRenderDrawColor(renderer, 75, 33, 0, 255) != 0) {
             SDL_Log("Farbe konnte nicht gesetzt werden! SDL_Error: %s\n",
             SDL_GetError());
             return -1;
         }
-    }else{
+    }else if(type == car){
         if (SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255) != 0) {
             SDL_Log("Farbe konnte nicht gesetzt werden! SDL_Error: %s\n",
             SDL_GetError());
             return -1;
         }
+    }else if(type == train){
+        if (SDL_SetRenderDrawColor(renderer, 150, 150, 150, 255) != 0) {
+            SDL_Log("Farbe konnte nicht gesetzt werden! SDL_Error: %s\n",
+            SDL_GetError());
+            return -1;
+        }
+    }else if(type == coin){
+        if (SDL_RenderCopy(renderer, img_coin, NULL, &rect) != 0) {
+            SDL_Log("Bild konnte nicht kopiert werden! SDL_Error Error: %s\n",SDL_GetError());
+            return(1);
+        }
+        return(0);
+    }else if (type == coin_gathered){
+        return(0);
     }
     if (SDL_RenderFillRect(renderer, &rect) != 0) {
         SDL_Log("Malen des Rechtecks fehlgeschlagen! SDL_Error: %s\n",
                 SDL_GetError());
         return -1;
     }
-    return 0;
+    return(0);
 }
 
 
@@ -127,7 +141,7 @@ int paste_score (SDL_Renderer* renderer) {
     char output [5];
     sprintf(output, "%d", playerhighscore);
     SDL_Surface* surfaceMessage = 
-        TTF_RenderText_Blended_Wrapped (font, output, (SDL_Color) {0, 0, 0, 255}, 600);
+        TTF_RenderText_Blended_Wrapped (font, output, (SDL_Color) {0, 0, 0, 255}, 200);
     
     if (surfaceMessage == NULL) 
         printf("Text Surface loading failed: %s\n", TTF_GetError());
diff --git a/rows.c b/rows.c
index bd4102d4d81ed72fcbd470b5fe7713d67c5f6d80..679c4024f275a440430f0e550808ee10a82fbc5f 100644
--- a/rows.c
+++ b/rows.c
@@ -45,12 +45,12 @@ struct Node* street(bool first,int y_pos){
     int width = 60;
 
     n->speed =  (((rand()%2) * 2) -1) * ((rand()%2)+1);
-    n->autos = init_car_list(n->speed,length,width,(900-n->speed) % 900);
+    n->autos = init_car_list(n->speed,length,width,(900-n->speed) % 900,car);
     return(n);
 }
 
 // Initialisiert eine Zug-Reihe
-struct Node* train(int y_pos){
+struct Node* track(int y_pos){
     struct Node *n = malloc(sizeof(*n));
     if (n==NULL){
         perror("kein Speicherplatz");
@@ -62,7 +62,7 @@ struct Node* train(int y_pos){
     int width = 60;
 
     n->speed = 7 *(((rand()%2)*2)-1);
-    n->autos = init_car_list(n->speed,length,width,(900-n->speed) % 900);
+    n->autos = init_car_list(n->speed,length,width,(900-n->speed) % 900,train);
     return(n);
 }
 
@@ -92,7 +92,7 @@ struct Node* water(bool first,bool dark,int y_pos){
     int width = 60;
 
     n->speed = 2 *(((rand()%2)*2)-1);
-    n->autos = init_car_list(n->speed,length,width,(900-n->speed)%900);
+    n->autos = init_car_list(n->speed,length,width,(900-n->speed)%900,boat);
 
     return(n);
 }
@@ -137,7 +137,7 @@ struct Node* init_row(struct Node *m, SDL_Rect *character){
             }
             
         }else if (p == 1){
-            n = train(m->y_pos - 100);
+            n = track(m->y_pos - 100);
 
         // Es wird verhindert, dass nur eine Flussreihe erzeugt wird,
         // da jedes 100. Feld durch eine goldene Grasreihe ersetzt wird
@@ -157,7 +157,7 @@ struct Node* init_row(struct Node *m, SDL_Rect *character){
     }else if (m->row_type == traintrack){
         p = rand() % 3;
         if (p == 0){
-            n = train(m->y_pos - 100);
+            n = track(m->y_pos - 100);
         }else if(p >=1){
             n = grass(true,false,m->y_pos -100);
         }