Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Подключаем библиотеку SFML
- #include <SFML/Graphics.hpp>
- // Объявляем константы для размеров окна и доски
- const int WINDOW_WIDTH = 800;
- const int WINDOW_HEIGHT = 800;
- const int BOARD_SIZE = 8;
- enum PieceType {
- PAWN, // Пешка
- ROOK, // Ладья
- KNIGHT, // Конь
- BISHOP, // Слон
- QUEEN, // Ферзь
- KING // Король
- };
- // Создаем класс Piece для представления фигуры
- class Piece {
- // Приватные поля класса
- protected:
- // Координаты фигуры на доске
- int x;
- int y;
- // Цвет фигуры (белый или черный)
- sf::Color color;
- // Тип фигуры (пешка, ладья и т.д.)
- PieceType type;
- // Текстура для отрисовки фигуры
- sf::Texture texture;
- // Спрайт для отрисовки фигуры
- sf::Sprite sprite;
- // Публичные методы класса
- public:
- // Конструктор класса, принимает координаты, цвет и тип фигуры
- Piece(int x, int y, sf::Color color, PieceType type) {
- // Инициализируем поля класса
- this->x = x;
- this->y = y;
- this->color = color;
- this->type = type;
- sf::Color white = sf::Color(235, 236, 238);
- sf::Color black = sf::Color(119, 149, 86);
- // Вычисляем размер одной фигуры
- int piece_size = WINDOW_WIDTH / BOARD_SIZE;
- // Устанавливаем позицию спрайта
- sprite.setPosition(x * piece_size, y * piece_size);
- }
- // Метод для отрисовки фигуры в окне
- void draw(sf::RenderWindow& window) {
- // Рисуем спрайт в окне
- window.draw(sprite);
- }
- };
- class Pawn : public Piece {
- public:
- Pawn(int x, int y, sf::Color color) : Piece(x, y, color, PAWN) {
- sf::Color white = sf::Color(235, 236, 238);
- sf::Color black = sf::Color(119, 149, 86);
- if (color == black) {
- this->texture.loadFromFile("sprites\\bp.png");
- }
- else this->texture.loadFromFile("sprites\\wp.png");
- this->sprite.setTexture(texture);
- }
- };
- class Rook : public Piece {
- public:
- Rook(int x, int y, sf::Color color) : Piece(x, y, color, ROOK) {
- sf::Color white = sf::Color(235, 236, 238);
- sf::Color black = sf::Color(119, 149, 86);
- if (color == black) {
- this->texture.loadFromFile("sprites\\br.png");
- }
- else this->texture.loadFromFile("sprites\\wr.png");
- this->sprite.setTexture(texture);
- }
- };
- class Knight: public Piece {
- public:
- Knight(int x, int y, sf::Color color) : Piece(x, y, color, KNIGHT) {
- sf::Color white = sf::Color(235, 236, 238);
- sf::Color black = sf::Color(119, 149, 86);
- if (color == black) {
- this->texture.loadFromFile("sprites\\bn.png");
- }
- else this->texture.loadFromFile("sprites\\wn.png");
- this->sprite.setTexture(texture);
- }
- };
- class Bishop : public Piece {
- public:
- Bishop(int x, int y, sf::Color color) : Piece(x, y, color, BISHOP) {
- sf::Color white = sf::Color(235, 236, 238);
- sf::Color black = sf::Color(119, 149, 86);
- if (color == black) {
- this->texture.loadFromFile("sprites\\bb.png");
- }
- else this->texture.loadFromFile("sprites\\wb.png");
- this->sprite.setTexture(texture);
- }
- };
- class Queen : public Piece {
- public:
- Queen(int x, int y, sf::Color color) : Piece(x, y, color, QUEEN) {
- sf::Color white = sf::Color(235, 236, 238);
- sf::Color black = sf::Color(119, 149, 86);
- if (color == black) {
- this->texture.loadFromFile("sprites\\bq.png");
- }
- else this->texture.loadFromFile("sprites\\wq.png");
- this->sprite.setTexture(texture);
- }
- };
- class King : public Piece {
- public:
- King(int x, int y, sf::Color color) : Piece(x, y, color, KING) {
- sf::Color white = sf::Color(235, 236, 238);
- sf::Color black = sf::Color(119, 149, 86);
- if (color == black) {
- this->texture.loadFromFile("sprites\\bk.png");
- }
- else this->texture.loadFromFile("sprites\\wk.png");
- this->sprite.setTexture(texture);
- }
- };
- // Создаем класс Cell для представления клетки доски
- class Cell {
- // Приватные поля класса
- private:
- // Координаты клетки на доске
- int x;
- int y;
- // Цвет клетки (белый или черный)
- sf::Color color;
- // Прямоугольник для отрисовки клетки
- sf::RectangleShape rect;
- // Указатель на фигуру, которая стоит на клетке (NULL, если нет фигуры)
- Piece* piece;
- // Публичные методы класса
- public:
- // Конструктор класса, принимает координаты и цвет клетки
- Cell(int x, int y, sf::Color color) {
- // Инициализируем поля класса
- this->x = x;
- this->y = y;
- this->color = color;
- this->piece = NULL; // По умолчанию нет фигуры на клетке
- // Вычисляем размер одной клетки
- int cell_size = WINDOW_WIDTH / BOARD_SIZE;
- // Устанавливаем размер и позицию прямоугольника
- rect.setSize(sf::Vector2f(cell_size, cell_size));
- rect.setPosition(x * cell_size, y * cell_size);
- // Устанавливаем цвет прямоугольника
- rect.setFillColor(color);
- }
- // Метод для установки фигуры на клетку
- void set_piece(Piece* piece) {
- // Присваиваем указатель на фигуру полю класса
- this->piece = piece;
- }
- // Метод для отрисовки клетки в окне
- void draw(sf::RenderWindow& window) {
- // Рисуем прямоугольник в окне
- window.draw(rect);
- // Если есть фигура на клетке, то рисуем ее в окне
- if (piece != NULL) {
- piece->draw(window);
- }
- }
- };
- // Создаем класс Board для представления шахматной доски
- class Board {
- // Приватные поля класса
- private:
- // Двумерный массив из клеток доски
- Cell* cells[BOARD_SIZE][BOARD_SIZE];
- // Публичные методы класса
- public:
- // Конструктор класса, не принимает параметров
- Board() {
- // Цвета для белых и черных клеток и фигур
- sf::Color white = sf::Color(235, 236, 238);
- sf::Color black = sf::Color(119, 149, 86);
- // Переменная для хранения текущего цвета клетки
- sf::Color current_color = white;
- // Цикл по строкам доски
- for (int i = 0; i < BOARD_SIZE; i++) {
- // Цикл по столбцам доски
- for (int j = 0; j < BOARD_SIZE; j++) {
- // Создаем новую клетку с текущим цветом и координатами
- cells[i][j] = new Cell(i, j, current_color);
- // Меняем текущий цвет на противоположный
- current_color = (current_color == white) ? black : white;
- }
- // Меняем текущий цвет на противоположный в начале новой строки
- current_color = (current_color == white) ? black : white;
- }
- // Создаём чёрные и белые пешки
- for (int i = 0; i < BOARD_SIZE; i++) {
- cells[i][1]->set_piece(new Pawn(i, 1, black));
- cells[i][6]->set_piece(new Pawn(i, 6, white));
- }
- // Создаём чёрные и белые лодьи
- cells[0][0]->set_piece(new Rook(0, 0, black));
- cells[7][0]->set_piece(new Rook(7, 0, black));
- cells[0][7]->set_piece(new Rook(0, 7, white));
- cells[7][7]->set_piece(new Rook(7, 7, white));
- // Создаём чёрных и белых коней
- cells[1][0]->set_piece(new Knight(1, 0, black));
- cells[6][0]->set_piece(new Knight(6, 0, black));
- cells[1][7]->set_piece(new Knight(1, 7, white));
- cells[6][7]->set_piece(new Knight(6, 7, white));
- // Создаём чёрных и белых слонов
- cells[2][0]->set_piece(new Bishop(2, 0, black));
- cells[5][0]->set_piece(new Bishop(5, 0, black));
- cells[2][7]->set_piece(new Bishop(2, 7, white));
- cells[5][7]->set_piece(new Bishop(5, 7, white));
- // Создаём чёрного и белого ферзя
- cells[3][0]->set_piece(new Queen(3, 0, black));
- cells[3][7]->set_piece(new Queen(3, 7, white));
- // Создаём чёрного и белого короля
- cells[4][0]->set_piece(new King(4, 0, black));
- cells[4][7]->set_piece(new King(4, 7, white));
- }
- // Метод для отрисовки доски в окне
- void draw(sf::RenderWindow& window) {
- // Цикл по строкам доски
- for (int i = 0; i < BOARD_SIZE; i++) {
- // Цикл по столбцам доски
- for (int j = 0; j < BOARD_SIZE; j++) {
- // Отрисовываем клетку в окне
- cells[i][j]->draw(window);
- }
- }
- }
- };
- // Главная функция программы
- int main() {
- // Создаем объект окна с заданными размерами и заголовком
- sf::RenderWindow window(sf::VideoMode(WINDOW_WIDTH, WINDOW_HEIGHT), "Chess Board");
- // Создаем объект доски
- Board board;
- // Главный цикл программы
- while (window.isOpen()) {
- // Обрабатываем события окна
- sf::Event event;
- while (window.pollEvent(event)) {
- // Если событие - закрытие окна, то закрываем окно
- if (event.type == sf::Event::Closed) {
- window.close();
- }
- }
- // Очищаем окно
- window.clear();
- // Отрисовываем доску в окне
- board.draw(window);
- // Обновляем окно
- window.display();
- }
- // Завершаем программу
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement