/********************************************************************* Nom du projet : sao Nom du fichier : sao.c Auteur : dbernard Date de création : Friday 2015-12-04-13.57 ------------------------------------------ Edition : therbron Date d'edition : Thursday 2015-12-10-13.28 ------------------------------------------ Copyright 2013 par depinfo.touchard Description fonctionnelle de la bibliotheque : *********************************************************************/ #include "sao.h" #include #include #include #include #include #include #include #include #include // attendre un maxTime millisecondes void msleep(unsigned int maxTime) { /* struct timespec { time_t tv_sec; // secondes long tv_nsec; // nanosecondes }; */ struct timespec req; struct timespec rem; time_t secondes=0; long nanoSecondes=0; if (maxTime>=1000) { do { secondes++; maxTime-=1000; } while(maxTime>=1000); } nanoSecondes=maxTime*1000000; req.tv_sec=secondes; req.tv_nsec=nanoSecondes; nanosleep(&req,&rem); } //retourne une valeur entiere E[0..maxAlea[ unsigned int aleatoire(unsigned int maxAlea ) { /* struct timeb { time_t time; unsigned short millitm; short timezone; short dstflag; };*/ struct timeb t; float a, b ; unsigned int nbmilli; ftime( &t ); nbmilli = t.time * 1000 + t.millitm; srand( nbmilli ); a = rand(); b = ( maxAlea * a ) / RAND_MAX; msleep(50); return( ( unsigned int )b ); } void afficherMenu(typePersonnage *joueur1, typePersonnage *joueur2) { if(joueur1 == NULL) { printf("1 - Creer personnage joueur 1\n"); printf("2 - Charger joueur 1\n"); } if(joueur2 == NULL) { printf("3 - Creer personnage joueur 2\n"); printf("4 - Charger joueur 2\n"); } if((joueur1 != NULL) && (joueur2 != NULL)) { printf("5 - joueur 1 vs joueur 2\n"); printf("6 - joueur 1 vs joueur 2 X10\n"); printf("7 - joueur 2 vs joueur 1\n"); printf("8 - joueur 2 vs joueur 1 X 10\n"); printf("9 - Afficher joueur 1\n"); printf("10 - Afficher joueur 2\n"); printf("11 - Sauvegarder joueur 1\n"); printf("12 - Sauvegarder joueur 2\n"); } printf("13 - Quitter\n"); } int calculAttaque(typePersonnage *att) { double bonus; double attaque; switch (att->competence) { case PALADIN: bonus=BONUSATTPALA; break; case SAMOURAI: bonus=BONUSATTSAM; break; case BERSERK: bonus=BONUSATTBER; break; case BRETTEUR: bonus=BONUSATTBRE; break; case GUERRIER: bonus=BONUSATTGUE; break; case ASSASSIN: bonus=BONUSATTASS; break; } attaque=att->niveau*( (att->poids*att->taille)/ (double)att->age)*bonus; // je personnage possede une arme a 2 mains if (att->armes.deuxMains!=NIL) { attaque=attaque+att->armes.deuxMains; } else // le personnage ne possede pas d'arme a 2 mains { // le perso n'a pas de bouclier if (att->armes.mainDroite!=BOUCLIER && att->armes.mainGauche!=BOUCLIER) { attaque=attaque+att->armes.mainDroite+att->armes.mainGauche; } else // un bouclier dans l'une des mains { attaque=attaque+att->armes.mainDroite+att->armes.mainGauche-BOUCLIER+2; } } attaque=attaque*(0.5+aleatoire(10)/10.0); return (int)attaque; } int calculDefense(typePersonnage *def) { double bonus; double defense; switch (def->competence) { case PALADIN: bonus=BONUSDEFPALA; break; case SAMOURAI: bonus=BONUSDEFSAM; break; case BERSERK: bonus=BONUSDEFBER; break; case BRETTEUR: bonus=BONUSDEFBRE; break; case GUERRIER: bonus=BONUSDEFGUE; break; case ASSASSIN: bonus=BONUSDEFASS; break; } defense=def->niveau*( (def->poids*def->taille)/ (double)def->age)*bonus; // je personnage possede une arme a 2 mains if (def->armes.deuxMains!=NIL) { defense=defense-(def->armes.deuxMains)/2; } else // le personnage ne possede pas d'arme a 2 mains { // le perso n'a pas de bouclier if (def->armes.mainDroite!=BOUCLIER && def->armes.mainGauche!=BOUCLIER) { defense=defense-(def->armes.mainDroite+def->armes.mainGauche)/3; } else // un bouclier dans l'une des mains { defense=defense-BOUCLIER; } } defense=defense*(0.5+aleatoire(10)/10.0); return (int)defense; } void mettreAJourNiveau(typePersonnage *perso, unsigned int exp) { perso->experience+=exp; if (perso->experience>=EXPERIENCEPASSAGE) { perso->niveau++; perso->experience-=EXPERIENCEPASSAGE; perso->pvMax+=PVMAXINIT/perso->niveau; perso->pv=perso->pvMax; switch (perso->competence) { case PALADIN: perso->resistancePhysique+=RESPALADIN; break; case SAMOURAI: perso->resistancePhysique+=RESSAMOURAI; break; case BERSERK: perso->resistancePhysique+=RESBERSERK; break; case BRETTEUR: perso->resistancePhysique+=RESBRETTEUR; break; case GUERRIER: perso->resistancePhysique+=RESGUERRIER; break; case ASSASSIN: perso->resistancePhysique+=RESASSASSIN; break; } } } unsigned int calculerGainExperience(typePersonnage *p1,typePersonnage *p2,booleen victoire,unsigned int tours) { unsigned int exp=0; if (victoire) { exp=2*(p2->niveau-p1->niveau+1)*tours; } else { exp=(p2->niveau-p1->niveau+1)*tours; } return exp; } void afficherClasse(competenceDeClasse c) { switch(c) { case PALADIN: printf("Paladin \n"); break; case SAMOURAI: printf("Samourai\n"); break; case BERSERK: printf("Berserk\n"); break; case BRETTEUR: printf("Bretteur\n"); break; case GUERRIER: printf("Guerrier\n"); break; case ASSASSIN: printf("Assassin\n"); break; } } void afficherArmeUneMain(armesUneMain aum) { switch (aum) { case DAGUE: printf("Dague - degats : %d\n",DAGUE); break; case WAKIZASHI: printf("Wakizashi - degats : %d\n",WAKIZASHI); break; case GLAIVE: printf("Glaive - degats : %d\n",GLAIVE); break; case XIPHOS: printf("Xiphos - degats : %d\n",XIPHOS); break; case CLADIO: printf("Cladio - degats : %d\n",CLADIO); break; case RAPIERE: printf("Rapiere - degats : %d\n",RAPIERE); break; case BOUCLIER: printf("Bouclier - protection : %d\n",-BOUCLIER); break; case RIEN: printf("Vide - degats : 1\n"); break; } } void afficherArmeDeuxMains(armesDeuxMains adm) { switch (adm) { case NIL: printf("Nil - degats : %d\n",NIL); break; case BATARDE: printf("Batarde - degats : %d\n",BATARDE); break; case KATANA: printf("Katana - degats : %d\n",KATANA); break; case CLAYMORE: printf("Claymore - degats : %d\n",CLAYMORE); break; case FLAMBERGE: printf("Flamberge - degats : %d\n",FLAMBERGE); break; } } void afficherArmement(typeArmement arm) { // il possede une arme a 2 mains if (arm.deuxMains!=NIL) { printf("2 mains : "); afficherArmeDeuxMains(arm.deuxMains); } else { printf("Main gauche : "); afficherArmeUneMain(arm.mainGauche); printf("Main droite : "); afficherArmeUneMain(arm.mainDroite); } } void afficherPersonnage(typePersonnage *perso) { printf("Classe : "); afficherClasse(perso->competence); printf("Nom: %s\nPrenom : %s\nAge : %d\nTaille : %.2f\nPoids : %.2f\n",perso->nom,perso->prenom,perso->age,perso->taille,perso->poids); printf("Resistance : %d\nPoints de vie : [%d/%d]\n",perso->resistancePhysique,perso->pv,perso->pvMax); printf("Niveau : %d\nExperience dans le niveau : %d/%d\n",perso->niveau,perso->experience,EXPERIENCEPASSAGE); afficherArmement(perso->armes); } armesUneMain choisirArmeUneMain() { armesUneMain arme; int choix; do { printf("Choix de l'arme :\n"); printf(" 1 :"); afficherArmeUneMain(DAGUE); printf(" 2 :"); afficherArmeUneMain(WAKIZASHI); printf(" 3 :"); afficherArmeUneMain(GLAIVE); printf(" 4 :"); afficherArmeUneMain(XIPHOS); printf(" 5 :"); afficherArmeUneMain(CLADIO); printf(" 6 :"); afficherArmeUneMain(RAPIERE); printf("\n votre choix : "); scanf("%d",&choix); } while(choix<1 || choix >6); switch(choix) { case 1: arme=DAGUE; break; case 2: arme=WAKIZASHI; break; case 3: arme=GLAIVE; break; case 4: arme=XIPHOS; break; case 5: arme=CLADIO; break; case 6: arme=RAPIERE; break; } return arme; } armesDeuxMains choisirArmeDeuxMains() { armesDeuxMains arme; int choix; do { printf("Choix de l'arme : \n"); printf(" 1 :"); afficherArmeDeuxMains(BATARDE); printf(" 2 :"); afficherArmeDeuxMains(KATANA); printf(" 3 :"); afficherArmeDeuxMains(CLAYMORE); printf(" 4 :"); afficherArmeDeuxMains(FLAMBERGE); printf("\n votre choix : "); scanf("%d",&choix); } while(choix<1 || choix >4); switch(choix) { case 1: arme=BATARDE; break; case 2: arme=KATANA; break; case 3: arme=CLAYMORE; break; case 4: arme=FLAMBERGE; break; } return arme; } unsigned int determinerResistance(competenceDeClasse c) { unsigned int res; switch(c) { case PALADIN: res=RESPALADIN; break; case SAMOURAI: res=RESSAMOURAI; break; case BERSERK: res=RESBERSERK; break; case BRETTEUR: res=RESBRETTEUR; break; case GUERRIER: res=RESGUERRIER; break; case ASSASSIN: res=RESASSASSIN; break; } return res; } typePersonnage* creerPersonnage() { typePersonnage* p=malloc(sizeof(typePersonnage)); int choix; char unOuDeux; do { printf("choix de la classe :\n"); printf(" 1 - Bretteur\n"); printf(" 2 - Paladin\n"); printf(" 3 - Berserk\n"); printf(" 4 - Assassin\n"); printf(" 5 - Guerrier\n"); printf(" 6 - Samourai\n"); printf("Votre choix : "); scanf("%d",&choix); } while(choix<1 || choix >6); switch (choix) { case 1: p->competence=BRETTEUR; break; case 2: p->competence=PALADIN; break; case 3: p->competence=BERSERK; break; case 4: p->competence=ASSASSIN; break; case 5: p->competence=GUERRIER; break; case 6: p->competence=SAMOURAI; break; } printf("Nom :"); scanf(" %s",p->nom); printf("Prenom :"); scanf(" %s",p->prenom); printf("Age :"); scanf("%d",&p->age); printf("Taille :"); scanf("%f",&p->taille); printf("Poids :"); scanf("%f",&p->poids); p->pv=PVMAXINIT; p->pvMax=PVMAXINIT; p->experience=0; p->niveau=1; p->resistancePhysique=determinerResistance(p->competence); // si berserk ne peut avoir qu'une arme a 2 mains if (p->competence==BERSERK) { p->armes.deuxMains=choisirArmeDeuxMains(); } else // pas berserk { p->armes.deuxMains=NIL; if (p->competence==PALADIN || p->competence==SAMOURAI) { do { printf("Voulez vous utiliser une arme à deux mains(o/n)?"); scanf(" %c",&unOuDeux); } while(unOuDeux!='o' && unOuDeux!='n' ); if (unOuDeux=='o') { p->armes.deuxMains=choisirArmeDeuxMains(); } else { p->armes.mainDroite=choisirArmeUneMain(); if (p->competence==PALADIN) // epee et bouclier { p->armes.mainGauche=BOUCLIER; } if (p->competence==SAMOURAI) // epee et main libre { p->armes.mainGauche=RIEN; } } } if (p->competence==ASSASSIN) { p->armes.mainDroite=choisirArmeUneMain(); p->armes.mainGauche=RIEN; } if (p->competence==BRETTEUR) { do { printf("Voulez vous utiliser deux armes (o/n)?"); scanf(" %c",&unOuDeux); } while(unOuDeux!='o' && unOuDeux!='n' ); if (unOuDeux=='o') { printf("Main droite : "); p->armes.mainDroite=choisirArmeUneMain(); printf("Main gauche : "); p->armes.mainGauche=choisirArmeUneMain(); } else { p->armes.mainDroite=choisirArmeUneMain(); p->armes.mainGauche=RIEN; } } if (p->competence==GUERRIER) { do { printf("Voulez vous utiliser un bouclier(o/n)?"); scanf(" %c",&unOuDeux); } while(unOuDeux!='o' && unOuDeux!='n' ); if (unOuDeux=='o') { printf("Main droite : "); p->armes.mainDroite=choisirArmeUneMain(); p->armes.mainGauche=BOUCLIER; } else { p->armes.mainDroite=choisirArmeUneMain(); p->armes.mainGauche=RIEN; } } } return p; } void faireUnDuel(typePersonnage *j1,typePersonnage *j2) { booleen j1gagne=FALSE; booleen j2gagne=FALSE; int tour=0; int expj1,expj2; int degatJ1vsJ2; int degatJ2vsJ1; do { degatJ1vsJ2=calculDegats(j1,j2); // mettre a jour les pv de j2 (pv actuel - degat) j2->pv = j2->pv - degatJ1vsJ2; // afficher j1 attaque j2 et degats occasionnes printf("Le joueur 1 attaque le joueur 2 et lui inflige %d de degats.\n", degatJ1vsJ2); degatJ2vsJ1=calculDegats(j2,j1); // mettre a jour les pv de j1 (pv actuel - degat) j1->pv = j1->pv - degatJ2vsJ1; // afficher j1 attaque j2 et degats occasionnes printf("Le joueur 2 attaque le joueur 1 et lui inflige %d de degats.\n", degatJ2vsJ1); // afficher les pv des deux joueurs printf("%s [%d/%d]pv\n", j1->nom, j1->pv, j1->pvMax); printf("%s [%d/%d]pv\n", j2->nom, j2->pv, j1->pvMax); // augmenter le nombre de tours tour++; } while (j1->pv>0 && j2->pv>0); if (j1->pv>0) { j1gagne=TRUE; // remettre les pv de j2 au maximum j2->pv = j2->pvMax; } else { j2gagne=TRUE; // remettre les pv de j1 au maximum j1->pv = j1->pvMax; } expj1 = calculerGainExperience(j1,j2,j1gagne,tour); // mettre a jour j1 mettreAJourNiveau(j1, expj1); expj2 = calculerGainExperience(j2,j1,j2gagne,tour); // mettre a jour j2 mettreAJourNiveau(j2, expj2); // afficher j1 printf("++++++++++++++++++++++++++++++++"); afficherPersonnage(j1); printf("================================="); // afficher j2 afficherPersonnage(j2); printf("++++++++++++++++++++++++++++++++"); } int calculDegats(typePersonnage *attaquant, typePersonnage *defenseur) { float degats; degats = calculAttaque(attaquant) - calculDefense(defenseur); if(degats <= 0){ degats = 1; } return degats; } void sauvegarderPersonnages(typePersonnage *joueur) { char nomFichier[NBMAXCARNOM]; printf("Nom du fichier txt de sauvegarde :"); scanf("%s", nomFichier); FILE *pFich = fopen(nomFichier, "w+"); //Test si le fichier est correcte if(pFich == -1) { printf("%s\n", strerror(errno)); exit(errno); } fwrite(joueur, sizeof(typePersonnage), 1, pFich); fclose(pFich); } typePersonnage* chargerPersonnage() { char nomFichier[NBMAXCARNOM]; typePersonnage* joueur=malloc(sizeof(typePersonnage)); printf("Nom du fichier txt à ouvrir \n(le fichier en question doit etre a la racine du programme):"); scanf("%s", nomFichier); FILE *pFich = fopen(nomFichier, "r"); //Test si le fichier est correcte if(pFich == -1) { printf("%s\n", strerror(errno)); exit(errno); } fread(joueur, sizeof(typePersonnage), 1, pFich); fclose(pFich); return joueur; }