Labyrinth/bakcup/src/labyrith.c

149 lines
4.8 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "../include/labyrinth.h"
void find_path_r(Labyrinth* labyrinth, int i, int j);
Labyrinth* newLabyrinth(int n, int m){
if(n<1 || m<1 || (n==1 && m==1)){
printf("COGLIONE\n");
exit(EXIT_FAILURE);
}
Labyrinth* labyrinth = (Labyrinth* )malloc(sizeof(Labyrinth));
labyrinth->x_size = n;
labyrinth->y_size = m;
labyrinth->at = (Node** )malloc(n*sizeof(Node* ));
for(int i=0; i<m; i++)
labyrinth->at[i] = (Node *)malloc(m*sizeof(Node));
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
labyrinth->at[i][j].dp = -1;
labyrinth->at[i][j].east = 0;
labyrinth->at[i][j].south = 0;
labyrinth->at[i][j].visited = 0;
}
}
labyrinth->x_size = n;
labyrinth->y_size = m;
labyrinth->start.x = rand()%n;
labyrinth->start.y = rand()%m;
do{
labyrinth->end.x = rand()%n;
labyrinth->end.y = rand()%m;
}while(labyrinth->start.x == labyrinth->end.x && labyrinth->start.y == labyrinth->end.y);
return labyrinth;
}
void resetLabyrinth(Labyrinth* labyrinth){
for(int i=0; i<labyrinth->x_size; i++){
for(int j=0; j<labyrinth->y_size; j++){
labyrinth->at[i][j].color = WHITE;
labyrinth->at[i][j].visited = 0;
labyrinth->at[i][j].dp = -1;
}
}
labyrinth->at[labyrinth->start.x][labyrinth->start.y].color = BLUE;
labyrinth->at[labyrinth->end.x][labyrinth->end.y].color = BLUE;
}
void removeLabyrinth(Labyrinth* labyrinth){
for(int i=0; i<labyrinth->x_size; i++)
free(labyrinth->at[i]);
free(labyrinth->at);
free(labyrinth);
}
void find_path(Labyrinth* labyrinth){
find_path_r(labyrinth, labyrinth->end.x, labyrinth->end.y);
}
void find_path_r(Labyrinth* labyrinth, int i, int j){
labyrinth->at[i][j].color = BLUE;
// printLab(labyrinth);
if(i==labyrinth->start.x && j==labyrinth->start.y)
return;
if(labyrinth->at[i][j].direction == UP)
find_path_r(labyrinth, i+1, j);
else if(labyrinth->at[i][j].direction == RIGHT)
find_path_r(labyrinth, i, j-1);
else if(labyrinth->at[i][j].direction == DOWN)
find_path_r(labyrinth, i-1, j);
else if(labyrinth->at[i][j].direction == LEFT)
find_path_r(labyrinth, i, j+1);
else{
printf("ERROR IN FIND_PATH\n");
exit(EXIT_FAILURE);
}
}
void printLab(Labyrinth* labyrinth){
printLabWith(labyrinth, '|', '-', '+');
}
void printLabWith(Labyrinth* labyrinth, char wall, char floor, char corner){
int i, j;
system("clear");
for(j=0; j<labyrinth->y_size; j++){
printf("%c%c", corner, floor);
}
printf("%c\n", corner);
for(i=0; i<labyrinth->x_size; i++){
printf("%c", wall);
for(j=0; j<labyrinth->y_size; j++){
if(labyrinth->at[i][j].color == BLUE)
printf("\033[104m \033[49m");
else if(labyrinth->at[i][j].color == GREEN)
printf("\033[102m \033[49m");
else if(labyrinth->at[i][j].color == ORANGE)
printf("\033[103m \033[49m");
else
printf(" ");
if(labyrinth->at[i][j].east && j<labyrinth->y_size-1){
if(labyrinth->at[i][j+1].color == BLUE && labyrinth->at[i][j].color == BLUE)
printf("\033[104m \033[49m");
else if((labyrinth->at[i][j+1].color == GREEN || labyrinth->at[i][j+1].color == BLUE) && (labyrinth->at[i][j].color == GREEN || labyrinth->at[i][j].color == BLUE))
printf("\033[102m \033[49m");
else if(!(labyrinth->at[i][j+1].color == WHITE) && !(labyrinth->at[i][j].color == WHITE))
printf("\033[103m \033[49m");
else
printf(" ");
}else
printf("%c", wall);
}
printf("\n");
for(j=0; j<labyrinth->y_size; j++){
printf("%c", corner);
if(labyrinth->at[i][j].south && i<labyrinth->x_size-1){
if(labyrinth->at[i][j].color == BLUE && labyrinth->at[i+1][j].color == BLUE)
printf("\033[104m \033[49m");
else if((labyrinth->at[i][j].color == GREEN || labyrinth->at[i][j].color == BLUE) && (labyrinth->at[i+1][j].color == GREEN || labyrinth->at[i+1][j].color == BLUE))
printf("\033[102m \033[49m");
else if(!(labyrinth->at[i][j].color == WHITE) && !(labyrinth->at[i+1][j].color == WHITE))
printf("\033[103m \033[49m");
else
printf(" ");
}else
printf("%c", floor);
}
printf("%c\n", corner);
}
printf("\n");
usleep(50000);
}