Browse Source

Correction de quelques bugs et modification du dummy pour rentrer un mouvement manuellement.

master
Bastien 8 years ago
committed by Squiz
parent
commit
790e1a7538
2 changed files with 94 additions and 33 deletions
  1. +56
    -5
      dummy.c
  2. +38
    -28
      main.c

+ 56
- 5
dummy.c View File

@ -1,25 +1,76 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "api.h"
struct stockage {
char *name;
unsigned int nb_joueur;
enum hole_t color;
};
struct stockage storage(unsigned int write, char* name, unsigned int nb_joueur, enum hole_t color) {
static struct stockage stock={NULL,0};
if(write & 1)
stock.color = color;
if(write & 2)
stock.nb_joueur = nb_joueur;
if(write & 4) {
if(stock.name)
free(stock.name);
stock.name = (char*) malloc((strlen(name)+1)*sizeof(char));
if(stock.name)
strncpy(stock.name, name, strlen(name));
}
return stock;
}
void InitLibrary(char name[50]) {
printf("stratégie init %s\n", name);
struct stockage stock;
stock = storage(4,name,0,0);
printf("stratégie init %s\n", stock.name);
}
void StartGame() {
puts("stratégie start game");
}
void StartMatch(const unsigned int nbJoueur, const enum hole_t couleur) {
void StartMatch(const unsigned int nb_joueur, const enum hole_t color) {
srand(time(NULL));
printf("stratégie start match (%d players, color%d)\n", nbJoueur, couleur);
struct stockage stock;
stock = storage(3,NULL,nb_joueur, color);
printf("stratégie start match (%d players, color%d)\n", stock.nb_joueur, stock.color);
}
void EndMatch() {
puts("stratégie end match");
}
void EndGame() {
puts("stratégie end game");
}
int NextMove(const SGameState * const gameState, int firstMove, SMove *move) {
puts("stratégie next move");
return (rand()%2)?0:1;
struct stockage stock;
size_t i;
int start, end, next;
stock = storage(0, NULL, 0, 0);
printf("joueur %d, pions : [ ", stock.color);
for(i=0;i<121;i++) {
if(gameState->board[i] == stock.color)
printf("%d, ", i);
}
puts(" ]");
if(firstMove)
puts("== premier mouvement ==");
printf("mouvement (start, end, next) ?");
scanf("%d %d %d", &start, &end, &next);
move->startPos = start;
move->endPos = end;
printf("mouvement %d %d %d\n", move->startPos, move->endPos, next);
return next;
}

+ 38
- 28
main.c View File

@ -120,7 +120,7 @@ ssize_t move_calculation(const size_t index, const enum direction_t move) {
block -= 2;
offset = index - index_lines[line];
printf("line %d, offset %d, block %d\n", line, offset,block);
/* printf("line %d, offset %d, block %d\n", line, offset,block); */
switch(move) {
case left:
@ -160,7 +160,7 @@ ssize_t move_calculation(const size_t index, const enum direction_t move) {
}
enum bool search(const size_t *tab, const size_t length, const size_t value) {
size_t first, last, middle;
ssize_t first, last, middle;
first = 0;
last = length-1;
while(first <= last) {
@ -180,56 +180,64 @@ enum bool valid_move(const struct move_t move, const struct move_t previous_move
ssize_t dest, dest2;
#ifdef debug
puts("=== validation ===");
if(last_move)
puts("last_move");
if(previous_move.start_pos == -1 && previous_move.end_pos == -1)
puts("first_move");
printf("=== validation de %d → %d===\n", move.start_pos, move.end_pos);
#endif
if(move.start_pos < 0 || move.end_pos < 0 || move.start_pos > 120 || move.end_pos > 120)
return false;
/* 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 && game.board[move.start_pos] != player.branch ) /* on vérifie que la case appartient au joueur */
/* on vérifie que la case appartient au joueur */
if(game.board[move.start_pos] != player.branch )
{
printf("la case %d n'appartient pas au joueur\n",move.start_pos);
printf("%d %d\n", game.board[move.start_pos], player.branch);
return false;
}
if(previous_move.start_pos != -1 && previous_move.end_pos != -1 && move.start_pos != previous_move.end_pos) /* on vérifie le collage */
/* on vérifie que la case de destination est libre */
if(game.board[move.end_pos] != none) {
printf("la case %d de destination n'est pas libre\n", move.end_pos);
return false;
}
/* on vérifie le collage si ce n'est pas le premier mouvement */
if(previous_move.start_pos != -1 && previous_move.end_pos != -1 && move.start_pos != previous_move.end_pos) {
puts("collage not ok");
return false;
}
if(last_move) { /* si c'est le dernier mouvement, on ne stationne pas sur une branche */
for(j = (((player.branch-1)%3)+1)%6; j!=((player.branch-1)%3) ; j=(j+(j==((player.branch-1)%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))
/* si c'est le dernier mouvement, on ne stationne pas sur une branche */
if(last_move) {
puts("vérification de ne pas stationner sur une branche");
/* ne pas faire les branches de départ et d'arrivée */
for(j = (((player.branch-1)%3)+1)%6; j!=((player.branch-1)%3) ; j=(j+(j==((player.branch-1)%3)+2?2:1))%6 ) {
if(search(&(start_position[j]),10,move.end_pos))
return false;
}
}
/* on regarde autour */
puts("on regarde autour");
j = 0;
do {
if((dest = move_calculation(move.start_pos, j)) != -1) {
printf("%d → %d (j=%d) ?\n", move.start_pos, move_calculation(move.start_pos,j),j);
switch(((dest == move.end_pos)?1:0)+((game.board[dest] == none)?2:0)) {
case 0:
/* saut */
case 0: /*on veut pas y aller mais la place est occupée. peut etre qu'on veut faire le saut */
if((dest2 = move_calculation(dest,j)) != -1) {
switch(((dest2 == move.end_pos)?1:0)+((game.board[dest2] == none)?2:0)) {
case 1:
return false;
case 3:
return true;
case 1: /* on veut y aller mais la place est occupée */ return false;
case 3: /* on veut y aller et la place est libre */ return true;
}
}
break;
case 1:
return false;
case 3:
return (previous_move.start_pos == -1 && previous_move.end_pos == -1 && last_move);
case 1: /*on veut y aller mais la place est occupée*/ return false;
case 3: /*on veut y aller et la place est libre*/ return (previous_move.start_pos == -1 && previous_move.end_pos == -1);
}
}
} while(j++ < 6);
} while(++j < 6);
return false;
}
@ -321,8 +329,10 @@ int main(int argc, char** argv) {
#endif
/* ouverture de la fenêtre graphique */
puts("(GUI) Opening window");
puts("(GUI) Opening window"); // TODO à remettre à la bonne place
struct gui_resource_t gui_res = display_start(gui_res);
// Appel inutile à cause du bug dlsym sdl (il faut trouver une meilleure solution) (en plus on suppose que le joueur 0 est une tratégie)
ia_call_function(player_state[0], ia_start_game, NULL);
for( i=0 ; i < nb_player ; i++ ) {
/* on associe une branche à chaque joueur */
@ -373,10 +383,10 @@ int main(int argc, char** argv) {
fprintf(stderr, "joueur %d\n", i);
#endif
game_state_copy = game_state;
previous_movement.start_pos=-1; previous_movement.end_pos=-1;
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;
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);
@ -411,8 +421,8 @@ int main(int argc, char** argv) {
ia_call_function(player_state[i], ia_end_game, NULL);
}
next_move=0;
}
first_move=0;
}
first_move=0;
} while(next_move);
/* on sélectionne le joueur suivant */
j=i;


Loading…
Cancel
Save