Skip to content
Snippets Groups Projects
Commit 77f67d66 authored by Janos's avatar Janos
Browse files

Münzen wurden hinzugefügt und es gibt unterschiedliche Karten

(zum Beispiel nur Wasser oder nur Züge)
parent 06bde8e0
No related branches found
No related tags found
No related merge requests found
......@@ -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,37 +76,43 @@ 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;
}
......@@ -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);
}
......
......@@ -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);
......
......@@ -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;
......@@ -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;
......
......@@ -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);
}
......
......@@ -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;
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);
}
struct Node *m = init_row(n, character);
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,16 +75,10 @@ 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);
}
}
......@@ -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
......@@ -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) {
......
......@@ -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());
......
......@@ -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);
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment