Skip to content

Commit 8da3fe7

Browse files
committed
refactoring du fichier rendering
1 parent 81edd2f commit 8da3fe7

3 files changed

Lines changed: 91 additions & 112 deletions

File tree

src/ai/ai.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ SearchResult search_best_move_alpha_beta(Chessboard *board, int depth)
142142

143143
Move get_best_move(Chessboard board)
144144
{
145-
SearchResult best_move = search_best_move_alpha_beta(&board, 4);
145+
SearchResult best_move = search_best_move_alpha_beta(&board, 5);
146146
return best_move.best_move;
147147
}
148148

src/ui/rendering.c

Lines changed: 88 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -91,13 +91,13 @@ void draw_colored_square(SDL_Renderer *renderer, int square, SDL_Color color)
9191
SDL_RenderFillRect(renderer, &rect);
9292
}
9393

94-
void swap_color_squares(GenericList *list_squares, int colored, SDL_Renderer *renderer)
94+
void swap_color_squares(GenericList *list_squares, SDL_Renderer *renderer)
9595
{
9696
for (int i = 0; i < list_squares->size; i++)
9797
{
9898
int square = ((int *)list_squares->data)[i];
9999
int beige = (square / 8 + square % 8) % 2 == 0 ? 1 : 0;
100-
draw_colored_square(renderer, square, swap_square_color(beige, colored));
100+
draw_colored_square(renderer, square, swap_square_color(beige, 0));
101101
}
102102
}
103103

@@ -177,7 +177,7 @@ void render_fen(SDL_Renderer *renderer, const char *fen)
177177
}
178178
}
179179

180-
int set_moves(Chessboard *board, Move moves[250], int pos_piece, GenericList *colored_squares, SDL_Renderer *renderer)
180+
int set_moves(Chessboard *board, Move moves[250], int pos_piece, GenericList *colored_squares)
181181
{
182182
int nbmoves = getlegalmoves(pos_piece, board, moves);
183183
if (nbmoves == 0)
@@ -189,7 +189,6 @@ int set_moves(Chessboard *board, Move moves[250], int pos_piece, GenericList *co
189189
if (!is_in_list(colored_squares, &to)) // Pour les coups de promotion
190190
list_add(colored_squares, &to);
191191
}
192-
swap_color_squares(colored_squares, 0, renderer);
193192
return nbmoves;
194193
}
195194

@@ -204,41 +203,61 @@ void render_play_move(Chessboard *board, Move moves[250], int to, int nbmoves)
204203
play_move(board, move);
205204
}
206205

207-
// Rafraîchit l’affichage du plateau après un coup
208-
static void ui_refresh_board(SDL_Renderer *renderer, Chessboard *board, char *fen)
206+
static void ui_refresh_board(SDL_Renderer *renderer, Chessboard *board, GenericList *colored_squares)
209207
{
208+
char *fen = calloc(250, 1);
209+
if (!fen)
210+
return;
211+
210212
return_fen_code(board, fen);
213+
211214
SDL_RenderClear(renderer);
212215
draw_board(renderer);
216+
217+
if (colored_squares->size != 0)
218+
swap_color_squares(colored_squares, renderer);
219+
213220
render_fen(renderer, fen);
221+
214222
SDL_RenderPresent(renderer);
223+
free(fen);
215224
}
216225

