jeu-des-trente-allumettes/partie.c

98 lines
2.9 KiB
C

/* partie.c */
#include <stdio.h>
#include <stdlib.h>
#include "affichage.h"
#include "misc.h"
#include "partie.h"
int NB_ALLUMETTES = 30;
void partie(char *joueur1, char *joueur2) {
enum Joueur joueur_courant = J1;
int allumettes_retirees = 0;
while (NB_ALLUMETTES) {
if (joueur_courant == J1) {
afficher_tour(joueur1);
} else {
afficher_tour(joueur2);
}
afficher_allumettes(NB_ALLUMETTES);
if ((allumettes_retirees = jouer_coup(joueur_courant))) {
if (joueur_courant == J1) printf("%s a retiré %d allumette(s).\n", joueur1, allumettes_retirees);
else printf("%s a retiré %d allumette(s).\n", joueur2, allumettes_retirees);
joueur_courant = (joueur_courant + 1) % 2; // il n'y a que deux joueurs
}
}
if (joueur_courant == J1) {
// on inverse parce que le joueur courant a changé après le dernier coup du perdant
afficher_perdant(joueur2);
} else {
afficher_perdant(joueur1);
}
}
int get_nb_allumettes_a_retirer(enum Joueur joueur_courant) {
int allumettes_a_retirer;
if ((ORDINATEUR != HUMAN) && (joueur_courant == J2)) {
if (ORDINATEUR == EASY) {
// ORDI Stupide
allumettes_a_retirer = rand() % 3 + 1;
} else if(ORDINATEUR == HARD) {
// ORDI Intelligent
allumettes_a_retirer = ((NB_ALLUMETTES - 1) % 4);
if (allumettes_a_retirer == 0) {
// Si l'ordinateur ne peut pas jouer intelligemment, alors il joue aléatoirement.
// On ne s'intéresse pas à savoir si on enlève plus que le nombre d'allumettes qu'il reste car c'est géré dans jouer_coup
allumettes_a_retirer = rand() % 3 + 1 ;
}
} else {
// ERREUR
exit(EXIT_FAILURE);
}
} else {
printf("Combien d'allumettes souhaitez-vous retirer ? [1-3] : ");
allumettes_a_retirer = fgetc(stdin);
if (allumettes_a_retirer == '\n') {
// rien n'a été tapé, créons une erreur "propre" pour sortir avec false
allumettes_a_retirer = 0;
} else {
if (allumettes_a_retirer == 'q') {
// joueur déclare forfait
NB_ALLUMETTES = 0;
return 1;
}
// conversion vers int depuis la valeur ascii
allumettes_a_retirer = allumettes_a_retirer - 48;
vider_buffer();
}
}
return allumettes_a_retirer;
}
int jouer_coup(enum Joueur joueur_courant) {
int allumettes_a_retirer;
allumettes_a_retirer = get_nb_allumettes_a_retirer(joueur_courant);
if ((allumettes_a_retirer < 1) || (allumettes_a_retirer > 3)) {
printf("Coup invalide ! Veuillez recommencer...\n");
return 0;
}
NB_ALLUMETTES = NB_ALLUMETTES - allumettes_a_retirer;
if (NB_ALLUMETTES < 0) {
NB_ALLUMETTES = 0;
}
return allumettes_a_retirer;
}