Структура входных и выходных данных
Входные данные:
Camera – экземпляр класса Camera, позволяет управлять камерой в игровом мире;
Board – экземпляр класса Chessboard, представляет игровое поле с расположенными на нем фигурами;
g_pDevice – указатель на интерфейс IDirect3DDevice9, предоставляет возможности работы с графикой;
g_Matrix – экземпляр структуры D3DXMATRIX, является матрицей преобразования;
Выходные данные:
hWnd – дескриптор окна с прорисованным игровым миром;
hResult – переменная типа HRESULT, используется как статус состояния игры.
ДИАГРАММА КЛАССОВ
ОПИСАНИЕ КЛАССОВ
Абстрактный класс для описания фигуры, в котором определяются ее цвет, метод его установки и получения | Figure |
Экземпляр класса является фигурой – король | King |
Экземпляр класса является фигурой – королева | Queen |
Экземпляр класса является фигурой – пешка | Pawn |
Экземпляр класса является фигурой – слон | Bishop |
Экземпляр класса является фигурой – ладья | Rook |
Экземпляр класса является фигурой – конь | Horse |
Структура для хранения двумерных координат | Position |
Класс исключений | bvException |
Класс исключения: ход на дружественную фигуру | FriendlyFire |
Класс исключения: выбора пустой клетки | EmptyCell |
Класс исключения: неверного хода | BadMove |
Класс исключения: наличие фигур на диагональной линии | BadDiagLine |
Класс исключения: наличие фигур на прямой линии | BadStraightLine |
Класс исключения: нарушение очередности хода | NotUrTurn |
Класс служит для обзора игрового мира | Camera |
Класс, представляющий собой структурную ячейку класса Chessboard | Cell |
Класс служит для представления шахматной доски | Chessboard |
Figure – абстрактный класс для описания фигуры, в определяются ее цвет, метод его установки и получения:
class Figure
{
protected:
std::string _sColor; // figure's color
public:
std::string GetColor( ); // Method for receiving figure's color
void SetColor( std::string sColor ); // Method for set figure's color
//
// abstract method for check if move is correct
//
virtual bool CheckMove( Cell& currentCell, Cell& nextCell ) = 0;
//
// abstract method for draw figure
//
virtual void Draw( int material ) = 0;
};
Cell – класс, представляющий собой структурную ячейку класса Chessboard
class Cell
{
Figure* _figure; // pointer to figure object
Pos _cPos; // cell's position
public:
Cell( int x, int y, Figure* figure ); // constructor with parameters
Cell( ); // default constructor
~Cell( ); // destructor
Pos GetPos( ); // method for receiving cell's position
Figure* GetFigure( ); // method for receiving figure's pointer
void SetPos( Pos& cPos ); // method for set cell's position ( Pos& )
void SetPos( int x, int y ); // method for set cell's position ( int, int )
void SetFigure( Figure* figure ); // method for set figure
bool MoveFigure( Cell& nextCell ); // method for move figure to next cell
bool IsEmpty( ); // method for check is cell is empty
std::string GetColor( ); // method for receiving figure's color
void Draw( int material ); // method for draw cell
};
Chessboard – класс служит для представления шахматной доски
class Chessboard
{
Figure* _WhitePawns;
Figure* _BlackPawns;
Figure* _WhiteKing;
Figure* _BlackKing;
Figure* _WhiteHorses;
Figure* _BlackHorses; // Figure pointers
Figure* _WhiteRooks;
Figure* _BlackRooks;
Figure* _WhiteBishops;
Figure* _BlackBishops;
Figure* _WhiteQueen;
Figure* _BlackQueen;
Cell _board[MAX_CELL_NUMBER][MAX_CELL_NUMBER]; // Matrix of cell object
int _iTurnCount; // int variable to choose player's turn
int _currentX; // int variable that mark on current cell
int _currentY; // int variable that mark on current cell
int _chosenX;
int _chosenY;
int _chosenNextX; // variables for making player's move
int _chosenNextY;
bool _isChosen;
public:
Chessboard( ); // constructor
~Chessboard( ); // destructor
void Move( int x, int y, int nx, int ny ); // method for move figure
// method for draw chessboard
void Draw( D3DXMATRIX g_Matrix, IDirect3DDevice9* g_pDevice );
void IncX( ); // method for increase current X coordinate
void IncY( ); // method for increase current Y coordinate
void DecX( ); // method for decrease current X coordinate
void DecY( ); // method for decrease current Y coordinate
int GetCurrentX( ); // method for receiving current X coordinate
int GetCurrentY( ); // method for receiving current Y coordinate
void SetChosenX( int x ); // method for set chosen X coordinate
void SetChosenY( int y ); // method for set chosen Y coordinate
void SetChosenNextX( int nx ); // method for set next chosen X coordinate
void SetChosenNextY( int ny ); // method for set next chosen Y coordinate
void SetChosenFlag( bool flag ); // method for set flag of chosen cell
bool GetChosenFlag( ); // method for receiving flag of chosen cell
int GetChosenX( ); // method for receiving chosen X coordinate
int GetChosenY( ); // method for receiving chosen Y coordinate
int GetChosenNextX( ); // method for receiving next chosen X coordinate
int GetChosenNextY( ); // method for receiving next chosen Y coordinate
int GetTurnCount( ); // method for receiving turn count
//
// method for check is striaght line is empty
//
bool CheckStraightLine( Cell& currentCell, Cell& nextCell );
//
// method for check is diagonal line is empty
//
bool CheckDiagLine( Cell& currentCell, Cell& nextCell );
};
БЛОК-СХЕМА АЛГОРИТМА
6.1 Метод bool MoveFigure( Cell& nextCell ) класса Cell –метод перемещает фигуру с текущей клетку на nextCell клетку
6.2 Функция int EnterMsgLoop( bool ( *ptr_display ) ( float timeDelta ) ) –функция отображения игрового мира
АЛГОРИТМЫ ПО ШАГАМ
7.1 Метод void Draw(D3DXMATRIX g_Matrix, IDirect3DDevice9* g_pDevice) класса Chessboard –метод визуализации шахматной доски:
1. Начало.
2. Входные данные:
_board – массив клеток;
_currentX – Х-координата клетки, на которую установлен курсор;
_currentY – Y-координата клетки, на которую установлен курсор;
Выходные данные:
_board – массив клеток;
3. Вызов метода очистки экрана Clear() из интерфейса IDirect3DDevice9.
4. Вызов метода начала сцены BeginScene() из интерфейса IDirect3DDevice9.
5. Цикл с параметром y по вертикальному ряду шахматной доски.
5.1. Цикл с параметром x по горизонтальному ряду шахматной доски.
5.1.1. Вызов функции D3DXMatrixTranslation() для создания матрицы преобразования в g_Matrix.
5.1.2. Вызов метода SetTransform() из интерфейса IDirect3DDevice9 для установки мировой матрицы с параметрами g_Matrix.
5.1.3. Если _board[x][y] не содержит фигуры, то
5.1.3.1. Если x = _currentX и y = _currentY, то
5.1.3.1.1. Вызываем метод Draw() для клетки, устанавливаем зеленый цвет.
5.1.3.2. Иначе если x – четное число, то
5.1.3.2.1. Если y – четное число, то
5.1.3.2.1.1. Вызываем метод Draw() для клетки, устанавливаем белый цвет.
5.1.3.2.2. Иначе
5.1.3.2.2.1. Вызываем метод Draw() для клетки, устанавливаем черный цвет.
5.1.3.3. Иначе
5.1.3.3.1. Если y – четное число, то
5.1.3.3.1.1. Вызываем метод Draw() для клетки, устанавливаем черный цвет.
5.1.3.3.2. Иначе
5.1.3.3.2.1. Вызываем метод Draw() для клетки, устанавливаем белый цвет.
5.1.4. Иначе
5.1.4.1. Если x = _currentX и y = _currentY, то
5.1.4.1.1. Вызываем метод Draw для фигуры на клетке, устанавливаем зеленый цвет.
5.1.4.2. Иначе если фигура на клетке белая, то
5.1.4.2.1. Вызываем метод Draw для фигуры на клетке, устанавливаем желтый цвет.
5.1.4.3. Иначе если фигура на клетке черная, то
5.1.4.3.1. Вызываем метод Draw для фигуры на клетке, устанавливаем синий цвет.
5.2. Конец цикла с параметром x.
6. Конец цикла с параметром у.
7. Вызов метода конца сцены EndScene() из интерфейса IDirect3DDevice9.
8. Вызов метода отображения вторичного буфера Present() из интерфейса IDirect3DDevice9.
9. Конец.
7.2 Метод bool CheckMove(Cell& currentCell, Cell& nextCell) класса Rook –проверка правильности хода ладьи:
1. Начало.
2. Входные данные:
currentCell – ссылка на текущую клетку;
nextCell – ссылка на следующую клетку;
Промежуточные данные:
nextPos – координаты клетки nextCell;
currentPos – координаты клетки currentCell;
Выходные данные:
currentCell – ссылка на текущую клетку;
nextCell – ссылка на следующую клетку;
3. Если nextPos._x = currentPos._x и nextPos._y = currentPos._y, то
3.1. Генерация исключения BadMove().
4. Если nextPos._x != currentPos._x и nextPos._y != currentPos._y, то
4.1. Генерация исключения BadMove().
5. Если следующая клетка содержит фигуру, то
5.1. Если цвет фигуры на текущей клетке совпадает с цветом фигуры на следующей клетке, то
5.1.1. Генерация исключения FriendlyFire().
6. Возврат истинного значения.
7. Конец.