-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathEchiquier.cxx
136 lines (119 loc) · 2.75 KB
/
Echiquier.cxx
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
/**
* Mise en oeuvre de Echiquier.h
*
* @file Echiquier.cxx
*/
#include <iostream>
// A besoin de la declaration de la classe
#include "Echiquier.h"
#include "Piece.h"
using namespace std;
/**
* Constructeur par d�faut.
* Initialise � vide l'echiquier.
*/
Echiquier::Echiquier()
{
for (int i = 0; i < 64; i++)
m_cases[i] = nullptr;
}
/**
* Recupere la piece situee sur une case.
*
* @param x un entier entre 1 et 8
* @param y un entier entre 1 et 8
*
* @return 0 si aucune piece n'est sur cette case et un pointeur
* vers une piece sinon.
*/
Piece*
Echiquier::getPiece( int x, int y )
{
return m_cases[indexCase(x, y)];
}
/**
* Place une piece sur l'echiquier, aux coordonnees specifiees dans la piece.
*
* @param p un pointeur vers une piece
*
* @return 'true' si le placement s'est bien passe, 'false' sinon
* (case occupee, coordonnees invalides, piece vide )
*/
bool
Echiquier::placer( Piece* p )
{
if (p == nullptr || getPiece(p->x(), p->y()) != nullptr ||
!caseValide(p->x(), p->y())) {
return false;
}
m_cases[indexCase(p->x(), p->y())] = p;
return true;
}
/**
* Deplace une piece sur l'echiquier, des coordonnees specifiees
* dans la piece aux coordonnees x,y.
*
* @param p un pointeur vers une piece
* @param x un entier entre 1 et 8
* @param y un entier entre 1 et 8
*
* @return 'true' si le placement s'est bien passe, 'false' sinon
* (case occupee, coordonnees invalides, piece vide, piece pas
* presente au bon endroit sur l'echiquier)
*/
bool
Echiquier::deplacer( Piece* p, int x, int y )
{
if (p == nullptr || !caseValide(x, y) || m_cases[indexCase(x, y)] != nullptr ||
m_cases[indexCase(p->x(), p->y())] != p) {
return false;
}
m_cases[indexCase(p->x(), p->y())] = nullptr;
p->move(x, y);
m_cases[indexCase(x, y)] = p;
return true;
}
/**
* Enleve la piece situee sur une case (qui devient vide).
*
* @param x un entier entre 1 et 8
* @param y un entier entre 1 et 8
*
* @return 0 si aucune piece n'est sur cette case et le pointeur
* vers la piece enlevee sinon.
*/
Piece*
Echiquier::enleverPiece( int x, int y )
{
Piece *p = getPiece(x, y);
if (p == nullptr)
return nullptr;
m_cases[indexCase(x, y)] = nullptr;
return p;
}
/**
* Affiche l'echiquier avec des # pour les cases noires et . pour
* les blanches si elles sont vides, et avec B pour les pieces
* blanches et N pour les pieces noires.
*/
void
Echiquier::affiche()
{
cout << endl << " ABCDEFGH" << endl;
for ( int y = 8; y >= 1; --y )
{
cout << y << " ";
for ( int x = 1; x <= 8; ++x )
{
char c;
Piece* p = getPiece( x, y );
if ( p == 0 )
c = ( ( x + y ) % 2 ) == 0 ? '#' : '.';
else
c = p->name();
cout << c;
}
cout << " " << y << endl;
}
cout << " ABCDEFGH" << endl;
}