149 lines
4.8 KiB
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);
|
|
} |