diff --git a/auto.c b/auto.c index 33a4a28fc375296e2d91494adc3ef2816866a4b1..a1161cbf7cef4e7ce0f276185984eb2224c8ec60 100644 --- a/auto.c +++ b/auto.c @@ -2,7 +2,13 @@ #include <stdbool.h> #include "header.h" -// Es wird ein Auto/Boot mit den Parametern erzeugt und zurückgegeben +// Vorbedinung: +// 0 < speed < 10, 0 < width < 500, 0 < height < 100, +// -5000 <= pred_pos < 5000 <- Position des Vorgängerautos +// 0 <= pred_width < 500 + +// Nachbedingung: Ein struct Auto mit den Parametern wurde initialisiert + 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)); @@ -14,27 +20,27 @@ struct Auto* init_car(int speed,int width,int height,int pred_pos,int pred_width int distance; int p = rand() % 10; - if (p == 0 && t == car){ + if (p == 0 && t == car){ // Erzeuge eine Münze + b->width = 50; b->height = 50; b->type = coin; - if (pred_width == 0){ + + if (pred_width == 0){ // kein Vorgänger b->x_pos = pred_pos; + }else{ int distance = 25; - - if (speed < 0){ - b->x_pos = pred_pos + pred_width + distance; - }else{ - b->x_pos = pred_pos - b->width - distance; - } } }else{ + b->width = width; b->height = height; b->type = t; - if (pred_width == 0){ + + if (pred_width == 0){ // kein Vorgänger b->x_pos = pred_pos; + }else{ if (t == car || t == boat){ min_distance = 100 * abs(speed); @@ -44,32 +50,37 @@ struct Auto* init_car(int speed,int width,int height,int pred_pos,int pred_width min_distance = 50 * abs(speed) + 50; distance = (rand() % 500) + min_distance; } - - if (speed < 0){ - b->x_pos = pred_pos + pred_width + distance; - }else{ - b->x_pos = pred_pos - b->width - distance; - } - } } + + if (speed < 0){ + b->x_pos = pred_pos + pred_width + distance; + }else{ + b->x_pos = pred_pos - b->width - distance; + } + return(b); } -// erzeugt eine verkettete Liste an Autos -struct LinkedList_Auto* init_car_list(int speed,int length,int width,int start_pos,enum vehicle t){ +// Vorbedinung: +// 0 < speed < 10, 0 < < 500, 0 < height < 100, +// <= start_pos <= 900; + +// Nachbedingung: Initialisierte LinkedList von Autos, abhängig von den Parametern + +struct LinkedList_Auto* init_car_list(int speed,int width,int height,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,t); + struct Auto *a = init_car(speed,width,height,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,t); + struct Auto *b = init_car(speed,width,height,a->x_pos,a->width,t); a->next = b; a = b; @@ -80,11 +91,22 @@ struct LinkedList_Auto* init_car_list(int speed,int length,int width,int start_p } -// lässt die Autos auf einer Straße / Boote auf dem Wasser bewegen -// 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){ +// Vorbedingung: +// Alle Autos wurden mit init_car(...) erzeugt und entsprechen deren Spezifikation +// insbesondere n->autos != NULL +// 0 <= character->x <= 900, +// 0 <= character->y y<= 1000 + + +// Nachbedingung: +// Alle Autos wurden ensprechend ihrer Geschwindigkeit verschoben und gezeichnet +// Wenn ein Auto den Bildschirmrand verlassen hat wird dieses gelöscht +// und deren reservierter Speicher freigegeben. +// Genau dann wird ein neues Auto ans Ende der LinkedList mit init_car(...) erzeugt +// Im Falle einer ungültigen Kollision (mit einem auto oder Zug), wird 1 zurück gegeben +// Im Falle einer gültigen Kollision (mit einer Münze oder Boot), wird 0 zurück gegeben +// Wenn sich der Spieler auf einer Wasserreihe befindet, dann ist diese gültige Kollision zwingend. +int car_move(SDL_Renderer* renderer,struct Row *n,SDL_Rect *character){ int length; int height; @@ -97,6 +119,7 @@ int car_move(SDL_Renderer* renderer,struct Node *n,SDL_Rect *character){ 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; @@ -106,21 +129,27 @@ int car_move(SDL_Renderer* renderer,struct Node *n,SDL_Rect *character){ } while (true){ - if (n->y_pos <=character->y && character->y <=n->y_pos + 100 && kollision(character,cur->x_pos,cur->width)){ + if (cur->type == car || cur->type == train){ return(1); + }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,cur->type); + if (cur->next == NULL){ break; } @@ -132,9 +161,11 @@ int car_move(SDL_Renderer* renderer,struct Node *n,SDL_Rect *character){ if (n->row_type == traintrack){ length = 300; height = 60; + }else if (n->row_type == streetSingle || n->row_type == streetMultiple){ length = 150; height = 60; + }else{ length = 200; height = 60; @@ -147,16 +178,17 @@ int car_move(SDL_Renderer* renderer,struct Node *n,SDL_Rect *character){ if (n->row_type == waterDarkSingle || n->row_type == waterBrightSingle || n->row_type == waterDarkMultiple || n->row_type == waterBrightMultiple){ return(!onBoat); + }else{ return(0); } } +// Vorbedingung: n->autos != NULL + +// Nachbedingung: Der reservierte Speicher von allen Autos und der LinkedList wurde freigegeben -// Wenn eine Straße den Bildschirm verlassen hat, -// dann wird der Speicher der Autos und der verketteten Listen -// wieder freiegegeben -void free_auto(struct Node *n){ +void free_auto(struct Row *n){ struct LinkedList_Auto *list = n->autos; struct Auto *m = list->head; diff --git a/gameLoop.c b/gameLoop.c index 25ff4abb61f9a48700f6307122f504f9b541ea93..ee4dbb370ac89978f47ade71b05082e2ad906082 100644 --- a/gameLoop.c +++ b/gameLoop.c @@ -3,6 +3,11 @@ #include <stdbool.h> void gameLoop(enum vehicle theme,SDL_Renderer* renderer, SDL_Window* window) { + + int input; + SDL_Event e; + int speed; + // Anfangskoordinaten für den Spieler und dessen Größe SDL_Rect player = { .x = 420, @@ -14,10 +19,7 @@ void gameLoop(enum vehicle theme,SDL_Renderer* renderer, SDL_Window* window) { playerhighscore = 0; bool run = true; - int input; - SDL_Event e; bool start_game = false; - // Character SDL_Rect *character = &player; // erzeuge verkettete Liste, welche die Karte speichert @@ -25,26 +27,26 @@ void gameLoop(enum vehicle theme,SDL_Renderer* renderer, SDL_Window* window) { Uint32 start = SDL_GetTicks(); - move_map(theme,0,list,character,renderer); + //move_map(theme,0,list,character,renderer); // Menü //start_screen(theme,character, list, renderer); start_game = false; while (run) { + while (SDL_PollEvent(&e)) { + switch (e.type){ - case SDL_QUIT: // Fenster Schließen - run = false; - break; - case SDL_KEYDOWN: // Keystroke ? + + case SDL_QUIT:// Fenster Schließen + exit(0); + + case SDL_KEYDOWN: input = e.key.keysym.scancode; - //if (start_game != true) { - //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: break; } @@ -52,7 +54,6 @@ void gameLoop(enum vehicle theme,SDL_Renderer* renderer, SDL_Window* window) { // Wenn der Spieler weit oben ist, dann soll sich // die Kammera schneller bewegen - int speed; if (run){ if (!start_game){ speed = 0; @@ -62,11 +63,13 @@ void gameLoop(enum vehicle theme,SDL_Renderer* renderer, SDL_Window* window) { else{ speed = 1; } + SDL_RenderClear(renderer); + // Die Map wird bewegt und gezeichnet (inklusive Fahrzeuge) run = !move_map(theme,speed,list,character,renderer); } - //update Character + //Position des Spielers wird aktualisiert und gezeichnet update_character(speed,character, renderer); paste_score (renderer); diff --git a/header.h b/header.h index a017c1d3b59438661422d3a4f0d849fdba2db0f4..27ba6f856ab53f3b9e32440fc289075b62b5fc11 100644 --- a/header.h +++ b/header.h @@ -38,9 +38,9 @@ struct Auto{ //Declaration of Structs -struct Node{ +struct Row{ enum row row_type; - struct Node *next; + struct Row *next; int y_pos; int speed; struct LinkedList_Auto *autos; @@ -48,7 +48,7 @@ struct Node{ }; struct LinkedList{ - struct Node *head; + struct Row *head; }; struct LinkedList_Auto{ @@ -59,7 +59,7 @@ struct LinkedList_Auto{ //Declarations of Functions enum vehicle startscreen(SDL_Renderer*,SDL_Window*); -struct Node* init_row(struct Node*, SDL_Rect *player); +struct Row* init_row(struct Row*, SDL_Rect *player); 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); @@ -67,13 +67,13 @@ 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,enum vehicle); -struct Node* grass(bool,bool,int); -struct Node* street(bool,int); -struct Node* track(int); -struct Node* water(bool,bool,int); +struct Row* grass(bool,bool,int); +struct Row* street(bool,int); +struct Row* track(int); +struct Row* 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*); +int car_move(SDL_Renderer* ,struct Row*,SDL_Rect*); +void free_auto(struct Row*); bool kollision(SDL_Rect*,int,int); //SDL_Rect charac_init(SDL_Renderer*); void jump(int, SDL_Rect*); diff --git a/init.c b/init.c index fd2395878c095436a0eb0942a982d933cd0985ae..31af2c7289842beb7a97eee633d423dcd7b43e8a 100644 --- a/init.c +++ b/init.c @@ -45,7 +45,7 @@ int init(SDL_Renderer* renderer) { if ((IMG_Init(flags) != flags)) { SDL_Log("SDL_Image konnte nicht initialisiert werden! SDL_image Error: %s\n",IMG_GetError()); - return(-1); + return(1); } if (img_grassDark == NULL || img_grassBright == NULL || img_streetSingle == NULL || img_streetMultiple == NULL || @@ -53,10 +53,10 @@ int init(SDL_Renderer* renderer) { 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); + return(1); } - return 0; + return(0); } diff --git a/main.c b/main.c index 101c53dfbff65ecc4a6c55c29fcfaf57d56ce447..15a1bb4a8ce3fe0b1ccb99dd3ad20cd8e323d00f 100644 --- a/main.c +++ b/main.c @@ -34,19 +34,24 @@ int main(void) { return(-1); } - init(renderer); + //Initialisierung der Bilder + if (init(renderer)){ + printf("Fehler beim laden der Bilder"); + return(-1); + } + enum vehicle theme; - - bool changeMap = true; + bool change_Map = true; + while (true) { - if (changeMap){ + if (change_Map){ theme = startscreen(renderer,window); } if (theme == (-1)){ // Spiel wurde gschlossen oder es kam zu einem Fehler break; } gameLoop(theme,renderer, window); - changeMap = end_screen(0,renderer); + change_Map = end_screen(0,renderer); } diff --git a/map.c b/map.c index 068e03f0f661560faa837c2fa048a98f3fe38acc..6366aff9210b31776b47424d1c3f0724c2705a74 100644 --- a/map.c +++ b/map.c @@ -2,9 +2,16 @@ #include <stdbool.h> #include <stdlib.h> -// Rückgabe einer einfach verkettete Liste, welche 11 Elemente enthält -// Jedes Element entspricht einer Reihe -// Jedes Element enthält die Informationen über dessen Position(y_pos) und Typ(row_type) +// Vorbedingung: 0 <= character->y <= 900, 0 <= character->x <= 1000 +// Kodierung von enum vehicle: +// coin => zufällige Generierung +// car => Straßen werden generiert +// train => Gleise werden generiert +// boat => Wasser wird generiert + +// Nachbedingung: +// Rückgabe einer einfach verkettete Liste, welche 11 Reihen enthält +// Die Reihen wurden ebenfalls initialisiert // WICHTIG: Bei jeder Reihe OHNE Autos muss der Wert autos auf NULL // gesetzt werde, da es sonts zu Fehlern kommt @@ -14,16 +21,16 @@ struct LinkedList* init_map(enum vehicle theme,SDL_Rect* character){ struct LinkedList *list = malloc(sizeof(*list)); // die 2 ersten Reihen sind immer Grass - struct Node *n = grass(true,false,900); //helles Gras mit y = 900 + struct Row *n = grass(true,false,900); //helles Gras mit y = 900 list->head = n; - struct Node *m = grass(false,false,n->y_pos - 100); + struct Row *m = grass(false,false,n->y_pos - 100); n->next = m; n = m; // erzeuge 9 weitere Knoten mit zufälligem Typ for(int i = 0;i<9;i++){ - struct Node *m; + struct Row *m; if (theme == coin){ m = init_row(n, character); }else if(theme == car){ @@ -44,22 +51,35 @@ struct LinkedList* init_map(enum vehicle theme,SDL_Rect* character){ } -// Funktion nimmt die LinkedList und verschiebt alle Reihen um delta_y Pixel nach unten -// 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 +// Vorbedingung: +// delta_y mit 0 <= delta_y <= 10, +// 0 <= character->x <= 900, +// 0 <= character->y y<= 1000 +// LinkedList enthält 11 Elemente + +// Kodierung von enum vehicle: +// coin => zufällige Reihe wird, wenn ein Reihe gelöscht wurde +// car => eine Straße wird generiert, wenn ein Reihe gelöscht wurde +// train => ein Gleis wird generiert, wenn ein Reihe gelöscht wurde +// boat => ein Wasser wird generiert, wenn ein Reihe gelöscht wurde +// +// Nachbedingung: +// Der Wert y_pos jeder Reihe wird um z erhöht +// Eine Reihe wurde gelöscht, wenn y_pos >= 1000 +// + neue Reihe mit Typ theme wurde an das Ende der Linked Ende hinzugefügt int move_map(enum vehicle theme,int delta_y,struct LinkedList *list,SDL_Rect *character, SDL_Renderer* renderer){ - struct Node *cur = list->head; - bool newNode = false; + struct Row *cur = list->head; + bool newRow = false; - // Wenn eine reihe den Bildschirm verlässt, dann wird sie gelöscht - if (cur->y_pos >=999){ + // Lösche Reihe + if (cur->y_pos >=1000){ list->head = cur->next; - struct Node *temp = cur; + struct Row *temp = cur; cur = cur->next; - newNode = true; + newRow = true; // mögliche Autos auf der Reihe werden auch gelöscht // und deren Speicher freigegeben @@ -92,8 +112,8 @@ int move_map(enum vehicle theme,int delta_y,struct LinkedList *list,SDL_Rect *ch // Füge eine neue Reihe hinzu, wenn ein Reihe gelöscht wurde // Das Schachbrettmuster bleibt erhalten - if (newNode){ - struct Node *n; + if (newRow){ + struct Row *n; if (theme == car){ n = street(false, cur->y_pos - 100); }else if (theme == train){ @@ -113,10 +133,14 @@ int move_map(enum vehicle theme,int delta_y,struct LinkedList *list,SDL_Rect *ch return(0); } +// Vorbedingung: / + +// Nachbedingung: Der reservierte Speicher der gesamten LinkedList/Map wurde freigegeben + void free_map(struct LinkedList *list){ - struct Node *cur = list->head; + struct Row *cur = list->head; while (cur != NULL){ - struct Node *temp = cur; + struct Row *temp = cur; cur = cur->next; if (temp->autos != NULL){ free_auto(temp); diff --git a/menu.c b/menu.c index caa5d1b690d55873704158b167a6890231a30329..975cde57daf7b1ab58eea8fff1139b343a995787 100644 --- a/menu.c +++ b/menu.c @@ -126,7 +126,7 @@ bool end_screen(int playerhighscore, SDL_Renderer* renderer) { return(-1); } - SDL_Surface* surfaceMessage = TTF_RenderText_Blended_Wrapped (font, "Nochmal?", (SDL_Color) {0, 0, 0, 255}, 200); + SDL_Surface* surfaceMessage = TTF_RenderText_Blended_Wrapped (font, "Nochmal? (y)/(n)", (SDL_Color) {0, 0, 0, 255}, 200); if (surfaceMessage == NULL) printf("Text Surface loading failed: %s\n", TTF_GetError()); @@ -148,8 +148,7 @@ bool end_screen(int playerhighscore, SDL_Renderer* renderer) { while (SDL_PollEvent(&e)) { switch (e.type) { case SDL_QUIT: - quit = true; - break; + exit(0); case SDL_KEYDOWN: input = e.key.keysym.scancode; diff --git a/menu2.c b/menu2.c index 02b41bfbdda6f2a278cd5eed0aa056cf625f7e20..a2d82c8a88f948963ca49c8d2875efe5009f4bb5 100644 --- a/menu2.c +++ b/menu2.c @@ -5,6 +5,11 @@ #include <SDL_ttf.h> #include <stdio.h> + + +// Die Funktion zeigt die möglichen Reihen des Spiels +// Wenn man auf eine Reihe klickt, dann wir das Spiel mit einer bestimmten +// Konfiguration gestartet enum vehicle startscreen(SDL_Renderer* renderer,SDL_Window *window){ if (TTF_Init() == -1) { @@ -38,6 +43,7 @@ enum vehicle startscreen(SDL_Renderer* renderer,SDL_Window *window){ SDL_Event event; while (1){ + paste_row(renderer, 900, waterBrightMultiple); paste_row(renderer, 800, waterDarkMultiple); paste_row(renderer,700,traintrack); @@ -46,29 +52,36 @@ enum vehicle startscreen(SDL_Renderer* renderer,SDL_Window *window){ paste_row(renderer,400, streetMultiple); paste_row(renderer,300, grassBright); paste_row(renderer,200, grassDark); + while (SDL_PollEvent(&event)) { + switch (event.type) { + case SDL_QUIT: return(-1); + case SDL_MOUSEBUTTONDOWN: if (200<=event.button.y && event.button.y<=400){ SDL_FreeSurface(surfaceMessage); SDL_DestroyTexture(Message); return(coin); + }else if(400<=event.button.y && event.button.y<=600){ SDL_FreeSurface(surfaceMessage); SDL_DestroyTexture(Message); return(car); + }else if(600<=event.button.y && event.button.y<=800){ SDL_FreeSurface(surfaceMessage); SDL_DestroyTexture(Message); return(train); - } else if(800<=event.button.y && event.button.y<=1000){ + + }else if(800<=event.button.y && event.button.y<=1000){ SDL_FreeSurface(surfaceMessage); SDL_DestroyTexture(Message); return(boat); } - } + } } if (SDL_SetRenderDrawColor(renderer,0,0,0,0) !=0) { SDL_Log("Farbe konnte nicht gesetzt werden! SDL_Error %s\n",SDL_GetError()); diff --git a/rows.c b/rows.c index b9445871a53c4c631da44c70f3325cdee2ced87d..35a20a50122a9825161dea8968e101cb071ac1cc 100644 --- a/rows.c +++ b/rows.c @@ -2,9 +2,11 @@ #include <stdlib.h> #include <stdbool.h> -// Initialisiert eine Gras-Reihe -struct Node* grass(bool dark,bool gold,int y_pos){ - struct Node *n = malloc(sizeof(*n)); +//Vorbedingung: -100<=y_pos<=1000 + +//Nachbedinung: eine Gras-Reihe wurde Initialisiert +struct Row* grass(bool dark,bool gold,int y_pos){ + struct Row *n = malloc(sizeof(*n)); if (n==NULL){ perror("kein Speicherplatz"); } @@ -27,9 +29,11 @@ struct Node* grass(bool dark,bool gold,int y_pos){ return(n); } -// Initialisiert eine Straßen-Reihe -struct Node* street(bool first,int y_pos){ - struct Node *n = malloc(sizeof(*n)); +//Vorbedingung: -100<=y_pos<=1000 + +//Nachbedinung: eine Straßen-Reihe wurde Initialisiert +struct Row* street(bool first,int y_pos){ + struct Row *n = malloc(sizeof(*n)); if (n==NULL){ perror("kein Speicherplatz"); } @@ -41,34 +45,37 @@ struct Node* street(bool first,int y_pos){ } n->y_pos = y_pos; - int length = 150; - int width = 60; + int width = 150; + int height = 60; n->speed = (((rand()%2) * 2) -1) * ((rand()%2)+1); - n->autos = init_car_list(n->speed,length,width,(900-n->speed) % 900,car); + n->autos = init_car_list(n->speed,width,height,(900-n->speed) % 900,car); return(n); } +//Vorbedingung: -100<=y_pos<=1000 -// Initialisiert eine Zug-Reihe -struct Node* track(int y_pos){ - struct Node *n = malloc(sizeof(*n)); +//Nachbedinung: Initialisiert eine Zug-Reihe +struct Row* track(int y_pos){ + struct Row *n = malloc(sizeof(*n)); if (n==NULL){ perror("kein Speicherplatz"); } n->y_pos = y_pos; n->row_type = traintrack; - int length = 300; - int width = 60; + int width = 300; + int height = 60; n->speed = 6 *(((rand()%2)*2)-1); - n->autos = init_car_list(n->speed,length,width,(900-n->speed) % 900,train); + n->autos = init_car_list(n->speed,width,height,(900-n->speed) % 900,train); return(n); } -// Initialisiert eine Fluss-Reihe -struct Node* water(bool first,bool dark,int y_pos){ - struct Node *n = malloc(sizeof(*n)); +// Vorbedingung: -100<=y_pos<=1000 + +// Nachbedingung: Initialisiert eine Fluss-Reihe +struct Row* water(bool first,bool dark,int y_pos){ + struct Row *n = malloc(sizeof(*n)); if (n==NULL){ perror("kein Speicherplatz"); } @@ -88,22 +95,24 @@ struct Node* water(bool first,bool dark,int y_pos){ } n->y_pos = y_pos; - int length = 200; - int width = 60; + int width = 200; + int length = 60; n->speed = 2 *(((rand()%2)*2)-1); - n->autos = init_car_list(n->speed,length,width,(900-n->speed)%900,boat); + n->autos = init_car_list(n->speed,width,length,(900-n->speed)%900,boat); return(n); } +// Vorbedingung: 0 <= character->x <= 900, +// 0 <= character->y y<= 1000 +// Nachbedingung: Initalisert alle Werte für eine neu erzeugte Reihe -// 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, SDL_Rect *character){ - struct Node *n; +struct Row* init_row(struct Row *m, SDL_Rect *character){ + struct Row *n; int p; // Ziellinie erscheint alle 100 Punkte