Skip to content
Snippets Groups Projects
grid.c 2.61 KiB
Newer Older
#include "grid.h"
#include <stdlib.h>
#include <stdio.h>

int coordonner_vers_indice(int x, int y, struct Grid* grid)
{
	return((y * grid->column_number)+ x);
}


struct Grid * init_level(const char* file_path){
	// ouverture du fichier en mode lecture
	FILE* file = fopen(file_path, "r");
	if(!file){
		fprintf(stderr, "Error %s not found", file_path);
		exit(-1);
	}
	char line[100] = {0};
	int number_column = 0; // nombre de colonne
	int number_row = 0; /// nombre de ligne
	int number_goals = 0;
	// on lit la première ligne du fichier
	fgets(line, 100, file);
	sscanf(line, "%d %d %d", &number_column, &number_row, &number_goals);
	struct Grid * grid = new_grid(number_column, number_row);
	int current_row = 0;
	// On lit le fichier ligne par ligne jusqu'à la fin du fichier
	while(fgets(line, 100, file) != NULL){
		char* buffer = line;
		int current_column = 0;
		while(*buffer && *buffer != '\n'){
			change_cell_grid(grid, current_column, current_row, buffer);
			current_column += 1;
AIGLE STIVEN's avatar
AIGLE STIVEN committed
			buffer += 1;
		}		
		current_row += 1;
	}
	// fermeture du fichier
	fclose(file);
}

enum CaseType* initialisation_grid(int x, int y)
{
	size_t taille_grid = x * y;
	enum CaseType* new_grid = (enum CaseType*) malloc(taille_grid * sizeof(enum CaseType*));
	for(size_t i = 0; i< taille_grid; i++)
	{
		new_grid[i] = NONE;
	}
	return new_grid;
}

struct Grid* new_grid(int x, int y)
	struct Grid * new_strut_grid = (struct Grid *) malloc(sizeof(struct Grid *));
	new_strut_grid->column_number=x;
	new_strut_grid->row_number= y;
	new_strut_grid->game_grid = initialisation_grid(x, y);
	struct Player * player = malloc(sizeof(struct Player *));	
	player->x = 0;
	player->y = 0;
	new_strut_grid->position = player;

enum CaseType get_grid(struct Grid* grid, int x, int y)
{
	if (0 <=  x && x <grid->column_number && 0 <= y && y <grid->row_number )
	{
		return grid->game_grid[coordonner_vers_indice(x, y, grid)];
	}
	else{return -1;}
Arnaud Albiez's avatar
Arnaud Albiez committed

void Affichage_grid(struct Grid* grid)
{
	for(int i = 0; i<grid->column_number; i++)
	{
		for(int j = 0 ; j < grid->row_number; j++)
		switch(get_grid(grid, i, j)){
			case NONE :{
				printf(" ");
				break;
			}
			case WALL:{
				printf("#");
				break;
			}
			case PLAYER:{
				printf("@");
				break;
			}
			case GOAL:{
				printf(".");
				break;
			}
			case BOX:{
				printf("$");
				break;
			}
		}
Arnaud Albiez's avatar
Arnaud Albiez committed
	printf("\n");
	}
}

void change_cell_grid(struct Grid* grid, int x, int y, enum CaseType new_valeur)
{
	grid->game_grid[coordonner_vers_indice(x, y, grid)] = new_valeur;
}

void free_grid(struct Grid* grid)
{
	free( grid->game_grid);
	free( grid->position);