217-
// retourne true si un coup a été réellement joué (board modifié)
218-
static bool handle_player_event(SDL_Event *event, SDL_Renderer *renderer, Chessboard *board,
219-
GenericList *colored_squares, int *clicked_square, int *nbmoves, char *fen)
226+
// Vérifie qu'il s'agisse bien d'un click sur une case valide
227+
static bool invalid_event(SDL_Event *event, int square)
220228
{
221-
// Ne traiter que les vrais clics (évite MOUSEMOTION qui pollue la queue)
222229
if (event->type != SDL_MOUSEBUTTONDOWN && event->type != SDL_MOUSEBUTTONUP)
223-
return false;
230+
return true;
224231

225-
int square = get_colored_square(event);
226232
if (square == -1)
227-
return false;
233+
return true;
228234

229-
printf("[DEBUG] humain: avant coup, board.white_to_play=%d\n", board->white_to_play);
230-
print_chessboard(board);
231-
fflush(stdout);
235+
return false;
236+
}
237+
238+
// Réinitialiser les cases colorées
239+
void reset_colored_squares(GenericList *colored_squares)
240+
{
241+
list_free(colored_squares);
242+
list_init(colored_squares, sizeof(int));
243+
}
244+
245+
// Gère les mouvements et cliks du joueur
246+
static void handle_player_event(SDL_Event *event, SDL_Renderer *renderer, Chessboard *board,
247+
GenericList *colored_squares, int *clicked_square, int *nbmoves)
248+
{
249+
int square = get_colored_square(event);
250+
if (invalid_event(event, square))
251+
return;
232252

233253
Move list_moves[250];
254+
234255
SDL_RenderClear(renderer);
235256
draw_board(renderer);
236257

237-
bool played = false;
238-
239258
if (colored_squares->size == 0)
240259
{
241-
*nbmoves = set_moves(board, list_moves, square, colored_squares, renderer);
260+
*nbmoves = set_moves(board, list_moves, square, colored_squares);
242261
*clicked_square = square;
243262
}
244263
else
@@ -247,118 +266,89 @@ static bool handle_player_event(SDL_Event *event, SDL_Renderer *renderer, Chessb
247266
{
248267
*nbmoves = getlegalmoves(*clicked_square, board, list_moves);
249268
render_play_move(board, list_moves, square, *nbmoves);
250-
played = true;
251269
}
252-
253-
swap_color_squares(colored_squares, 1, renderer);
254-
list_free(colored_squares);
255-
list_init(colored_squares, sizeof(int));
270+
reset_colored_squares(colored_squares);
256271
*nbmoves = 0;
257272
}
258-
259-
return_fen_code(board, fen);
260-
render_fen(renderer, fen);
261-
262-
if (played)
263-
{
264-
printf("[DEBUG] humain: après coup, board.white_to_play=%d\n", board->white_to_play);
265-
fflush(stdout);
266-
}
267-
268-
return played;
269273
}
270274

271-
static void cleanup_ui(SDL_Renderer *renderer, SDL_Window *window, GenericList *colored_squares, char *fen)
275+
// Libère toutes les ressources SDL + internes
276+
static void cleanup_ui(SDL_Renderer *renderer, SDL_Window *window, GenericList *colored_squares)
272277
{
273278
if (colored_squares)
274279
list_free(colored_squares);
275280

276-
if (fen)
277-
free(fen);
278-
279281
for (int i = 0; i < 12; i++)
280-
{
281282
if (piece_textures[i])
282-
{
283-
SDL_DestroyTexture(piece_textures[i]);
284-
piece_textures[i] = NULL;
285-
}
286-
}
283+
SDL_DestroyTexture(piece_textures[i]), piece_textures[i] = NULL;
287284

288285
IMG_Quit();
289-
290286
if (renderer)
291287
SDL_DestroyRenderer(renderer);
292288
if (window)
293289
SDL_DestroyWindow(window);
294290
SDL_Quit();
295291
}
296292

