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
|
#include "Figure.hpp"
class Board
{
Figure*** board;
public:
Board();
Board(const Board& other) = delete;
Board& operator=(const Board& other) = delete;
~Board();
bool isEmptySquare(int x, int y) const;
bool AddKnight(int x, int y, bool isWhite);
bool AddQueen(int x, int y, bool isWhite);
bool AddBishop(int x, int y, bool isWhite);
bool AddRook(int x, int y, bool isWhite);
void Print();
bool MoveFigure(int xOld, int yOld, int xNew, int yNew);
};
Board::Board()
{
board = new Figure**[8];
for (int i = 0; i < 8; ++i)
board[i] = new Figure*[8];
for (int i = 0; i < 8; ++i)
{
for (int j = 0; j < 8; j++)
board[i][j] = nullptr;
}
}
Board::~Board()
{
for (int i = 0; i < 8; ++i)
{
for (int j = 0; j < 8; ++j)
{
delete board[i][j];
}
delete[] board[i];
}
delete[] board;
}
bool Board::isEmptySquare(int x, int y) const
{
return board[x][y] == nullptr;
}
bool Board::AddKnight(int x, int y, bool isWhite)
{
if (!isValidCoord(x, y) || !isEmptySquare(x, y))
return false;
board[x][y] = new Knight(x, y, isWhite);
return true;
}
bool Board::AddQueen(int x, int y, bool isWhite)
{
if (!isValidCoord(x, y) || !isEmptySquare(x, y))
return false;
board[x][y] = new Queen(x, y, isWhite);
return true;
}
bool Board::AddBishop(int x, int y, bool isWhite)
{
if (!isValidCoord(x, y) || !isEmptySquare(x, y))
return false;
board[x][y] = new Bishop(x, y, isWhite);
return true;
}
bool Board::AddRook(int x, int y, bool isWhite)
{
if (!isValidCoord(x, y) || !isEmptySquare(x, y))
return false;
board[x][y] = new Rook(x, y, isWhite);
return true;
}
void Board::Print()
{
for (int i = 0; i < 8; ++i)
{
for (int j = 0; j < 8; ++j)
{
if (!board[i][j])
cout << '_';
else
board[i][j]->Print();
}
cout << endl;
}
cout << endl;
cout << endl;
}
bool Board::MoveFigure(int xOld, int yOld, int xNew, int yNew)
{
if (isEmptySquare(xOld, yOld)) //Ако няма фигура, там от където искаме да преместим
return false;
bool res = board[xOld][yOld]->Move(xNew, yNew); //провери дали фигурата може да се премести на съответната прозиция.
if (!res)// ако не -> лъжа(ходът е невъзможен)
return false;
if (!isEmptySquare(xNew, yNew))
{
if (board[xOld][yOld]->isWhite ^ board[xNew][yNew]->isWhite)// ако там седи фигура от различен цвят
delete board[xNew][yNew]; //взимаме я(трием обекта)
else //ако фигурата която седи на новата позиция е от СЪЩИЯ цвят
{
board[xOld][yOld]->Move(xOld, yOld); //връщаме обратно кординатите новата фигура. Тук би възникнал проблем, ако имаме фигурата пешка.
//Това е така, понеже тя няма да може да се върне назад, ако вече е преместена.
return false; //За това примерно решение е, да се направи функция goBackwards.
}
}
board[xNew][yNew] = board[xOld][yOld];
board[xOld][yOld] = nullptr;
}
|