-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathverifications.c
More file actions
157 lines (133 loc) · 5.74 KB
/
verifications.c
File metadata and controls
157 lines (133 loc) · 5.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#include "verifications.h"
//Fonction qui permet la verification d'une selection d'un pion. Elle renvoit 0 si celle si
//est possible, sinon 1.
int verificationDeSelection(Plateau *plateau,Case *caseATester,int joueur){
if (plateau->tab[caseATester->y ][caseATester->x ] != joueur + 48){
afficherLePlateau(plateau);
erreur("\tVous avez fait une mauvaise sélection, ce pion ne vous appartient pas");
return 1;
}
return 0;
}
//Fonction qui renvoi 1 si la case est prise, et 0 si elle n'est pas prise
int testDeCase(Plateau *plateau,Case *caseATester){
if (plateau->tab[caseATester->y ][caseATester->x ] != '0'){
return 0;
}
else if (caseATester->x > 9 || caseATester->y > 9 || caseATester->x < 0 || caseATester->y < 0){
return 0;
}
else {
return 1;
}
}
//Fonction qui permet de renvoyer e nombre de saut possible pour le joueur
int nbrSautPossible(Plateau *plateau,Case caseSelectionne){
int nbrDeSautsPossibles = 0;
Case casePossible;
//On test toutes les cases du tableau pour voir lesquelles sont possibles a jouer
for (int i = 0 ; i <= 9 ; i++){
for (int j = 0 ; j <= 9 ;j++){
casePossible.y = i;
casePossible.x = j;
//Calcul de la distance entre la case Selectionne et la case Possible
double distanceEntreDeuxPions = sqrt(pow((caseSelectionne.x - casePossible.x),2) + pow((caseSelectionne.y - casePossible.y),2));
//Si la distance est egale a la racine de 8 ou a 2 ( racine 8 -> distance exacte pour une case de saut, 2 -> distance exacte pour deplacement normale )
//et qu'il n'y a pas d'autre joueur
if (((distanceEntreDeuxPions == sqrt(8) || distanceEntreDeuxPions == 2 )) && testDeCase(plateau,&casePossible)){
Case caseSaute;
//On stocke la case sauté (celle entre la case possible et la case selectionne )
caseSaute.x = (caseSelectionne.x+casePossible.x)/2;
caseSaute.y = (caseSelectionne.y+casePossible.y)/2;
//Si c'est un pion ( 50 ou 49 ( 2 ou 1 ))
if(plateau->tab[caseSaute.y][caseSaute.x] == 50 || plateau->tab[caseSaute.y ][caseSaute.x ] == 49)
{
//Alors on incremente le nombre de saut possible
nbrDeSautsPossibles++;
}
}
}
}
return nbrDeSautsPossibles;
}
//Fonction qui verifie la possibilité de déplacement d'un pion, retourne 1 si le joueur a fait un deplacement simple, et 2 si il a fait saut
int verificationDeDeplacement(Plateau *plateau,Case caseSelectionne,Case caseDeplacement,int typeVerification){
//cette variable contient la distance entre deux cases, pour verifier si le joueur peut se deplacer
double distanceEntreDeuxPions = sqrt(pow((caseSelectionne.x - caseDeplacement.x),2) + pow((caseSelectionne.y - caseDeplacement.y),2));
//Si la case n'est pas prise :
if (testDeCase(plateau,&caseDeplacement)){
if (typeVerification == 1){ // Si le type de verification est 1 , on doit verifier les déplacements simples
//Alors
//Premiere vérification de déplacement simple
if (distanceEntreDeuxPions <= sqrt(2)){
return 1;
}
}
//Deuxieme vérification de saut
if ((distanceEntreDeuxPions == sqrt(8) || distanceEntreDeuxPions == 2 )){
Case caseSaute;
caseSaute.x = (caseSelectionne.x+caseDeplacement.x)/2;
caseSaute.y = (caseSelectionne.y+caseDeplacement.y)/2;
if(plateau->tab[caseSaute.y][caseSaute.x] == 50 || plateau->tab[caseSaute.y ][caseSaute.x ] == 49)
{
return 2;
}
}
}
return 0;
}
//Fonction qui indique les possibilités de déplacement
//nous faisons une copie du tableau pour éviter de modifier les cases du vrai plateau
//le type 1 est le type d'indication de la premiere fois qu'il joue, et 2 de la possibilité de rejouer
int indicationDeDeplacement(Plateau plateau,Case caseSelectionne,int typeIndication){
//On test toutes les cases possibles du plateau, grace a verificationDeDeplacement
Case casePossible;
for (int i = 0 ; i <= 9 ; i++){
for (int j = 0 ; j <= 9 ;j++){
casePossible.y = i;
casePossible.x = j;
if (verificationDeDeplacement(&plateau,caseSelectionne,casePossible,1) && typeIndication == 1){
//Le * indique une possibilié de déplacement pour le joueur
plateau.tab[i][j] = '*';
}
if (verificationDeDeplacement(&plateau,caseSelectionne,casePossible,2) && typeIndication == 2){
//Le * indique une possibilié de déplacement pour le joueur
plateau.tab[i][j] = '*';
}
}
}
//On affiche le plateau (copié)
afficherLePlateau(&plateau);
return 0;
}
//Fonction qui verifie si un joueur a gagné
int verificationDeWin(Plateau *plateau,int joueur){
int nbrDePions = 0;
//Vérification en haut à gauche
if (joueur == 2){
for (int i = 0 ; i < 5 ; i++){
for (int j = 4 - i; j >= 0 ; j--){
if (plateau->tab[i][j] == joueur + 48){
nbrDePions++;
}
}
}
}
//Vérification en bas à droite
if (joueur == 1){
int v = 0;
for (int i = 5 ; i <= 9 ; i++){
for (int j = 9 - v; j <= 9 ; j++){
if (plateau->tab[i][j] == joueur + 48){
nbrDePions++;
}
}
v++;
}
}
if (nbrDePions == 15){
return 1; //C'EST GAGNÉ
}else {
return 0;
}
}