You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

165 lines
4.6 KiB

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include "gamestate.h"
#include "strategy.h"
#include "limits.h"
EPlayer g_color; // La couleur du joueur
int g_nbPlayers; // Le nombre de joueurs
Choice g_move; // Le mouvement retenu par l'algo de choix du meilleur coup
int g_step; // La progression actuelle dans l'exécution du mouvement retenu
int g_start; // La pointe de la branche de départ
int g_destination; // La pointe de la branche d'arrivée
void InitLibrary(char name[50])
{
strcpy(name, "Victorique");
srand(time(NULL));
}
void StartMatch(const unsigned int nbJoueur, const EPlayer couleur)
{
g_nbPlayers = nbJoueur;
g_color = couleur;
// Calcul des ID des trous à la pointe des branches de départ et d'arrivée
switch (g_color)
{
case color1:
g_start = getHoleIdFromCoordinates(0,-4);
g_destination = getHoleIdFromCoordinates(8,12);
break;
case color2:
g_start = getHoleIdFromCoordinates(8,0);
g_destination = getHoleIdFromCoordinates(0,8);
break;
case color3:
g_start = getHoleIdFromCoordinates(12,8);
g_destination = getHoleIdFromCoordinates(-4,0);
break;
case color4:
g_start = getHoleIdFromCoordinates(8,12);
g_destination = getHoleIdFromCoordinates(0,-4);
break;
case color5:
g_start = getHoleIdFromCoordinates(0,8);
g_destination = getHoleIdFromCoordinates(8,0);
break;
case color6:
g_start = getHoleIdFromCoordinates(-4,0);
g_destination = getHoleIdFromCoordinates(12,8);
break;
default:
fprintf(stderr, "(AI) Error: wrong color number (%d).\n", g_color);
g_start = -1;
g_destination = -1;
}
printf("(AI) Ready for a new match\n");
}
void StartGame()
{
printf("(AI) Ready for a new game\n");
g_move.move = NULL;
g_step = 0;
}
void EndGame()
{
printf("(AI) Game ended\n");
free(g_move.move);
}
void EndMatch()
{
printf("(AI) Match ended\n");
}
int NextMove(const SGameState* const gameState, int firstMove, SMove* move)
{
printf("(AI) Choosing next move...\n");
{
// Infos utiles pour le débuggage
int pieces[10] = {};
findPlayerPieces(gameState, g_color, pieces);
printf("(AI) I'm using color %d. My pieces are in holes:", g_color);
for (int i=0; i<10; i++)
printf(" %d", pieces[i]);
printf("\n");
}
if (firstMove)
{
// Affichage d'un warning si le mouvement demandé est le premier du tour, mais qu'on a pas fini d'exécuter tous les sauts du tableau
if (g_move.move != NULL)
{
fprintf(stderr, "(AI) Warning: Requested move have to be the first of this turn, but there are still moves available in the array. Flushing the array.\n");
free(g_move.move);
g_move.move = NULL;
}
// Recherche des coups possibles
Tree* piecesMoves[10];
if (findAllPiecesValidMoves(gameState, g_color, piecesMoves) == 0) // On récupère tous les mouvements possibles (si la fonction retourne 0, c'est qu'on est bloqué)
{
fprintf(stderr, "(AI) Warning: A move was requested, but pieces cannot move.\n");
for (int i=0; i<10; i++)
deleteTree(piecesMoves[i]);
return 0;
}
g_move = getBestMove(piecesMoves, gameState); // On choisit le meilleur coup selon plusieurs critères
if (g_move.score == INT_MIN) // Si le coup retenu a un score de INT_MIN (valeur spéciale correspondant à un mouvement interdit [ex : se rendre dans une branche autre que celles de départ ou d'arrivée]), c'est que tous les coups possibles sont interdits
{
fprintf(stderr, "(AI) Warning: All moves are forbidden.\n");
for (int i=0; i<10; i++)
deleteTree(piecesMoves[i]);
return 0;
}
g_step = 0; // On commence au saut 0 du mouvement retenu
for (int i=0; i<10; i++)
deleteTree(piecesMoves[i]);
}
if (g_move.move == NULL) // Si il n'y a plus de mouvement sélectionné, c'est qu'on a fini pour ce tour
return 0;
// On donne des valeurs à la variable move
move->startPos = g_move.move[g_step];
move->endPos = g_move.move[++g_step];
// Lorsqu'on arrive au dernier saut du tour, on libère la variable g_move.move
if (g_step == g_move.size - 1)
{
free(g_move.move);
g_move.move = NULL;
}
printf("(AI) Move chosen: %d\t%d\t(%d)\n", move->startPos, move->endPos, g_move.score);
return 1;
}