#include #include #include #include #include "utils.h" #include "taquin.h" #include "graph_sup.h" /* La marge en pixel entre chaque pièce du Taquin */ #define MARGIN 1 int OffsetX, OffsetY; int ImageX, ImageY, PieceX, PieceY; int Lines, Columns; unsigned char* Taquin; char Filename[100]; void DrawPiece(int index, couleur color) { int CoordX = (index % Columns) * PieceX; int CoordY = (index / Columns) * PieceY; int ImCoordX = (Taquin[index] % Columns) * PieceX; int ImCoordY = (Taquin[index] / Columns) * PieceY; ChargerImage(Filename, CoordX + OffsetX, CoordY + OffsetY, ImCoordX, ImCoordY, PieceX, PieceY); SetColorC(color); DessinerRectangle(CoordX + OffsetX, CoordY + OffsetY, PieceX - 1, PieceY - 1); } void UpdateTaquin() { int i; couleur color = GetColor(0, 0, 0); for (i = 0; i < Lines * Columns; i++) DrawPiece(i, color); } /* Vérifie la validité des mouvements et met à jour le taquin graphiquement si l'argument should_update est égal à 1.*/ int MovePiece(int index, int should_update) { int moves[4] = { index + 1, index - 1, index + Columns, index - Columns }; int i; couleur color = GetColor(0, 0, 0); for (i = 0; i < 4; i++) { if (moves[i] >= 0 && moves[i] < Columns * Lines) { if (Taquin[moves[i]] == 0) { Taquin[moves[i]] = Taquin[index]; Taquin[index] = 0; if (should_update) { DrawPiece(moves[i], color); DrawPiece(index, color); } return 1; } } } return 0; } /* Crée le Taquin et lance les fonctions liées à la logique et au graphisme du Taquin */ void CreateTaquin(char * filename, int image_width, int image_height, int lines, int columns) { /* On externalise les valeurs données afin de pouvoir facilement les utiliser plus tard. */ int i; Lines = lines; Columns = columns; strcpy(Filename, filename); ImageX = image_width; ImageY = image_height; PieceX = ImageX / Columns; PieceY = ImageY / Lines; OffsetX = WIDTH - 50 - ImageX; OffsetY = (HEIGHT - ImageY) / 2 - 50; /* On alloue l'espace mémoire nécéssaire au Taquin et on l'initialise en premier résolu. */ Taquin = calloc(Lines * Columns, sizeof(unsigned char)); for (i = 0; i < Lines * Columns; i++) Taquin[i] = i; SetColor(0, 0, 0); RemplirRectangle(48, OffsetY - 2, ImageX + 4, ImageY + 4); RemplirRectangle(OffsetX - 1, OffsetY - 1, ImageX + 2, ImageY + 1); ChargerImage(Filename, 50, OffsetY, 0, 0, ImageX, ImageY); /*RandomizeTaquin()*/ UpdateTaquin(); /*TaquinRenderLoop()*/ /*ShowVictoryScreen()*/ }