int plateau_etre_integre(const plateau_siam* plateau) { int kx=0; assert(plateau!=NULL); for(kx=0;kx<NBR_CASES;kx++) { int ky=0; for(ky=0;ky<NBR_CASES;ky++) { if(piece_etre_integre(&(plateau->piece[kx][ky]))==0) return 0; } } int nb_rocher=plateau_denombrer_type(plateau,rocher); int nb_rhino=plateau_denombrer_type(plateau,rhinoceros); int nb_elephant=plateau_denombrer_type(plateau,elephant); if(nb_rhino>=0 && nb_elephant>=0 && nb_rocher>=0 && nb_rhino<6 && nb_elephant<6 && nb_rocher<=3) return 1; else return 0; }
int plateau_modification_introduire_piece_etre_possible(const plateau_siam* plateau, int x,int y, type_piece type, orientation_deplacement orientation) { assert(plateau_etre_integre(plateau)); assert(type_etre_animal(type)); assert(orientation_etre_integre_deplacement(orientation)); // cas de l'introduction hors coin quand la piece n'est pas vide if ( (plateau_exister_piece(plateau, x, y)) && ((x==0 && y>0 && y<4 && orientation!=droite) || (x==4 && y>0 && y<4 && orientation!=gauche) || (y==0 && x>0 && x<4 && orientation!=haut) || (y==4 && x>0 && x<4 && orientation!=bas) )) { return 0; } // cas de l'introduction dans les coins quand la piece n'est pas vide et que la poussée est valide if ( (plateau_exister_piece(plateau, x, y)) && poussee_etre_valide(plateau, x, y, orientation) && ( ( x==0 && y==0 && (orientation==haut || orientation== droite) ) || ( x==4 && y==4 && (orientation==bas || orientation== gauche) ) || ( x==4 && y==0 && (orientation==haut || orientation== gauche) ) || ( x==0 && y==4 && (orientation==bas || orientation== droite) ) ) ) { return 1; } if( (coordonnees_etre_bordure_plateau(x, y)==1) && poussee_etre_valide(plateau, x, y, orientation) && plateau_denombrer_type(plateau, type)<5 ) { return 1; } else { return 0; } }
coup_jeu api_siam_tenter_introduire_nouvelle_piece_si_possible(jeu_siam* jeu, int x,int y, orientation_deplacement orientation) { assert(jeu != NULL); assert(jeu_etre_integre(jeu)); coup_jeu coup; coup_jeu_initialiser(&coup); if (!coordonnees_etre_dans_plateau(x, y)) { // Dans le cas ou les coord ne sont pas de le // plateau, coup non valide. puts("\nErreur : Coordonnees hors du plateau"); coup.valide = 0; return coup; } if (!coordonnees_etre_bordure_plateau(x, y)) { // Dans le cas ou la pièce n'est pas introduite sur le bord // du plateau, le coup n'est pas valide. puts("\nErreur : Coordonnees hors du bord du plateau"); coup.valide = 0; return coup; } if (!orientation_etre_integre_deplacement(orientation)) { // L'orientation n'est pas integre, ou est aucune_orientation // Le coup n'est donc pas valide. coup.valide = 0; return coup; } type_piece type_joueur_courant = jeu_obtenir_type_animal_courant(jeu); if (plateau_denombrer_type(&jeu->plateau, type_joueur_courant) >= NBR_ANIMAUX) { // Déjà trop d'animaux sur le plateau pour le joueur courant printf("\nErreur : nombre maxmum d'animaux atteins"); coup.valide = 0; return coup; } if (plateau_exister_piece(&jeu->plateau, x, y)) { int test = 1; // En x = 0 : if (x==0) { // Si (y = 0), 2 orient valides : droite et haut if (y == 0 && (orientation == bas || orientation == gauche)) test = 0; else if (y == NBR_CASES && (orientation == haut || orientation == gauche)) test = 0; // Si y qqconque, 1 orient valide : droite else if (orientation != droite) test = 0; } // En x = NBR_CASES : else if (x==NBR_CASES) { // Si (y = 0), 2 orient valides : droite et haut if (y == 0 && (orientation == bas || orientation == droite)) test = 0; else if (y == NBR_CASES && (orientation == haut || orientation == droite)) test = 0; // Si y qqconque, 1 orient valide : droite else if (orientation != gauche) test = 0; } if (y==0) { if (x == 0 && (orientation == bas || orientation == gauche)) test = 0; else if (x == NBR_CASES && (orientation == bas || orientation == droite)) test = 0; // Si y qqconque, 1 orient valide : droite else if (orientation != haut) test = 0; } else if (y==NBR_CASES) { if (x == 0 && (orientation == haut || orientation == gauche)) test = 0; else if (x == NBR_CASES && (orientation == haut || orientation == droite)) test = 0; // Si y qqconque, 1 orient valide : droite else if (orientation != bas) test = 0; } if (!test) { puts("\nErreur : Orientation invalide pour pousser"); coup.valide = 0; return coup; } } if (plateau_modification_introduire_piece_etre_possible(&jeu->plateau, x, y, type_joueur_courant, orientation)) { plateau_modification_introduire_piece(&jeu->plateau, x, y, type_joueur_courant, orientation); coup.valide = 1; if (plateau_denombrer_type(&jeu->plateau, rocher) < NBR_ROCHERS) { // On a un gagnant !!! condition_victoire_partie cdt_vic = victoire_determiner_gagnant(&jeu->plateau, x, y, orientation); coup.condition_victoire = cdt_vic; assert(coup_etre_integre(&coup)); assert(condition_victoire_etre_victorieux(&cdt_vic)); condition_victoire_afficher(&cdt_vic); } jeu_changer_joueur(jeu); } return coup; }
void test_plateau_denombrer_type() { puts("Test plateau_denombrer_type"); plateau_siam plateau; plateau_initialiser(&plateau); piece_siam *piece = &(plateau.piece[0][0]); piece->type=elephant; piece->orientation=haut; piece = &(plateau.piece[0][1]); piece->type=rhinoceros; piece->orientation=haut; int nombre=0; for(nombre=0;nombre<NBR_CASES*NBR_CASES;nombre++) { //Tests case_vide if(nombre==20) { if(plateau_denombrer_type(&plateau,case_vide)!=nombre) puts("valeur case_vide KO"); } else { if(plateau_denombrer_type(&plateau,case_vide)==nombre) puts("valeur case_vide KO"); } //Tests rocher if(nombre==3) { if(plateau_denombrer_type(&plateau,rocher)!=nombre) puts("valeur rocher KO"); } else { if(plateau_denombrer_type(&plateau,rocher)==nombre) puts("valeur rocher KO"); } //Tests elephant et rhinoceros if(nombre==1) { if(plateau_denombrer_type(&plateau,elephant)!=nombre) puts("valeur elephant KO"); if(plateau_denombrer_type(&plateau,rhinoceros)!=nombre) puts("valeur rhinoceros KO"); } else { if(plateau_denombrer_type(&plateau,elephant)==nombre) puts("valeur elephant KO"); if(plateau_denombrer_type(&plateau,rhinoceros)==nombre) puts("valeur rhinoceros KO"); } } }
coup_jeu api_siam_tenter_deplacer_piece_si_possible(jeu_siam* jeu, int x,int y, orientation_deplacement deplacement, orientation_deplacement orientation) { assert(jeu != NULL); assert(jeu_etre_integre(jeu)); coup_jeu coup; coup_jeu_initialiser(&coup); if (!coordonnees_etre_dans_plateau(x, y)) { // Dans le cas ou les coord ne sont pas de le // plateau, coup non valide. puts("\nErreur : Coordonnees hors du plateau"); coup.valide = 0; return coup; } if (!orientation_etre_integre_deplacement(deplacement)) { // L'orientation de déplacement n'est pas integre, ou est aucune_orientation // Le coup n'est donc pas valide. coup.valide = 0; return coup; } if (!orientation_etre_integre_deplacement(orientation)) { // L'orientation finale n'est pas integre, ou est aucune_orientation // Le coup n'est donc pas valide. coup.valide = 0; return coup; } if (!jeu_verifier_type_piece_a_modifier(jeu, x, y)) { // La piece en question est celle de l'autre joueur // Le coup n'est pas valide. puts("\nErreur : Piece non valide pour ce joueur"); coup.valide = 0; return coup; } int x_suivant = x, y_suivant = y; coordonnees_appliquer_deplacement(&x_suivant, &y_suivant, deplacement); if (plateau_exister_piece(&jeu->plateau, x_suivant, y_suivant) && deplacement != piece_recuperer_orientation_animal(plateau_obtenir_piece_info(&jeu->plateau, x, y))) { puts("\nErreur : Orientation invalide pour pousser"); coup.valide = 0; return coup; } if (plateau_modification_deplacer_piece_etre_possible(&jeu->plateau, x, y, deplacement, orientation)) { plateau_modification_deplacer_piece(&jeu->plateau, x, y, deplacement, orientation); coup.valide = 1; if (plateau_denombrer_type(&jeu->plateau, rocher) < NBR_ROCHERS) { // On a un gagnant !!! condition_victoire_partie cdt_vic = victoire_determiner_gagnant(&jeu->plateau, x_suivant, y_suivant, orientation); coup.condition_victoire = cdt_vic; assert(coup_etre_integre(&coup)); assert(condition_victoire_etre_victorieux(&cdt_vic)); condition_victoire_afficher(&cdt_vic); } jeu_changer_joueur(jeu); } assert(plateau_etre_integre(&jeu->plateau)); puts("\nERREUR INCONNUE"); return coup; }