//fonctions de tests void test_api_siam_tenter_changer_orientation_piece_si_possible() { puts("Test api_siam_tenter_changer_orientation_piece_si_possible"); jeu_siam jeu; jeu_initialiser(&jeu); piece_siam *piece = plateau_obtenir_piece(&(jeu.plateau),1,1); piece->type=elephant; piece->orientation=bas; coup_jeu coup; coup_jeu_initialiser(&coup); //on test si le coup est valide en changeant l'orientation de l'éléphant avec le bon joueur coup = api_siam_tenter_changer_orientation_piece_si_possible(&jeu,1,1,haut); if(coup.valide!=1 || piece->orientation!=haut || jeu.joueur!=1) puts("joueur 0/elephant haut KO"); //on test si le coup est non valide en changeant l'orientation d'une piece avec le mauvais joueur coup = api_siam_tenter_changer_orientation_piece_si_possible(&jeu,1,1,bas); if(coup.valide!=0 || jeu.joueur!=1) puts("joueur 1/elephant haut KO"); jeu.joueur=0; //on revient au premier joueur (des elephants) //on test si le coup est non valide en envoyant la meme orientation coup = api_siam_tenter_changer_orientation_piece_si_possible(&jeu,1,1,haut); if(coup.valide!=0 || jeu.joueur!=0) puts("joueur 0/meme orientation KO"); }
void test_api_siam_tenter_introduire_nouvelle_piece_si_possible() { puts("Test api_siam_tenter_introduire_nouvelle_piece_si_possible"); jeu_siam jeu; jeu_initialiser(&jeu); coup_jeu coup; coup_jeu_initialiser(&coup); const piece_siam *piece = plateau_obtenir_piece_info(&(jeu.plateau),0,0); //on test si le coup est valide si on envoie des coordonnees au bord coup = api_siam_tenter_introduire_nouvelle_piece_si_possible(&jeu, 0, 0, haut); if(coup.valide!=1 || piece->orientation!=haut || jeu.joueur!=1) puts(" introduction case vide KO"); //on test si le coup n'est pas valide si on envoie des coordonnees pas au bord coup = api_siam_tenter_introduire_nouvelle_piece_si_possible(&jeu, 1, 1, haut); if(coup.valide!=0 || jeu.joueur!=1) puts(" introduction pas au bord KO"); //on test si le coup est valide si on introduit sur une case deja occupee avec une bonne orientation coup = api_siam_tenter_introduire_nouvelle_piece_si_possible(&jeu, 0, 0, haut); if(coup.valide!=1 || jeu.joueur!=0) puts(" introduction sur une piece deja existante bonne orientation KO"); //on test si le coup est non valide si on introduit sur une case deja occupee avec une mauvaise orientation coup = api_siam_tenter_introduire_nouvelle_piece_si_possible(&jeu, 0, 0, bas); if(coup.valide!=0 || jeu.joueur!=0) puts(" introduction sur une piece deja existante mauvaise orientation KO"); //on test si on essaye d'introduire trop de piece (plus de 5) //il y a déjà un éléphant, il faut en rajouter 4 piece_siam *piece_4_4 = plateau_obtenir_piece(&(jeu.plateau), NBR_CASES-1, NBR_CASES-1); piece_4_4->type = elephant; piece_4_4->orientation = gauche; piece_siam *piece_3_4 = plateau_obtenir_piece(&(jeu.plateau), 3, NBR_CASES-1); piece_3_4->type = elephant; piece_3_4->orientation = gauche; piece_siam *piece_2_4 = plateau_obtenir_piece(&(jeu.plateau), 2, NBR_CASES-1); piece_2_4->type = elephant; piece_2_4->orientation = gauche; piece_siam *piece_1_4 = plateau_obtenir_piece(&(jeu.plateau), 1, NBR_CASES-1); piece_1_4->type = elephant; piece_1_4->orientation = gauche; coup = api_siam_tenter_introduire_nouvelle_piece_si_possible(&jeu, NBR_CASES-1, 0, haut); if(coup.valide!=0 || jeu.joueur!=0) puts(" introduction de plus de 5 pieces KO"); }
void test_api_siam_tenter_deplacer_piece_si_possible() { puts("Test api_siam_tenter_deplacer_piece_si_possible"); jeu_siam jeu; jeu_initialiser(&jeu); int x=0, y=0; piece_siam *piece = plateau_obtenir_piece(&(jeu.plateau),x,y); piece->type=elephant; piece->orientation=bas; coup_jeu coup; coup_jeu_initialiser(&coup); //on test si le coup est valide en bougeant la bonne piece et avec des coordonnees dans le plateau coup = api_siam_tenter_deplacer_piece_si_possible(&jeu, x, y, haut, bas); coordonnees_appliquer_deplacement(&x, &y, haut); piece_siam *piece_apres_deplacement = plateau_obtenir_piece(&(jeu.plateau),x,y); if(coup.valide!=1 || piece_apres_deplacement->orientation!= bas || jeu.joueur!=1) {printf("orientation = %d",piece_apres_deplacement->orientation); puts(" joueur 0/elephant orientation KO");} //on test si le coup n'est pas valide si on envoie des coordonnees pas dans le plateau coup = api_siam_tenter_deplacer_piece_si_possible(&jeu, 6, 2, haut, bas); if(coup.valide!=0 || jeu.joueur!=1) puts(" joueur 1/coordonnees pas au bord KO"); //on test si le coup est non valide si on essaye de deplacer sur une case avec un animal d'orientation non opposée int copy_x=x, copy_y=y; //on copie les valeurs de x et y pour introduire une nouvelle piece coordonnees_appliquer_deplacement(©_x, ©_y, droite); //on change les coordonnes pour introduire la nouvelle piece //à l'endroit desire piece_siam *nouvelle_piece = plateau_obtenir_piece(&(jeu.plateau), copy_x, copy_y); piece_apres_deplacement->type = rhinoceros; //on est au joueur 1 qui joue les rhino, or à la position x et y a il y a un elephant ! nouvelle_piece->type = rhinoceros; nouvelle_piece->orientation = gauche; coup = api_siam_tenter_deplacer_piece_si_possible(&jeu, x, y, droite, droite); if(coup.valide!=0 || jeu.joueur!=1) puts(" joueur 1/deplacement sur une case avec un animal non oppose KO"); //on test si le coup est valide si on essaye de deplacer sur une case avec un animal d'orientation non opposée nouvelle_piece->orientation = bas; coup = api_siam_tenter_deplacer_piece_si_possible(&jeu, x, y, droite, droite); if(coup.valide!=0 || jeu.joueur!=1) puts(" joueur 0/deplacement sur une case avec un animal non oppose KO"); }
void entree_sortie_lire_jeu_fichier(const char* filename,jeu_siam* jeu) { const char *lgn_joueur = "joueur %d"; int joueur; const char *lgn_int = "[%d]"; const char *lgn_str = "[%s]"; char y_str[10]; char buffer[100]; FILE *identifiant = fopen(filename, "r"); jeu_initialiser(jeu); if (identifiant == NULL) { printf("Erreur ouverture fichier %s\n", filename); exit(1); } int y, i; // 100 : valeur arbitraire, fgets() s'arrete au \n while (fgets(buffer, 100, identifiant) != 0) { if (sscanf(buffer, lgn_joueur, &joueur) == 1) jeu->joueur = joueur; else if (sscanf(buffer, lgn_int, &y) == 1) { sscanf(buffer, lgn_str, &y_str); if (y < 0 || y > NBR_CASES) { puts("Erreur lecture numero de ligne"); exit(1); } for (i = 0; i < NBR_CASES; i++) { char type_piece_nom_cours[4]; type_piece_nom_cours[0] = buffer[strlen(y_str) + 2 + i*6]; type_piece_nom_cours[1] = buffer[strlen(y_str) + 3 + i*6]; type_piece_nom_cours[2] = buffer[strlen(y_str) + 4 + i*6]; type_piece_nom_cours[3] = '\0'; jeu->plateau.piece[i][y] = piece_correspondre_nom_cours(type_piece_nom_cours); } } } if (!jeu_etre_integre(jeu)) { printf("Jeu invalide lecture fichier %s\n", filename); exit(1); } }
void mode_interactif_lancer() { puts("\n***********************"); puts("Jeu SIAM mode interactif:"); puts("***********************"); puts("Commandes:"); puts("> # : Commentaires, tout ce qui suit # n'est pas analyse."); puts("> i : [I]nitialisation du jeu."); puts("> n x0 y0 dir : [N]ouvelle piece introduite en (x0,y0) avec direction indiquee."); puts("> d x0 y0 dir0 dir1 : [D]eplacement piece de (x0,y0) dans le sens dir0 indique"); puts(" et ayant la direction dir1 a l'arrive."); puts("> o x0 y0 dir : [O]rientation nouvelle de la piece en (x0,y0)."); puts("> lit [NOM_FICHIER] : Lire un fichier externe."); puts(""); puts("directions possibles: gauche <, droite >, haut ^, bas v."); printf("***********************\n\n"); fflush(stdout); int victoire=0; jeu_siam jeu; jeu_initialiser(&jeu); action_a_realiser action; action_initialiser(&action); mode_interactif_sauvegarder_jeu_fichier(&jeu); char buffer_ligne_commande[MAX_NOM_FICHIER_TAILLE]; do { puts("");fflush(stdout); jeu_afficher(&jeu); printf("> "); fflush(stdout); if(jeu.joueur == 0) { fgets(buffer_ligne_commande,MAX_LIGNE_COMMANDE,stdin); ligne_de_commande_parser(buffer_ligne_commande,&action); } else { ai_joue_tour(&jeu); FILE *fid=fopen("AI_instructions.txt","r"); fscanf(fid, "%7c\n", buffer_ligne_commande); int c=fclose(fid); if(c!=0) { printf("Erreur fermeture fichier %s\n", "AI_instructions.txt"); exit(1); } ligne_de_commande_parser(buffer_ligne_commande,&action); } switch(action.type_action) { case deplacement: mode_interactif_deplacer_piece(&jeu,action.x_depart,action.y_depart,action.deplacement,action.orientation,&victoire); break; case introduction: mode_interactif_introduire_nouvelle_piece(&jeu,action.x_depart,action.y_depart,action.orientation,&victoire); break; case changement_orientation: mode_interactif_changer_orientation(&jeu,action.x_depart,action.y_depart,action.orientation); break; case lecture_fichier: mode_interactif_lire_fichier(&jeu,action.filename); break; case initialisation: printf("Initialisation du jeu\n");fflush(stdout); jeu_initialiser(&jeu); mode_interactif_sauvegarder_jeu_fichier(&jeu); break; case fin: printf("Fin de la partie\n");fflush(stdout); break; default: puts("\nLigne non valide, action non realisee\n");fflush(stdout); break; } } while(action.type_action!=fin && victoire==0); }