Browse Source

Oubli d'un « break » dans la fonction « ia_call_function »

master
Bastien 8 years ago
committed by Squiz
parent
commit
290d165caa
3 changed files with 26 additions and 17 deletions
  1. +1
    -1
      Makefile
  2. +2
    -2
      dummy.c
  3. +23
    -14
      main.c

+ 1
- 1
Makefile View File

@ -4,7 +4,7 @@ api.h : dameschinoises.h dameschinoises.patch
patch -o api.h dameschinoises.h dameschinoises.patch
main : main.o
gcc -Wall -pedantic -ldl -o main main.o
gcc -Wall -pedantic -o main main.o
main.o : main.c
gcc -c -Wall main.c


+ 2
- 2
dummy.c View File

@ -7,7 +7,7 @@ void InitLibrary(char name[50]) {
void StartGame() {
puts("stratégie start game");
}
void StartMatch(const unsigned int nbJoueur, const enum player_t couleur) {
void StartMatch(const unsigned int nbJoueur, const enum hole_t couleur) {
printf("stratégie start match (%d players, color%d)\n", nbJoueur, couleur);
}
void EndMatch() {
@ -18,5 +18,5 @@ void EndGame() {
}
int NextMove(const SGameState * const gameState, int firstMove, SMove *move) {
puts("stratégie next move");
return -1;
return 0;
}

+ 23
- 14
main.c View File

@ -74,6 +74,7 @@ enum bool ia_call_function(const struct player_t player, enum api_function_t api
a = va_arg(ap, int);
d = va_arg(ap, struct move_t*);
*((int*) result) = (*(int(*)())ia_function_pf)(c, a, d); /* berk */
break;
default:
(*ia_function_pf)();
break;
@ -170,25 +171,24 @@ enum bool valid_move(const struct move_t move, const struct move_t previous_move
/* on considère que c'est le premier saut (pas de vérification du collage) si le previous_move = (-1,-1) */
if(previous_move.start_pos == -1 && previous_move.end_pos == -1) {
if(move.start_pos == -1 && move.end_pos == -1) /* on regarde si on a -1 -1 */
if(move.start_pos == -1 && move.end_pos == -1 && last_move) /* on regarde si on a -1 -1 au premier tour */
return true;
if(move.start_pos == -1 || move.end_pos == -1) /* si on a un -1 qui n'est pas au premier coup, le coup n'est pas valide */
return false;
if(game.board[move.start_pos] != (player.branch)+1 ) /* on vérifie que la case appartient au joueur */
return false;
} else {
/* on vérifie le collage */
if(move.start_pos != previous_move.end_pos)
if(move.start_pos == -1 || move.end_pos == -1) /* si on a un -1 qui n'est pas au premier coup, le coup n'est pas valide */
return false;
if(move.start_pos != previous_move.end_pos) /* on vérifie le collage */
return false;
}
if(last_move) {
/* si c'est le dernier mouvement, on ne stationne pas sur une branche */
if(last_move) /* si c'est le dernier mouvement, on ne stationne pas sur une branche */
for(j = ((player.branch%3)+1)%6; j!=(player.branch%3) ; j=(j+(j==(player.branch%3)+2?2:1))%6 ) /* ne pas faire les branches de départ et d'arrivée */
if(search(start_position[j],10,move.end_pos))
return false;
}
/* on regarde si la case de départ appartient au joueur + collage */
if((game.board[move.start_pos] != (player.branch)+1) || move.start_pos==-1 || move.end_pos==-1)
return false; /* la case de départ ne comporte pas le pion du joueur */
/* on regarde autour */
j = 0;
do {
@ -276,6 +276,9 @@ int main(int argc, char** argv) {
fprintf(stderr,"strategy %s (%d)\n", argv[j], i);
#endif
if( (player_state[i].ia_lib_p = dlopen(argv[j], RTLD_LAZY)) == NULL ) {
#ifdef debug
fprintf(stderr,"error while loading %s : %s (%d)\n", argv[j], dlerror(), i);
#endif
/* échec du chargement, on décharge toutes les stratégies précédement chargées */
for( j=0 ; j<i ; j++ )
if( player_state[j].ia_lib_p )
@ -338,21 +341,24 @@ int main(int argc, char** argv) {
while(nb_player_end < nb_player-1) {
++i;
i%=nb_player;
#ifdef debug
fprintf(stderr, "joueur %d\n", i);
#endif
/* si le joueur peut jouer */
if(player_state[i].error < 3) {
game_state_copy = game_state;
first_move = 1;
do { /* on demande la suite de coup */
movement.start_pos=-1;
movement.end_pos=-1;
previous_movement.start_pos=-1;
previous_movement.end_pos=-1;
movement.start_pos=-1; movement.end_pos=-1;
previous_movement.start_pos=-1; previous_movement.end_pos=-1;
game_state_ia_copy = game_state_copy;
/* on suppose qu'on a une stratégie */
ia_call_function(player_state[i], ia_next_move, &next_move, &game_state_ia_copy, first_move, &movement);
/* on cherche à valider le coup */
if(valid_move(movement, previous_movement, player_state[i], game_state_copy, start_position, next_move)) {
#ifdef debug
fprintf(stderr, "mouvement (%d,%d) valide\n",movement.start_pos, movement.end_pos);
#endif
/* on effectue le mouvement */
game_state_copy.board[movement.start_pos]=none;
game_state_copy.board[movement.end_pos]=(player_state[i].branch)+1;
@ -367,6 +373,9 @@ int main(int argc, char** argv) {
}
}
} else {
#ifdef debug
fprintf(stderr, "mouvement (%d,%d) invalide\n",movement.start_pos, movement.end_pos);
#endif
if(++(player_state[i].error)==3) {
nb_player_end++;
puts("perdu");


Loading…
Cancel
Save