-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathplayer.cpp
More file actions
executable file
·156 lines (145 loc) · 5.03 KB
/
player.cpp
File metadata and controls
executable file
·156 lines (145 loc) · 5.03 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
145
146
147
148
149
150
151
152
153
154
155
156
#include "player.h"
#include "board.h"
#include "piece.h"
#include <iostream>
Player::Player(Board& p, int col){
J2=this;
king_castling=true;
queen_castling=true;
check=false;
checkmate=false;
ptr_b=&p;
color = col;
box = new Piece*[8*2];
int k=0;
for(int i=0;i<8;i++){
for(int j=0;j<8;j++){
Piece* processed_piece = p[Case(i, j)];
if (processed_piece != nullptr && processed_piece->get_color() == col){
box[k]=processed_piece;
++k;
}
}
}
}
Player::~Player(){
delete [] box;
}
void Player::display() const{
std::string col_str[2] = {"BLACK", "WHITE"};
std::cout << "Player's Color " + col_str[color] << std::endl;
for(int i=0;i<8*2;i++){
if (box[i]==nullptr) std::cout << "Warning nullptr in box" << std::endl;
else std::cout << box[i]->get_name() << " : " << box[i]->get().get(0) << box[i]->get().get(1) << std::endl;
}
}
void Player::kill_piece(Piece* p){
for(int i=0;i<8*2;i++){
if (box[i]==p){
box[i]=nullptr;}
}
}
void Player::set_piece(Piece* p){
for(int i=0;i<8*2;i++){
if (box[i]==nullptr){
std::cout<<"Work done"<< std::endl;
box[i]=p;}
}
}
void Player::set_king_castling(bool value){ king_castling=value;}
void Player::set_queen_castling(bool value){ queen_castling=value;}
int Player::get_color() const{return color;}
Piece** Player::get_box(){return box;}
bool Player::get_check(){return check;}
bool Player::get_checkmate(){return checkmate;}
bool Player::get_king_castling(){return king_castling;}
bool Player::get_queen_castling(){return queen_castling;}
Board* Player::get_board(){return ptr_b;}
void Player::set_other_player(Player* J){J2=J;}
Piece* Player::get_my_king(){
for(int i=0;i<8*2;i++){
if(box[i]!=nullptr && box[i]->get_name()=="king") return box[i];
}
return nullptr;
}
bool Player::is_checkmate(){ // not implemented yet
return false;
}
bool Player::move(Piece* p, Case c){
if (p!=nullptr && p->get_color()==get_color()){
Piece* eater = can_eat_me(get_my_king()->get());
if (eater != nullptr){
if (p->get_name()=="king"){
ptr_b->set(nullptr, p->get());
if (can_eat_me(c) == nullptr){
ptr_b->set(p, p->get());
return ptr_b->move(p, c); // if the check can be avoided by moving, we do that
}
else {
ptr_b->set(p, p->get());
return false;
}
}
else if (ptr_b->get(c)==nullptr){ // taking care of check
ptr_b->set(p,c);
ptr_b->set(nullptr, p->get());
if (can_eat_me(get_my_king()->get())==nullptr){
ptr_b->set(nullptr,c);
ptr_b->set(p, p->get());
return ptr_b->move(p, c);
}
else {
ptr_b->set(nullptr,c);
ptr_b->set(p, p->get());
return false;
}
}
else { // the checker is captured
if (eater->get() == c){
ptr_b->set(p,c);
ptr_b->set(nullptr, p->get());
if (can_eat_me(get_my_king()->get(), eater)==nullptr){
ptr_b->set(eater,c);
ptr_b->set(p, p->get());
return ptr_b->move(p, c);
}
else {
ptr_b->set(eater,c);
ptr_b->set(p, p->get());
return false;
}
}
else return false;
}
}
else if (p->get_name()=="king"){
if (!can_eat_me(c)) return ptr_b->move(p, c);
else return false;
}
else {
if (!can_eat_me(get_my_king()->get(), p)){
return ptr_b->move(p, c);
}
else {
return false;
}
}
}
else
return false;
}
Piece* Player::can_eat_me(Case c, Piece* ghosted){ // allow a piece to be removed during the test
// => we tried to deal with discovered check using this method
// Ghosted is kind of polymorphic xD
/* $ghosted can be used to "forget" a piece of the opposite player which can no more capture us
* OR it can be used to "forget" one of our own pieces, to test if it doesnt "discover" a check by moving it,
* which means the piece is pinned. */
Piece** ptr_box = J2->get_box();
for (int i=0;i<8*2;i++) {
if (ptr_box[i] != nullptr && ptr_box[i] != ghosted && ptr_b->permission_capture(ptr_box[i], c, ghosted)){
std::cout << "A piece of the following type can eat me : " << ptr_box[i]->get_name() << " and is on the case(" << ptr_box[i]->get().get(0) << "," << ptr_box[i]->get().get(1) << ")" << std::endl;
return ptr_box[i];
}
}
return nullptr;
}