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;
    }

}
Пример #3
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");
        }
    }


}
Пример #5
0
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;
}