@@ -37,6 +37,16 @@ static void draw_board(SDL_Renderer *renderer)
3737 }
3838}
3939
40+ static inline GameEnvironement create_game_environment (SDL_Event * event , Chessboard * board , SDL_Renderer * renderer , GenericList * colored_squares )
41+ {
42+ GameEnvironement env ;
43+ env .event = event ;
44+ env .board = board ;
45+ env .renderer = renderer ;
46+ env .colored_squares = colored_squares ;
47+ return env ;
48+ }
49+
4050/// Renvoie l'index de la case cliquée (0 à 63), ou -1 si aucun clic gauche
4151static int get_colored_square (SDL_Event * event )
4252{
@@ -222,23 +232,23 @@ static void render_play_move(Chessboard *board, Move moves[250], int to, int nbm
222232 play_move (board , move );
223233}
224234
225- static void ui_refresh_board (SDL_Renderer * renderer , Chessboard * board , GenericList * colored_squares )
235+ static void ui_refresh_board (GameEnvironement env )
226236{
227237 char * fen = calloc (400 , 1 );
228238 if (!fen )
229239 return ;
230240
231- return_fen_code (board , fen );
241+ return_fen_code (env . board , fen );
232242
233- SDL_RenderClear (renderer );
234- draw_board (renderer );
243+ SDL_RenderClear (env . renderer );
244+ draw_board (env . renderer );
235245
236- if (colored_squares -> size != 0 )
237- swap_color_squares (colored_squares , renderer );
246+ if (env . colored_squares -> size != 0 )
247+ swap_color_squares (env . colored_squares , env . renderer );
238248
239- render_fen (renderer , fen );
249+ render_fen (env . renderer , fen );
240250
241- SDL_RenderPresent (renderer );
251+ SDL_RenderPresent (env . renderer );
242252 free (fen );
243253}
244254
@@ -262,35 +272,48 @@ static void reset_colored_squares(GenericList *colored_squares)
262272}
263273
264274// Gère les mouvements et cliks du joueur
265- static void handle_player_event (SDL_Event * event , SDL_Renderer * renderer , Chessboard * board ,
266- GenericList * colored_squares , int * clicked_square , int * nbmoves )
275+ static void handle_player_event (GameEnvironement env , int * clicked_square )
267276{
268- int square = get_colored_square (event );
269- if (invalid_event (event , square ))
277+ int square = get_colored_square (env . event );
278+ if (invalid_event (env . event , square ))
270279 return ;
271280
272281 Move list_moves [250 ];
273282
274- SDL_RenderClear (renderer );
275- draw_board (renderer );
283+ SDL_RenderClear (env . renderer );
284+ draw_board (env . renderer );
276285
277- if (colored_squares -> size == 0 )
286+ if (env . colored_squares -> size == 0 )
278287 {
279- * nbmoves = set_moves (board , list_moves , square , colored_squares );
288+ set_moves (env . board , list_moves , square , env . colored_squares );
280289 * clicked_square = square ;
281290 }
282291 else
283292 {
284- if (is_in_list (colored_squares , & square ))
293+ if (is_in_list (env . colored_squares , & square ))
285294 {
286- * nbmoves = getlegalmoves (* clicked_square , board , list_moves );
287- render_play_move (board , list_moves , square , * nbmoves );
295+ int nbmoves = getlegalmoves (* clicked_square , env . board , list_moves );
296+ render_play_move (env . board , list_moves , square , nbmoves );
288297 }
289- reset_colored_squares (colored_squares );
290- * nbmoves = 0 ;
298+ reset_colored_squares (env .colored_squares );
291299 }
292300}
293301
302+ static GameEnvironement init_game_environment (char * startpos , SDL_Renderer * renderer )
303+ {
304+ GenericList * colored_squares = malloc (sizeof (GenericList ));
305+ list_init (colored_squares , sizeof (int ));
306+
307+ Chessboard * board = malloc (sizeof (Chessboard ));
308+ init_chessboard_from_fen (board , startpos );
309+
310+ SDL_Event * event = malloc (sizeof (SDL_Event ));
311+
312+ GameEnvironement env = create_game_environment (event , board , renderer , colored_squares );
313+ return env ;
314+ }
315+
316+
294317// Libère toutes les ressources SDL + internes
295318static void cleanup_ui (SDL_Renderer * renderer , SDL_Window * window , GenericList * colored_squares , Chessboard * board )
296319{
@@ -353,72 +376,53 @@ static bool is_ai_turn(int color_ai, int color)
353376 return (color_ai == 2 || color == color_ai );
354377}
355378
356- int handle_SDL_events (SDL_Event * event ,
357- Chessboard * board ,
358- int color_ai ,
359- SDL_Renderer * renderer ,
360- GenericList * colored_squares ,
361- int * clicked_square ,
362- int * nbmoves )
379+ static bool handle_SDL_events (int color_ai , int * clicked_square , GameEnvironement env )
363380{
364- if (event -> type == SDL_QUIT )
365- return 0 ;
381+ if (env . event -> type == SDL_QUIT )
382+ return false ;
366383
367- int color = board -> white_to_play ? WHITE : BLACK ;
384+ int color = env . board -> white_to_play ? WHITE : BLACK ;
368385
369386 if (is_human_turn (color_ai , color ))
370387 {
371- handle_player_event (event , renderer , board , colored_squares , clicked_square , nbmoves );
372- ui_refresh_board (renderer , board , colored_squares );
388+ handle_player_event (env , clicked_square );
389+ ui_refresh_board (env );
373390 }
374- printf ("About to return, board->white_to_play = %d\n" , board -> white_to_play );
375- fflush (stdout );
376- return 1 ;
391+ return true;
377392}
378393
379- static void game_loop ( char * startpos , SDL_Renderer * renderer , int color_ai , SDL_Window * window )
394+ static void handle_ai_turn ( int color_ai , GameEnvironement env )
380395{
381- GenericList colored_squares ;
382- list_init (& colored_squares , sizeof (int ));
396+ int color = env .board -> white_to_play ? WHITE : BLACK ;
383397
384- Chessboard * board = malloc (sizeof (Chessboard ));
385- init_chessboard_from_fen (board , startpos );
398+ if (is_ai_turn (color_ai , color ))
399+ {
400+ Move move = get_best_move (* env .board );
401+ play_move (env .board , move );
402+ ui_refresh_board (env );
403+ SDL_Delay (50 );
404+ }
386405
387- int nbmoves = 0 , clicked_square = -1 ;
388- bool running = true;
389- SDL_Event event ;
406+ SDL_Delay (10 );
407+ }
390408
391- ui_refresh_board (renderer , board , & colored_squares );
409+ static void game_loop (char * startpos , SDL_Renderer * renderer , int color_ai , SDL_Window * window )
410+ {
411+ GameEnvironement env = init_game_environment (startpos , renderer );
412+ int clicked_square = -1 ;
413+ bool running = true;
414+ ui_refresh_board (env );
392415
393416 while (running )
394417 {
395- while (SDL_PollEvent (& event ))
418+ while (SDL_PollEvent (env . event ))
396419 {
397- if (!handle_SDL_events (& event , board , color_ai , renderer , & colored_squares , & clicked_square , & nbmoves ))
398- {
420+ if (!handle_SDL_events (color_ai , & clicked_square , env ))
399421 running = false;
400- break ;
401- }
402- printf ("Has return, board->white_to_play = %d\n" , board -> white_to_play );
403- fflush (stdout );
404- }
405-
406- if (!running )
407- break ;
408-
409- int color = board -> white_to_play ? WHITE : BLACK ;
410-
411- if (is_ai_turn (color_ai , color ))
412- {
413- Move move = get_best_move (* board );
414- play_move (board , move );
415- ui_refresh_board (renderer , board , & colored_squares );
416- SDL_Delay (50 );
417422 }
418-
419- SDL_Delay (10 );
423+ handle_ai_turn (color_ai , env );
420424 }
421- cleanup_ui (renderer , window , & colored_squares , board );
425+ cleanup_ui (renderer , window , env . colored_squares , env . board );
422426}
423427
424428// --- Boucle principale du jeu ---
0 commit comments