@@ -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}
0 commit comments