void plateau_modification_introduire_piece(plateau_siam* plateau, int x,int y, type_piece type, orientation_deplacement orientation) { assert(plateau_etre_integre(plateau)); assert(coordonnees_etre_bordure_plateau(x, y)); assert(type_etre_animal(type)); assert(orientation_etre_integre_deplacement(orientation)); if ((plateau_modification_introduire_piece_etre_possible(plateau, x, y, type, orientation)==1)) { if (piece_etre_case_vide(&plateau->piece[x][y])==1) { piece_siam* piece=&plateau->piece[x][y]; piece_definir(piece,type,orientation); } else { poussee_realiser(plateau, x, y, type, orientation); piece_definir(&plateau->piece[x][y],type,orientation); } } }
coup_jeu api_siam_tenter_introduire_nouvelle_piece_si_possible(jeu_siam* jeu, int x,int y, orientation_deplacement orientation) { assert(jeu_etre_integre(jeu)); coup_jeu coup; coup_jeu_initialiser(&coup); type_piece type = joueur_obtenir_animal(jeu->joueur); if(plateau_modification_introduire_piece_etre_possible(&(jeu->plateau),x,y,type,orientation)==0) return coup; const piece_siam *piece = plateau_obtenir_piece_info(&(jeu->plateau), x, y); if(piece->type != case_vide) { if(poussee_etre_valide(&(jeu->plateau), x, y, orientation, orientation) == 1) { //ici il faut vérifier la condition de victoire avant la poussée //car si jamais un rocher est au bord, il faut pouvoir le voir avant que la poussé ne soit effectuée ! coup.condition_victoire=verification_condition_victoire_valide(jeu,x,y,orientation); poussee_realiser(&(jeu->plateau), x, y, orientation, orientation, &(coup.condition_victoire)); } } plateau_modification_introduire_piece(&(jeu->plateau),x,y,type,orientation,&(coup.condition_victoire)); coup.valide=1; //on change de joueur joueur_changer(&(jeu->joueur)); return coup; }
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; }