Website Summary Files Commits Branches @commit @diff @stats
path: root / DiamondProblemAndPolymorphism / Chess / Board.hpp
blob: 2602cedcf797003373bd2d45d5cb0f76e332827c (plain) (blame)
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;
}