297-
int ui_game_loop(char *startpos, int color_ai)
293+
// Raccourci pour initialiser la fenêtre et le renderer SDL
294+
static bool init_sdl(SDL_Window **window, SDL_Renderer **renderer)
298295
{
299-
// --- Initialisation SDL ---
300296
if (SDL_Init(SDL_INIT_VIDEO) != 0)
301297
{
302298
SDL_Log("Erreur SDL_Init: %s", SDL_GetError());
303-
return 1;
299+
return false;
304300
}
305301

306-
SDL_Window *window = SDL_CreateWindow(
307-
"Échiquier",
308-
SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
309-
WINDOW_WIDTH, WINDOW_HEIGHT,
310-
SDL_WINDOW_SHOWN);
311-
312-
if (!window)
302+
*window = SDL_CreateWindow("Échiquier",
303+
SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
304+
WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_SHOWN);
305+
if (!*window)
313306
{
314307
SDL_Log("Erreur SDL_CreateWindow: %s", SDL_GetError());
315308
SDL_Quit();
316-
return 1;
309+
return false;
317310
}
318311

319-
SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
320-
if (!renderer)
312+
*renderer = SDL_CreateRenderer(*window, -1, SDL_RENDERER_ACCELERATED);
313+
if (!*renderer)
321314
{
322315
SDL_Log("Erreur SDL_CreateRenderer: %s", SDL_GetError());
323-
SDL_DestroyWindow(window);
316+
SDL_DestroyWindow(*window);
324317
SDL_Quit();
325-
return 1;
318+
return false;
326319
}
327320

328-
// --- Initialisation des ressources ---
321+
return true;
322+
}
323+
324+
// --- Boucle principale du jeu ---
325+
int ui_game_loop(char *startpos, int color_ai)
326+
{
327+
SDL_Window *window = NULL;
328+
SDL_Renderer *renderer = NULL;
329+
if (!init_sdl(&window, &renderer))
330+
return 1;
331+
329332
load_textures(renderer);
330333

331334
GenericList colored_squares;
332335
list_init(&colored_squares, sizeof(int));
333336

334-
char *fen = calloc(250, 1); // zero initialisé
335-
if (!fen)
336-
{
337-
SDL_Log("malloc fen failed");
338-
cleanup_ui(renderer, window, &colored_squares, NULL);
339-
return 1;
340-
}
341-
342337
Chessboard *board = malloc(sizeof(Chessboard));
343338
init_chessboard_from_fen(board, startpos);
344-
initialise_ai(0); //Fonction à corriger
339+
initialise_ai(0); // TODO: à corriger selon la logique IA
345340

346-
int nbmoves = 0;
347-
int clicked_square = -1;
341+
int nbmoves = 0, clicked_square = -1;
348342
bool running = true;
349343
SDL_Event event;
350344

351-
// --- Rendu initial ---
352-
draw_board(renderer);
353-
return_fen_code(board, fen);
354-
render_fen(renderer, fen);
355-
SDL_RenderPresent(renderer);
345+
// Rendu initial
346+
ui_refresh_board(renderer, board, &colored_squares);
356347

357-
// --- Boucle principale ---
348+
// --- Boucle de jeu ---
358349
while (running)
359350
{
360-
bool move_made = false;
361-
351+
// --- Gestion des événements SDL ---
362352
while (SDL_PollEvent(&event))
363353
{
364354
if (event.type == SDL_QUIT)
@@ -369,43 +359,30 @@ int ui_game_loop(char *startpos, int color_ai)
369359

370360
int color = board->white_to_play ? WHITE : BLACK;
371361

372-
if (color_ai == -1) // joueur vs joueur
373-
{
374-
if (handle_player_event(&event, renderer, board, &colored_squares, &clicked_square, &nbmoves, fen))
375-
move_made = true;
376-
}
377-
else // humain vs IA ou IA vs IA
362+
// --- Si c’est un mode avec humain ---
363+
if (color_ai == -1 || (color != color_ai && color_ai != 2))
378364
{
379-
if (color != color_ai)
380-
{
381-
if (handle_player_event(&event, renderer, board, &colored_squares, &clicked_square, &nbmoves, fen))
382-
move_made = true;
383-
}
365+
handle_player_event(&event, renderer, board, &colored_squares, &clicked_square, &nbmoves);
366+
ui_refresh_board(renderer, board, &colored_squares);
384367
}
385368
}
386-
int color_now = board->white_to_play ? WHITE : BLACK;
387369

388-
if (!move_made)
370+
if (!running)
371+
break;
372+
373+
// --- Gestion IA (en dehors du bloc d’événements pour IA vs IA) ---
374+
int color = board->white_to_play ? WHITE : BLACK;
375+
376+
if (color_ai == 2 || color == color_ai)
389377
{
390-
if (color_ai == 2) // IA vs IA : chaque itération, 1 coup pour la couleur à jouer
391-
{
392-
Move move = get_best_move(*board);
393-
play_move(board, move);
394-
ui_refresh_board(renderer, board, fen);
395-
SDL_Delay(200); // petite pause pour lisibilité
396-
}
397-
else if (color_now == color_ai) // Humain vs IA : si c'est au tour de l'IA
398-
{
399-
Move move = get_best_move(*board);
400-
play_move(board, move);
401-
ui_refresh_board(renderer, board, fen);
402-
}
378+
Move move = get_best_move(*board);
379+
play_move(board, move);
380+
ui_refresh_board(renderer, board, &colored_squares);
381+
SDL_Delay(50); // pause pour voir les coups IA
403382
}
404383

405-
SDL_RenderPresent(renderer);
384+
SDL_Delay(10);
406385
}
407-
408-
// --- Nettoyage ---
409-
cleanup_ui(renderer, window, &colored_squares, fen);
386+
cleanup_ui(renderer, window, &colored_squares);
410387
return 0;
411388
}

src/ui/rendering.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,5 @@ enum
1919
void draw_board(SDL_Renderer *renderer);
2020

2121
int ui_game_loop(char *startpos, int color_ai);
22+
23+
static void reset_colored_squares(GenericList *colored_squares);

0 commit comments

Comments
 (0)