From c8125f21336bfab7f38b6f7599c405a2ca7f77b0 Mon Sep 17 00:00:00 2001 From: "remi.greub" <remi.greub@hes-so.ch> Date: Sat, 29 Mar 2025 22:47:08 +0100 Subject: [PATCH] =?UTF-8?q?algos=20des=20bots=20(non=20test=C3=A9s=20pour?= =?UTF-8?q?=20l'instant)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- puissance4_GRB/puissance4.c | 196 ++++++++++++++++++++++++++++++++++++ puissance4_GRB/puissance4.h | 4 + 2 files changed, 200 insertions(+) diff --git a/puissance4_GRB/puissance4.c b/puissance4_GRB/puissance4.c index be901de..6354c87 100644 --- a/puissance4_GRB/puissance4.c +++ b/puissance4_GRB/puissance4.c @@ -184,6 +184,202 @@ int Launch_puissance4(){ return winner;//boucle sa mere... jusqu'à ce que la grille soit pleine, ou que un winner a été détecté } +int Launch_puissance4_randBot(int seed){ + symbol_t winner=EMPTY; + int chiffre=0; + srand(seed); + + while(winner==EMPTY){ + //print_grille(); + //print_gameCells(); + print_game(); + printf("Column number? (starts at 1):\n"); + //printf("au tour de %d de jouer\n", game.curr_player); + //printf("balance un chiffre entre 1 et %d\n", game.width); + if(game.curr_player == 1){ + chiffre = rand()%game.width; + }else{ + do{ + scanf("%d",&chiffre); + chiffre-=1; //gestion des chiffres de 1 à n et non de 0 à n-1 + if(chiffre >= game.width || chiffre < 0){ + printf("HEP HEPHEP !! donne un chiffre dans la plage donnee manche a couille\n"); + } + }while((chiffre >= game.width) || (chiffre < 0) || is_cell_free(chiffre, 0, game.players[game.curr_player].symbol)<0); + } + game.gamePlayed -= 1; //peut être le mettre plus bas non ? + int i = 0; + //verifier que put free cell fonctionne + if((i = put_free_cell(chiffre, game.players[game.curr_player].symbol))<0){ + //la grille est pleine genre... ou y a un bug de zinzin + if(Is_Grid_full()){ + //la grille est pleine sa mere la pute + //print egalite mais y a probablement eu un bug + printf("y a un egalite mais probablement un bug aussi mdr\n"); + //fin du jeu + return EQUAL; //jeu egal ou retourner un bug ... a voir.. + }else{ + //il y a un bug de zinzin + printf("ok la y a un bug de zinzin check ca \n"); + //print la grille pour debug + //print_gameCells(); + print_game(); + //fin du jeu + return -1; //erreur + } + } + //check de la win + winner = Find_winner(game.cells, game.cells[chiffre][i]); + if( winner != EMPTY){ + if(winner==CROSS){ + //reset du jeu + mise a jour des scores (scores optionels) + //print_gameCells(); + print_game(); + //printf("la croix a gagnée cette connasse\n"); + printf("Player one won!\n"); + //print joueur croix a gagné + //fin du jeu + return CROSS; + } + if(winner==CIRCLE){ + //reset du jeu + mise a jour des scores (scores optionels) + //print joueur cercle a gagné + //print_gameCells(); + print_game(); + //printf("le cercle a gagné cet enorme zgeg\n"); + printf("Player two won!\n"); + //fin du jeu + return CIRCLE; + } + }else{ + //sois le jeu est plein, sois y a juste pas encore de winner + if(Is_Grid_full()){ + //la grille est pleine + //print egalite + la fin de la grille + print_game(); + //printf("y a un egalite dans les regles de l'art mash'allah\n"); + printf("It is a draw.\n"); + //fin du jeu + return EQUAL; + } + //y a juste pas encore de winner ducoup... + game.curr_player ^= 1; //switch de joueur + //printf("au tour de %d de jouer\n", game.curr_player); + } + } + return winner;//boucle sa mere... jusqu'à ce que la grille soit pleine, ou que un winner a été détecté +} + +int Launch_puissance4_smartBot(int seed){ + symbol_t winner=EMPTY; + int chiffre=0; + srand(seed); + + while(winner==EMPTY){ + //print_grille(); + //print_gameCells(); + print_game(); + printf("Column number? (starts at 1):\n"); + //printf("au tour de %d de jouer\n", game.curr_player); + //printf("balance un chiffre entre 1 et %d\n", game.width); + if(game.curr_player == 1){ + chiffre = SmartBot(); + }else{ + do{ + scanf("%d",&chiffre); + chiffre-=1; //gestion des chiffres de 1 à n et non de 0 à n-1 + if(chiffre >= game.width || chiffre < 0){ + printf("HEP HEPHEP !! donne un chiffre dans la plage donnee manche a couille\n"); + } + }while((chiffre >= game.width) || (chiffre < 0) || is_cell_free(chiffre, 0, game.players[game.curr_player].symbol)<0); + } + game.gamePlayed -= 1; //peut être le mettre plus bas non ? + int i = 0; + //verifier que put free cell fonctionne + if((i = put_free_cell(chiffre, game.players[game.curr_player].symbol))<0){ + //la grille est pleine genre... ou y a un bug de zinzin + if(Is_Grid_full()){ + //la grille est pleine sa mere la pute + //print egalite mais y a probablement eu un bug + printf("y a un egalite mais probablement un bug aussi mdr\n"); + //fin du jeu + return EQUAL; //jeu egal ou retourner un bug ... a voir.. + }else{ + //il y a un bug de zinzin + printf("ok la y a un bug de zinzin check ca \n"); + //print la grille pour debug + //print_gameCells(); + print_game(); + //fin du jeu + return -1; //erreur + } + } + //check de la win + winner = Find_winner(game.cells, game.cells[chiffre][i]); + if( winner != EMPTY){ + if(winner==CROSS){ + //reset du jeu + mise a jour des scores (scores optionels) + //print_gameCells(); + print_game(); + //printf("la croix a gagnée cette connasse\n"); + printf("Player one won!\n"); + //print joueur croix a gagné + //fin du jeu + return CROSS; + } + if(winner==CIRCLE){ + //reset du jeu + mise a jour des scores (scores optionels) + //print joueur cercle a gagné + //print_gameCells(); + print_game(); + //printf("le cercle a gagné cet enorme zgeg\n"); + printf("Player two won!\n"); + //fin du jeu + return CIRCLE; + } + }else{ + //sois le jeu est plein, sois y a juste pas encore de winner + if(Is_Grid_full()){ + //la grille est pleine + //print egalite + la fin de la grille + print_game(); + //printf("y a un egalite dans les regles de l'art mash'allah\n"); + printf("It is a draw.\n"); + //fin du jeu + return EQUAL; + } + //y a juste pas encore de winner ducoup... + game.curr_player ^= 1; //switch de joueur + //printf("au tour de %d de jouer\n", game.curr_player); + } + } + return winner;//boucle sa mere... jusqu'à ce que la grille soit pleine, ou que un winner a été détecté +} + +int SmartBot(){ + int pos=0; + for(int chfr=0; chfr<game.width; chfr++){ + //verifie que le coup est jouable + if((pos = put_free_cell(chfr, game.players[game.curr_player].symbol))>=0){ + struct cell *tempCell = &game.cells[chfr][pos]; + if (Find_winner(game.cells, game.cells[chfr][pos]) == game.players[game.curr_player].symbol){ + //1er cas : a trouvé le bon coup à jouer pour gagner + tempCell->symbol = EMPTY; + return chfr; + } + //tente de chercher si l'autre joueur a un coup gagnant + tempCell->symbol = game.players[game.curr_player^1].symbol; + if (Find_winner(game.cells, game.cells[chfr][pos]) == game.players[game.curr_player^1].symbol){ + //2e cas : joue le coup gagnant de l'autre joueur pour le bloquer + tempCell->symbol = EMPTY; + return chfr; + } + } + } + //3e cas : joue un coup au hasard + return rand()%game.width; +} + bool Is_Grid_full(){ return game.gamePlayed == 0; } diff --git a/puissance4_GRB/puissance4.h b/puissance4_GRB/puissance4.h index dac6e3c..6ceb1a6 100644 --- a/puissance4_GRB/puissance4.h +++ b/puissance4_GRB/puissance4.h @@ -48,6 +48,10 @@ int kill_game(); int put_free_cell(int j_p, symbol_t symbol); int is_cell_free(int j_p, int i, symbol_t symbol); int Launch_puissance4(); +int Launch_puissance4_randBot(int seed); +int Launch_puissance4_smartBot(int seed); + +int SmartBot(); bool Is_Grid_full(); void print_game(); -- GitLab