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; }
coup_jeu api_siam_tenter_deplacer_piece_si_possible(jeu_siam* jeu, int x,int y, orientation_deplacement deplacement, orientation_deplacement orientation) { assert(jeu_etre_integre(jeu)); coup_jeu coup; coup_jeu_initialiser(&coup); if(plateau_modification_deplacer_piece_etre_possible(&(jeu->plateau),x,y, deplacement, orientation)==0) { puts(" deplacement impossible"); return coup; } const piece_siam *piece = plateau_obtenir_piece_info(&(jeu->plateau), x, y); // On vérifie que la pièce au coordonnées indiquées appartienne bien au joueur actuel. if(piece->type==rocher || piece->type==case_vide) { puts(" Vous ne pouvez pas bouger cette pièce (rocher ou case vide) !"); return coup; } if(joueur_etre_type_animal(jeu->joueur,piece->type)==0 ) { puts(" La piece choisie n'est pas la votre !"); return coup; } //on copie les valeurs de x et y pour regarder ensuite à la case après deplacement, pour voir si la poussee //est réalisable int x_deplacement = x, y_deplacement=y; coordonnees_appliquer_deplacement(&x_deplacement, &y_deplacement, deplacement); //si la piece est au bord et qu'on veut l'enlever (deplacement hors plateau), //on l'enleve directement et on fini le tour if(coordonnees_etre_dans_plateau(x_deplacement,y_deplacement) != 1) { plateau_modification_deplacer_piece(&(jeu->plateau), x, y , deplacement, orientation, &(coup.condition_victoire)); coup.valide=1; joueur_changer(&(jeu->joueur)); return coup; } piece = plateau_obtenir_piece_info(&(jeu->plateau), x_deplacement, y_deplacement); if(piece->type != case_vide) { if(poussee_etre_valide(&(jeu->plateau), x_deplacement, y_deplacement, deplacement, orientation) == 1) { coup.condition_victoire=verification_condition_victoire_valide(jeu,x,y,orientation); poussee_realiser(&(jeu->plateau), x_deplacement, y_deplacement, deplacement, orientation, &(coup.condition_victoire)); } else { puts(" La poussee n'est pas valide"); return coup; } } plateau_modification_deplacer_piece(&(jeu->plateau), x, y , deplacement, orientation, &(coup.condition_victoire)); coup.valide=1; //on change de joueur joueur_changer(&(jeu->joueur)); return coup; }