add tests
This commit is contained in:
parent
652b718b2b
commit
afcf0f07a4
9 changed files with 91 additions and 28 deletions
|
@ -4,7 +4,7 @@
|
||||||
#include "minimax.h"
|
#include "minimax.h"
|
||||||
|
|
||||||
/* Joue le tour d'après l'algorithme alpha-beta */
|
/* Joue le tour d'après l'algorithme alpha-beta */
|
||||||
void action_joueur_alphabeta(Jeu *jeu, const int couleur);
|
void action_joueur_alphabeta(Jeu *jeu, const int couleur, const int profondeur);
|
||||||
|
|
||||||
/* Décide d'une case à jouer via l'algorithme alpha-beta */
|
/* Décide d'une case à jouer via l'algorithme alpha-beta */
|
||||||
void _action_joueur_alphabeta(Jeu *jeu, int profondeur, int couleur,
|
void _action_joueur_alphabeta(Jeu *jeu, int profondeur, int couleur,
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include "liste.h"
|
#include "liste.h"
|
||||||
|
#include "test.h"
|
||||||
|
|
||||||
typedef struct joueur Joueur;
|
typedef struct joueur Joueur;
|
||||||
|
|
||||||
|
@ -47,7 +48,7 @@ Jeu *nouvelle_partie(void);
|
||||||
|
|
||||||
/* Lance et joue une partie */
|
/* Lance et joue une partie */
|
||||||
void deroulement_partie(Jeu *jeu, const enum PLAYER_TYPE noir,
|
void deroulement_partie(Jeu *jeu, const enum PLAYER_TYPE noir,
|
||||||
const enum PLAYER_TYPE blanc);
|
const enum PLAYER_TYPE blanc, const Test_Data *test);
|
||||||
|
|
||||||
/* Coups possibles d'un joueur */
|
/* Coups possibles d'un joueur */
|
||||||
struct coups {
|
struct coups {
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
#include "joueur.h"
|
#include "joueur.h"
|
||||||
|
|
||||||
/* Joue le tour d'après l'algorithme minimax */
|
/* Joue le tour d'après l'algorithme minimax */
|
||||||
void action_joueur_minimax(Jeu *jeu, const int couleur);
|
void action_joueur_minimax(Jeu *jeu, const int couleur, const int profondeur);
|
||||||
|
|
||||||
/* Décide d'une case à jouer via l'algorithme minimax */
|
/* Décide d'une case à jouer via l'algorithme minimax */
|
||||||
void _action_joueur_minimax(Jeu *jeu, int profondeur, const int couleur,
|
void _action_joueur_minimax(Jeu *jeu, int profondeur, const int couleur,
|
||||||
|
|
|
@ -1,6 +1,20 @@
|
||||||
#ifndef OTHELLO_TEST_H
|
#ifndef OTHELLO_TEST_H
|
||||||
#define OTHELLO_TEST_H 1
|
#define OTHELLO_TEST_H 1
|
||||||
|
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
struct test_data {
|
||||||
|
int test;
|
||||||
|
int profondeur;
|
||||||
|
};
|
||||||
|
typedef struct test_data Test_Data;
|
||||||
|
|
||||||
|
/* Initialise un Test_Data */
|
||||||
|
Test_Data *nouveau_test_data(int test, int profondeur);
|
||||||
|
|
||||||
|
/* Libère un Test_Data de la mémoire */
|
||||||
|
void free_test_data(Test_Data *test_data);
|
||||||
|
|
||||||
/* Run the tests */
|
/* Run the tests */
|
||||||
void run_tests(void);
|
void run_tests(void);
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
#include "../includes/alphabeta.h"
|
#include "../includes/alphabeta.h"
|
||||||
|
|
||||||
void action_joueur_alphabeta(Jeu *jeu, const int couleur) {
|
void action_joueur_alphabeta(Jeu *jeu, const int couleur,
|
||||||
|
const int profondeur) {
|
||||||
int ligne, colonne, score = INT_MAX;
|
int ligne, colonne, score = INT_MAX;
|
||||||
_action_joueur_alphabeta(jeu, 9, couleur, couleur, &ligne, &colonne, &score,
|
_action_joueur_alphabeta(jeu, profondeur, couleur, couleur, &ligne,
|
||||||
0, VIDE);
|
&colonne, &score, 0, VIDE);
|
||||||
|
|
||||||
jeu_joueur(jeu, ligne, colonne, couleur);
|
jeu_joueur(jeu, ligne, colonne, couleur);
|
||||||
}
|
}
|
||||||
|
|
25
src/jeu.c
25
src/jeu.c
|
@ -39,17 +39,22 @@ Jeu *nouvelle_partie(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void deroulement_partie(Jeu *jeu, const enum PLAYER_TYPE type_noir,
|
void deroulement_partie(Jeu *jeu, const enum PLAYER_TYPE type_noir,
|
||||||
const enum PLAYER_TYPE type_blanc) {
|
const enum PLAYER_TYPE type_blanc,
|
||||||
|
const Test_Data *test) {
|
||||||
Joueur *tour = jeu->j1->couleur == NOIR ? jeu->j1 : jeu->j2;
|
Joueur *tour = jeu->j1->couleur == NOIR ? jeu->j1 : jeu->j2;
|
||||||
|
|
||||||
while (!partie_finie(jeu)) {
|
while (!partie_finie(jeu)) {
|
||||||
|
if (!test->test) {
|
||||||
affiche_plateau(jeu->plateau);
|
affiche_plateau(jeu->plateau);
|
||||||
|
}
|
||||||
|
|
||||||
Coups *possibilites =
|
Coups *possibilites =
|
||||||
action_possible_joueur(jeu->plateau, tour->couleur);
|
action_possible_joueur(jeu->plateau, tour->couleur);
|
||||||
if (possibilites->taille_liste > 0) {
|
if (possibilites->taille_liste > 0) {
|
||||||
// Si le joueur peut jouer
|
// Si le joueur peut jouer
|
||||||
|
if (!test->test) {
|
||||||
printf("Tour des jetons %ss !\n", tour->nom);
|
printf("Tour des jetons %ss !\n", tour->nom);
|
||||||
|
}
|
||||||
|
|
||||||
if (tour->couleur == NOIR) {
|
if (tour->couleur == NOIR) {
|
||||||
switch (type_noir) {
|
switch (type_noir) {
|
||||||
|
@ -61,10 +66,11 @@ void deroulement_partie(Jeu *jeu, const enum PLAYER_TYPE type_noir,
|
||||||
action_joueur_humain(jeu, tour->couleur);
|
action_joueur_humain(jeu, tour->couleur);
|
||||||
break;
|
break;
|
||||||
case MINIMAX:
|
case MINIMAX:
|
||||||
action_joueur_minimax(jeu, tour->couleur);
|
action_joueur_minimax(jeu, tour->couleur, test->profondeur);
|
||||||
break;
|
break;
|
||||||
case ALPHABETA:
|
case ALPHABETA:
|
||||||
action_joueur_alphabeta(jeu, tour->couleur);
|
action_joueur_alphabeta(jeu, tour->couleur,
|
||||||
|
test->profondeur);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
fprintf(stderr, "Erreur: Joueur noir non supporté.");
|
fprintf(stderr, "Erreur: Joueur noir non supporté.");
|
||||||
|
@ -81,35 +87,42 @@ void deroulement_partie(Jeu *jeu, const enum PLAYER_TYPE type_noir,
|
||||||
action_joueur_humain(jeu, tour->couleur);
|
action_joueur_humain(jeu, tour->couleur);
|
||||||
break;
|
break;
|
||||||
case MINIMAX:
|
case MINIMAX:
|
||||||
action_joueur_minimax(jeu, tour->couleur);
|
action_joueur_minimax(jeu, tour->couleur, test->profondeur);
|
||||||
break;
|
break;
|
||||||
case ALPHABETA:
|
case ALPHABETA:
|
||||||
action_joueur_alphabeta(jeu, tour->couleur);
|
action_joueur_alphabeta(jeu, tour->couleur,
|
||||||
|
test->profondeur);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
fprintf(stderr, "Erreur: Joueur blanc non supporté.");
|
fprintf(stderr, "Erreur: Joueur blanc non supporté.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
if (!test->test) {
|
||||||
printf("Pas de coup jouable.\n");
|
printf("Pas de coup jouable.\n");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
free_coups(possibilites);
|
free_coups(possibilites);
|
||||||
|
|
||||||
// On passe la main à l'autre joueur
|
// On passe la main à l'autre joueur
|
||||||
tour = jeu->j1->couleur == tour->couleur ? jeu->j2 : jeu->j1;
|
tour = jeu->j1->couleur == tour->couleur ? jeu->j2 : jeu->j1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!test->test) {
|
||||||
affiche_plateau(jeu->plateau);
|
affiche_plateau(jeu->plateau);
|
||||||
|
|
||||||
int resultat[3];
|
int resultat[3];
|
||||||
if (selection_gagnant(jeu, resultat)) {
|
if (selection_gagnant(jeu, resultat)) {
|
||||||
printf("Fin de partie ! Le joueur %s a gagné %d contre %d !\n",
|
printf("Fin de partie ! Le joueur %s a gagné %d contre %d !\n",
|
||||||
jeu->j1->couleur == resultat[0] ? jeu->j1->nom : jeu->j2->nom,
|
jeu->j1->couleur == resultat[0] ? jeu->j1->nom
|
||||||
|
: jeu->j2->nom,
|
||||||
resultat[1], resultat[2]);
|
resultat[1], resultat[2]);
|
||||||
} else {
|
} else {
|
||||||
printf("Égalité parfaite, %d contre %d !\n", jeu->j1->nb_jeton,
|
printf("Égalité parfaite, %d contre %d !\n", jeu->j1->nb_jeton,
|
||||||
jeu->j2->nb_jeton);
|
jeu->j2->nb_jeton);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Coups *action_possible_joueur(Jeton *plat[LONGEUR][LARGEUR],
|
Coups *action_possible_joueur(Jeton *plat[LONGEUR][LARGEUR],
|
||||||
const int couleur) {
|
const int couleur) {
|
||||||
|
|
|
@ -74,14 +74,16 @@ int main(int argc, char const *argv[]) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Jeu *jeu = nouvelle_partie();
|
Jeu *jeu = nouvelle_partie();
|
||||||
|
Test_Data *test = nouveau_test_data(0, 3);
|
||||||
|
|
||||||
printf("Le jeu commence avec les noirs en tant %s et les blancs en "
|
printf("Le jeu commence avec les noirs en tant %s et les blancs en "
|
||||||
"tant %s.\n",
|
"tant %s.\n",
|
||||||
joueur_type_str(noirs), joueur_type_str(blancs));
|
joueur_type_str(noirs), joueur_type_str(blancs));
|
||||||
|
|
||||||
deroulement_partie(jeu, noirs, blancs);
|
deroulement_partie(jeu, noirs, blancs, test);
|
||||||
|
|
||||||
free_jeu(jeu);
|
free_jeu(jeu);
|
||||||
|
free_test_data(test);
|
||||||
|
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
#include "../includes/minimax.h"
|
#include "../includes/minimax.h"
|
||||||
|
|
||||||
void action_joueur_minimax(Jeu *jeu, const int couleur) {
|
void action_joueur_minimax(Jeu *jeu, const int couleur, const int profondeur) {
|
||||||
int ligne, colonne, score = INT_MAX;
|
int ligne, colonne, score = INT_MAX;
|
||||||
_action_joueur_minimax(jeu, 5, couleur, couleur, &ligne, &colonne, &score);
|
_action_joueur_minimax(jeu, profondeur, couleur, couleur, &ligne, &colonne,
|
||||||
|
&score);
|
||||||
|
|
||||||
jeu_joueur(jeu, ligne, colonne, couleur);
|
jeu_joueur(jeu, ligne, colonne, couleur);
|
||||||
}
|
}
|
||||||
|
|
35
src/test.c
35
src/test.c
|
@ -1,3 +1,34 @@
|
||||||
#include "../includes/test.h"
|
#include "../includes/jeu.h"
|
||||||
|
|
||||||
void run_tests(void) {}
|
Test_Data *nouveau_test_data(int test, int profondeur) {
|
||||||
|
Test_Data *res = malloc(sizeof(Test_Data));
|
||||||
|
|
||||||
|
res->test = test;
|
||||||
|
res->profondeur = profondeur;
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
void free_test_data(Test_Data *test_data) { free(test_data); }
|
||||||
|
|
||||||
|
void run_tests(void) {
|
||||||
|
printf("Test alphabeta...\n");
|
||||||
|
Jeu *jeu = nouvelle_partie();
|
||||||
|
|
||||||
|
Test_Data *test = nouveau_test_data(1, 8);
|
||||||
|
|
||||||
|
clock_t ta, td;
|
||||||
|
|
||||||
|
td = clock();
|
||||||
|
|
||||||
|
// Lance le jeu en mode test avec 2 alpha-bêta
|
||||||
|
deroulement_partie(jeu, ALPHABETA, ALPHABETA, test);
|
||||||
|
|
||||||
|
ta = clock();
|
||||||
|
|
||||||
|
printf("Alphabêta : %ld\n", ta - td);
|
||||||
|
|
||||||
|
free_jeu(jeu);
|
||||||
|
|
||||||
|
free_test_data(test);
|
||||||
|
}
|
||||||
|
|
Reference in a new issue