Programmation en C

Théorie des tuiles - Deuxième partie

Tableau de caractère pour représenter la carte

Nous allons reprendre notre carte précédente, représentée par le fichier ASCII suivant :

Fichier : map.txt

aabb
abcc
aaac
bcaa

Avant de s'attaquer à l'affichage de cette Carte en utilisant la bibliothèque SDL, il nous faut au préalable organiser notre code afin que celui-ci soit manipulable sous forme d'un tableau à deux dimensions. Ce tableau contiendra les coordonnées x et y de notre terrain.

Nous allons définir un type de variable (en utilisant l'instruction typedef) qui sera un tableau à deux dimensions de 4x4 caractères, puisque notre exemple précédent comprend quatre colonnes et quatre lignes.

typedef char ArrayMap[4][4];

Nous définissons ensuite deux fonctions. Une pour lire la carte (read_map()) et une autre pour l'afficher (display_map()). La fonction read_map() prend en argument le fichier à charger (qui sera map.txt) et une variable de type ArrayMap. Les prototypes de ces deux fonctions sont définis dans map.h

Fichier : map.h
typedef char ArrayMap[4][4];

void read_map(char name_map[20], ArrayMap am);
void display_map(ArrayMap am);

Nous définissons ensuite le contenu de ces fonctions dans map.c

Fichier : map.c
#include <stdio.h>
#include <string.h>
#include "map.h"

void read_map(char name_map[20], ArrayMap am) {
	char tile;
	int x=0;
	int y=0;

	printf("Lecture de la carte\n");
	FILE *file_map;

	file_map = fopen(name_map, "r");
	while ( (tile=getc(file_map)) != EOF ) {
		if ( tile!='\n') {
			/* On place chaque caractere lu
			 * dans notre tableau et on passe a la colonne suivante (x++)
			 */
			am[x][y] = tile;
			x++;
		}  else {
			/* S'il y a un saut de ligne on passe a la ligne suivante (y++) et
			 * on re-initialise x a 0 pour se replacer en debut de colonne
			 */
			y++;
			x=0;
		}
	}

	fclose(file_map);
}

void display_map(ArrayMap am) {
	printf("Affichage de la carte\n");
	int x=0;
	int y=0;
	
	for (y=0;y<4;y++) {
		for (x=0;x<4;x++) {
			printf("%c", am[x][y]);
		}
		printf("\n");
	}
}

Dans le main, nous déclarons une variable de type ArrayMap (que nous avons définie dans map.h) et nous testons nos fonctions.

Fichier : main.c
#include "map.h"

int main() {
	ArrayMap am;
	read_map("map.txt", am);
	display_map(am);
	return 0;
}

Pour compiler l'ensemble on utilise un Makefile.

Fichier : Makefile
all: tuile

tuile: main.o map.o
	gcc -o tuile main.c map.c

main.o: main.c map.c map.h
	gcc -c main.c

map.o: map.c map.h
	gcc -c map.c

Compilation et exécution

Dans un terminal on exécute la commande suivante :

make && ./tuile

Affichage du résultat dans le terminal

On obtient alors le résultat suivant:

gcc -c main.c
gcc -c map.c
gcc -o tuile main.c map.c
Lecture de la carte
Affichage de la carte
aabb
abcc
aaac
bcaa

Téléchargement

L'ensemble des quatre fichiers (map.txt, map.c, map.h et main.c) et le Makefile sont regroupés dans l'archive ci-dessous:

j8.tar.gz