diff --git a/auto.c b/auto.c
index 21290036148affdbc76159cd02c798312cfc9c90..236f746604116a3ea39656e1319750b02ba8fb36 100644
--- a/auto.c
+++ b/auto.c
@@ -1,78 +1,163 @@
 #include "hDateien/auto.h"
 
-
 // Vorbedinung: 
 //      0 < |speed| < 10, 0 < width < 500, 0 < height < 100, 
 //      -5000 <= pred_pos < 5000 <- Position des Vorgängerautos
 //      0 <= pred_width < 500 
 
-// Nachbedingung: Ein Auto wurde aus den Parametern initialisiert
+// Nachbedingung: Ein Fahrzeug wurde aus den Parametern initialisiert
 
-struct Car* init_car(int speed,int width,int height,int pred_pos,int pred_width,enum vehicle t){
+struct Car* init_race_car(int speed,int pred_pos,int pred_width){
     struct Car *b = malloc(sizeof(*b));
 
     if (b == NULL){
         perror("kein Speicherplatz");
     }
 
-
     int min_distance;
     int distance;
-    int p = rand() % 10;
-    
-    if (p == 0 && t == car){ // Erzeuge eine Münze
 
-        b->width = 50;
-        b->height = 50;
-        b->type = coin;
+    b->width = 150;
+    b->height = 60;
+    b->type = race_car;
 
-        if (pred_width == 0){ // kein Vorgänger
-            b->x_pos = pred_pos;
+    if (pred_width == 0){ // kein Vorgänger
+        b->x_pos = pred_pos;
 
+    }else{
+        min_distance = 40 * abs(speed) + 50;
+        distance = (rand() % 400) + min_distance;
+
+        if (speed < 0){
+            b->x_pos = pred_pos + pred_width + distance;
         }else{
-            distance = 25;
+            b->x_pos = pred_pos - b->width - distance;
         }
+    }
+
+    return(b);
+}
+
+struct Car* init_train(int speed,int pred_pos,int pred_width){
+    struct Car *b = malloc(sizeof(*b));
+
+    if (b == NULL){
+        perror("kein Speicherplatz");
+    }
+
+    int min_distance;
+    int distance;
+
+    b->width = 350;
+    b->height = 60;
+    b->type = train;
+
+    if (pred_width == 0){ // kein Vorgänger
+        b->x_pos = pred_pos;
+
+    }else{
+        min_distance = 40 * abs(speed) + 50;
+        distance = (rand() % 400) + min_distance;
+
         if (speed < 0){
             b->x_pos = pred_pos + pred_width + distance;
         }else{
             b->x_pos = pred_pos - b->width - distance;
         }
-    
+    }
+    return(b);
+}
+
+struct Car* init_boat(int speed,int pred_pos,int pred_width){
+    struct Car *b = malloc(sizeof(*b));
+
+    if (b == NULL){
+        perror("kein Speicherplatz");
+    }
+
+    int min_distance;
+    int distance;
+
+    b->width = 200;
+    b->height = 60;
+    b->type = boat;
+
+    if (pred_width == 0){ // kein Vorgänger
+        b->x_pos = pred_pos;
+
     }else{
+        min_distance = 50 * abs(speed);
+        distance = (rand() % 300) + min_distance;
 
-        b->width = width;
-        b->height = height;
-        if (t == coin || t == coin_gathered){
-            b->type = car;
+        if (speed < 0){
+            b->x_pos = pred_pos + pred_width + distance;
         }else{
-            b->type = t;
+            b->x_pos = pred_pos - b->width - distance;
         }
-        if (pred_width == 0){ // kein Vorgänger
-            b->x_pos = pred_pos;
+    }
+    return(b);
 
-        }else{
-            
-            if (t == car || t == boat){
-                min_distance = 50 * abs(speed);
-                distance = (rand() % 300) + min_distance;
-            }
+}
 
-            else if (t == (train)){
-                min_distance = 40 * abs(speed) + 50;
-                distance = (rand() % 400) + min_distance;
-            }else if (t == race_car){
-                min_distance = 20 * abs(speed) + 100;
-                distance = (rand() % 300) + min_distance;
-            }
+struct Car* init_coin(int speed,int pred_pos,int pred_width){
+    struct Car *b = malloc(sizeof(*b));
 
-            if (speed < 0){
-                b->x_pos = pred_pos + pred_width + distance;
-            }else{
-                b->x_pos = pred_pos - b->width - distance;
-            }
+    if (b == NULL){
+        perror("kein Speicherplatz");
+    }
+
+    int distance;
+
+    b->width = 50;
+    b->height = 50;
+    b->type = coin;
+
+    if (pred_width == 0){ // kein Vorgänger
+        b->x_pos = pred_pos;
+
+    }else{
+        distance = 25;
+    }
+    if (speed < 0){
+        b->x_pos = pred_pos + pred_width + distance;
+    }else{
+        b->x_pos = pred_pos - b->width - distance;
+    }
+
+    return(b);
+}
+
+struct Car* init_car(int speed,int pred_pos,int pred_width){
+    struct Car *b = malloc(sizeof(*b));
+
+    if (b == NULL){
+        perror("kein Speicherplatz");
+    }
+
+
+    int min_distance;
+    int distance;
+
+    b->width = 150;
+    b->height = 60;
+    b->type = car;
+
+    if (pred_width == 0){ // kein Vorgänger
+        b->x_pos = pred_pos;
+
+    }else{
+        
+        min_distance = 50 * abs(speed);
+        distance = (rand() % 300) + min_distance;
+
+        if (speed < 0){
+            b->x_pos = pred_pos + pred_width + distance;
+        }else{
+            b->x_pos = pred_pos - b->width - distance;
         }
     }
 
+
     return(b);
 }
 
@@ -82,19 +167,48 @@ struct Car* init_car(int speed,int width,int height,int pred_pos,int pred_width,
 
 // Nachbedingung: Initialisierte LinkedList von Autos, abhängig von den Parametern
 
-struct LinkedList_car* init_car_list(int speed,int width,int height,int start_pos,enum vehicle t){
+struct LinkedList_car* init_car_list(int speed,int start_pos,enum vehicle t){
     struct LinkedList_car *car_list = malloc(sizeof(*car_list));
 
     if (car_list == NULL){
             perror("kein Speicherplatz");
         }
 
-    struct Car *a = init_car(speed,width,height,start_pos,0,t);
-    car_list->head = a;
+    struct Car *a;
+    int p;
+
+    if (t == car){
+        a = init_car(speed,start_pos,0);
+        car_list->head = a;
+    }else if(t == train){
+        a = init_train(speed,start_pos,0);
+        car_list->head = a;
+    }else if(t == boat){
+        a = init_boat(speed,start_pos,0);
+        car_list->head = a;
+    }else if(t == race_car){
+        a = init_race_car(speed,start_pos,0);
+        car_list->head = a;
+    }
 
     for(int i = 0;i<5;i++){
     
-        struct Car *b = init_car(speed,width,height,a->x_pos,a->width,t);
+        struct Car *b;
+
+        if (t == car){
+            p = rand() % 10;
+            if (p == 0){
+                b = init_coin(speed,a->x_pos,a->width);
+            }else{
+                b = init_car(speed,a->x_pos,a->width);
+            }
+        }else if(t == train){
+            b = init_train(speed,a->x_pos,a->width);
+        }else if(t == boat){
+            b = init_boat(speed,a->x_pos,a->width);
+        }else if(t == race_car){
+            b = init_race_car(speed,a->x_pos,a->width);
+        }
 
         a->next = b;
         a = b;
@@ -122,15 +236,12 @@ struct LinkedList_car* init_car_list(int speed,int width,int height,int start_po
 //      Wenn sich der Spieler auf einer Wasserreihe befindet, dann ist diese gültige Kollision zwingend. 
 int move_car(SDL_Renderer* renderer,struct Row *n){
 
-    int length;
-    int height;
     int onBoat = false;
 
     struct LinkedList_car *car_list = n->cars;
     struct Car *cur = car_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)){
         
@@ -138,7 +249,6 @@ int move_car(SDL_Renderer* renderer,struct Row *n){
         cur = cur->next;
         car_list->head = cur;
         newAuto = true;
-        newAutotype = cur->type;
         free(temp);
     }
 
@@ -170,28 +280,26 @@ int move_car(SDL_Renderer* renderer,struct Row *n){
         cur = cur->next;  
     }
 
+    struct Car *new;
+    int p;
+
     if (newAuto){
 
         if (n->row_type == traintrack){
-            length = 300;
-            height = 60;
+            new = init_train(n->speed,cur->x_pos,cur->width);
 
         }else if (n->row_type == streetSingle || n->row_type == streetMultiple){
-            if (newAutotype == coin || newAutotype == coin_gathered){
-                cur->x_pos = cur->x_pos - n->speed*100;
-                newAutotype = car;
+            p = rand() % 10;
+            if (p == 0){
+                new = init_coin(n->speed,cur->x_pos,cur->width);
+            }else{
+                new = init_car(n->speed,cur->x_pos,cur->width);
             }
-            length = 150;
-            height = 60;
-
         }else if (n->row_type == raceStreet){
-            length = 150;
-            height = 60;
+            new = init_race_car(n->speed,cur->x_pos,cur->width);
         }else{
-            length = 200;
-            height = 60;
+            new = init_boat(n->speed,cur->x_pos,cur->width);
         }
-        struct Car *new = init_car(n->speed,length,height,cur->x_pos,cur->width,newAutotype);
         cur->next = new;
         new->next= NULL;
     }
diff --git a/hDateien/auto.h b/hDateien/auto.h
index 8327cbfc3efe82798cab1d9f2b1f3a0ad6955ea3..84cb9e1872ca37aff4a9e5efc03455686b2fd76e 100644
--- a/hDateien/auto.h
+++ b/hDateien/auto.h
@@ -9,8 +9,14 @@
 #include "header.h"
 
 //Declarations of functions
-struct LinkedList_car* init_car_list( int, int,int,int,enum vehicle);
-struct Car* init_car(int,int,int,int,int,enum vehicle);
+
+struct Car* init_race_car(int,int,int );
+struct Car* init_train(int,int,int );
+struct Car* init_coin(int,int,int );
+struct Car* init_boat(int,int,int );
+struct Car* init_car(int,int,int );
+
+struct LinkedList_car* init_car_list( int, int,enum vehicle);
 
 int move_car(SDL_Renderer* ,struct Row*);
 
diff --git a/hDateien/init.h b/hDateien/init.h
index 204e90a03449658fbe0ead10adb3eb510a79b814..709518da7b4030bed9fdda50b71bf0ac3e2561f9 100644
--- a/hDateien/init.h
+++ b/hDateien/init.h
@@ -38,5 +38,7 @@ extern SDL_Texture *img_duck;
 extern SDL_Texture *img_3D_Duck;
 extern SDL_Texture *img_stone;
 extern SDL_Texture *img_race_street;
+extern SDL_Texture *img_race_carL;
+extern SDL_Texture *img_race_carR;
 
 #endif
\ No newline at end of file
diff --git a/images/race_carL.png b/images/race_carL.png
new file mode 100644
index 0000000000000000000000000000000000000000..9d50972caf754b74a93c62cbce142b6e0ce08754
Binary files /dev/null and b/images/race_carL.png differ
diff --git a/images/race_carR.png b/images/race_carR.png
new file mode 100644
index 0000000000000000000000000000000000000000..2feeb58c3a775dcd760c6bb34c65f7a8c387be08
Binary files /dev/null and b/images/race_carR.png differ
diff --git a/init.c b/init.c
index 5a416f128b0774ef5b6692143adcf6dda75f8f6e..9b79a4f43e5c3060ccfa8262c9a006b9203fecd4 100644
--- a/init.c
+++ b/init.c
@@ -23,6 +23,8 @@ SDL_Texture *img_duck;
 SDL_Texture *img_3D_Duck;
 SDL_Texture *img_stone;
 SDL_Texture *img_race_street;
+SDL_Texture *img_race_carL;
+SDL_Texture *img_race_carR;
 TTF_Font* font;
 
 SDL_Window* init_window(){
@@ -93,6 +95,8 @@ int init_images(SDL_Renderer* renderer) {
     img_3D_Duck = IMG_LoadTexture(renderer,"images/3D_Duck.png");
     img_stone = IMG_LoadTexture(renderer,"images/stone.png");
     img_race_street = IMG_LoadTexture(renderer,"images/race_street.jpg");
+    img_race_carL = IMG_LoadTexture(renderer,"images/race_carL.png");
+    img_race_carR = IMG_LoadTexture(renderer,"images/race_carR.png");
 
      //Initiierung der Bilder
     int flags = IMG_INIT_PNG | IMG_INIT_JPG;
@@ -142,6 +146,8 @@ int exitGame(SDL_Renderer* renderer, SDL_Window* window) {
     SDL_DestroyTexture(img_3D_Duck);
     SDL_DestroyTexture(img_stone);
     SDL_DestroyTexture(img_race_street);
+    SDL_DestroyTexture(img_race_carL);
+    SDL_DestroyTexture(img_race_carR);
     TTF_CloseFont(font);
 
     SDL_Quit();
diff --git a/output.c b/output.c
index 04c584f490bbac9bb3fd244353fc7d77aebcc159..41fe92540f6b36954114dd467a2c0e8d9827d2af 100644
--- a/output.c
+++ b/output.c
@@ -85,6 +85,10 @@ int paste_row(SDL_Renderer* renderer, int y, enum row row_type){
 int paste_car(SDL_Renderer* renderer, int x, int y, int width, int height,int speed,enum vehicle type) {
     //Prevents cars from being displayed at the wrong position 
     int offset = 20;
+
+    if (type == race_car){
+        offset = 20;
+    }
     
     if (type == coin){
         offset = 25;
@@ -104,7 +108,7 @@ int paste_car(SDL_Renderer* renderer, int x, int y, int width, int height,int sp
                 return(1);
             }
             return(0);
-    }else if(type == car || type == race_car){
+    }else if(type == car){
         if (speed > 0) {
             if (SDL_RenderCopy(renderer, img_car_trans, NULL, &rect) != 0) {
                 SDL_Log("Bild konnte nicht kopiert werden! SDL_Error Error: %s\n",SDL_GetError());
@@ -118,6 +122,22 @@ int paste_car(SDL_Renderer* renderer, int x, int y, int width, int height,int sp
             } 
             return(0);
         }
+
+    }else if(type == race_car){
+
+        if (speed > 0){
+            if (SDL_RenderCopy(renderer, img_race_carR, NULL, &rect) != 0) {
+                SDL_Log("Bild konnte nicht kopiert werden! SDL_Error Error: %s\n",SDL_GetError());
+                return(1);
+            }
+        }else{
+            if (SDL_RenderCopy(renderer, img_race_carL, NULL, &rect) != 0) {
+                SDL_Log("Bild konnte nicht kopiert werden! SDL_Error Error: %s\n",SDL_GetError());
+                return(1);
+            }
+        }
+        return(0);
+    
     }else if(type == train){
         if (speed > 0){
             if (SDL_RenderCopy(renderer, img_trainR, NULL, &rect) != 0) {
diff --git a/rows.c b/rows.c
index c8e4c07b983d8479d16a19c6f9a7e3f81a9e5c29..11b7d323e81186ab0b99df0baeb16fec318936d7 100644
--- a/rows.c
+++ b/rows.c
@@ -13,11 +13,9 @@ struct Row *race(int y_pos){
 
     n->row_type = raceStreet;
     n->y_pos = y_pos;
-    int width = 150;
-    int height = 60;
 
     n->speed =  (((rand()%2) * 2) -1) * 16;
-    n->cars = init_car_list(n->speed,width,height,(900-n->speed) % 900,race_car);
+    n->cars = init_car_list(n->speed,(900-n->speed) % 900,race_car);
     n->stone = -1;
 
     return(n);
@@ -69,11 +67,9 @@ struct Row* street(bool first,int y_pos){
     }
 
     n->y_pos = y_pos;
-    int width = 150;
-    int height = 60;
 
     n->speed =  (((rand()%2) * 2) -1) * ((rand()%3)+2);
-    n->cars = init_car_list(n->speed,width,height,(900-n->speed) % 900,car);
+    n->cars = init_car_list(n->speed,(900-n->speed) % 900,car);
     n->stone = -1;
     return(n);
 }
@@ -88,11 +84,9 @@ struct Row* track(int y_pos){
 
     n->y_pos = y_pos;
     n->row_type = traintrack;
-    int width = 350;
-    int height = 60;
 
     n->speed = 7 *(((rand()%2)*2)-1);
-    n->cars = init_car_list(n->speed,width,height,(SCREEN_WIDTH-n->speed) % SCREEN_WIDTH,train);
+    n->cars = init_car_list(n->speed,(SCREEN_WIDTH-n->speed) % SCREEN_WIDTH,train);
     n->stone = -1;
     return(n);
 }
@@ -121,11 +115,9 @@ struct Row* water(bool first,bool dark,int y_pos){
     }
 
     n->y_pos = y_pos;
-    int width = 200;
-    int length = 60;
 
     n->speed = 2 *(((rand()%2)*2)-1);
-    n->cars = init_car_list(n->speed,width,length,(SCREEN_WIDTH-n->speed)%SCREEN_WIDTH,boat);
+    n->cars = init_car_list(n->speed,(SCREEN_WIDTH-n->speed)%SCREEN_WIDTH,boat);
     n->stone = -1;
 
     return(n);