Advertisement
silicogel

Untitled

Oct 12th, 2023
615
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.09 KB | None | 0 0
  1. // Подключаем библиотеку SFML
  2. #include <SFML/Graphics.hpp>
  3.  
  4. // Объявляем константы для размеров окна и доски
  5. const int WINDOW_WIDTH = 800;
  6. const int WINDOW_HEIGHT = 800;
  7. const int BOARD_SIZE = 8;
  8.  
  9. enum PieceType {
  10.     PAWN, // Пешка
  11.     ROOK, // Ладья
  12.     KNIGHT, // Конь
  13.     BISHOP, // Слон
  14.     QUEEN, // Ферзь
  15.     KING // Король
  16. };
  17.  
  18. // Создаем класс Piece для представления фигуры
  19. class Piece {
  20.     // Приватные поля класса
  21. protected:
  22.     // Координаты фигуры на доске
  23.     int x;
  24.     int y;
  25.     // Цвет фигуры (белый или черный)
  26.     sf::Color color;
  27.     // Тип фигуры (пешка, ладья и т.д.)
  28.     PieceType type;
  29.     // Текстура для отрисовки фигуры
  30.     sf::Texture texture;
  31.     // Спрайт для отрисовки фигуры
  32.     sf::Sprite sprite;
  33.     // Публичные методы класса
  34. public:
  35.     // Конструктор класса, принимает координаты, цвет и тип фигуры
  36.     Piece(int x, int y, sf::Color color, PieceType type) {
  37.         // Инициализируем поля класса
  38.         this->x = x;
  39.         this->y = y;
  40.         this->color = color;
  41.         this->type = type;
  42.  
  43.         sf::Color white = sf::Color(235, 236, 238);
  44.         sf::Color black = sf::Color(119, 149, 86);
  45.  
  46.         // Вычисляем размер одной фигуры
  47.         int piece_size = WINDOW_WIDTH / BOARD_SIZE;
  48.         // Устанавливаем позицию спрайта
  49.         sprite.setPosition(x * piece_size, y * piece_size);
  50.     }
  51.     // Метод для отрисовки фигуры в окне
  52.     void draw(sf::RenderWindow& window) {
  53.         // Рисуем спрайт в окне
  54.         window.draw(sprite);
  55.     }
  56. };
  57.  
  58. class Pawn : public Piece {
  59. public:
  60.     Pawn(int x, int y, sf::Color color) : Piece(x, y, color, PAWN) {
  61.         sf::Color white = sf::Color(235, 236, 238);
  62.         sf::Color black = sf::Color(119, 149, 86);
  63.  
  64.         if (color == black) {
  65.             this->texture.loadFromFile("sprites\\bp.png");
  66.         }
  67.         else this->texture.loadFromFile("sprites\\wp.png");
  68.  
  69.         this->sprite.setTexture(texture);
  70.     }
  71. };
  72.  
  73. class Rook : public Piece {
  74. public:
  75.     Rook(int x, int y, sf::Color color) : Piece(x, y, color, ROOK) {
  76.         sf::Color white = sf::Color(235, 236, 238);
  77.         sf::Color black = sf::Color(119, 149, 86);
  78.  
  79.         if (color == black) {
  80.             this->texture.loadFromFile("sprites\\br.png");
  81.         }
  82.         else this->texture.loadFromFile("sprites\\wr.png");
  83.  
  84.         this->sprite.setTexture(texture);
  85.     }
  86. };
  87.  
  88. class Knight: public Piece {
  89. public:
  90.     Knight(int x, int y, sf::Color color) : Piece(x, y, color, KNIGHT) {
  91.         sf::Color white = sf::Color(235, 236, 238);
  92.         sf::Color black = sf::Color(119, 149, 86);
  93.  
  94.         if (color == black) {
  95.             this->texture.loadFromFile("sprites\\bn.png");
  96.         }
  97.         else this->texture.loadFromFile("sprites\\wn.png");
  98.  
  99.         this->sprite.setTexture(texture);
  100.     }
  101. };
  102.  
  103. class Bishop : public Piece {
  104. public:
  105.     Bishop(int x, int y, sf::Color color) : Piece(x, y, color, BISHOP) {
  106.         sf::Color white = sf::Color(235, 236, 238);
  107.         sf::Color black = sf::Color(119, 149, 86);
  108.  
  109.         if (color == black) {
  110.             this->texture.loadFromFile("sprites\\bb.png");
  111.         }
  112.         else this->texture.loadFromFile("sprites\\wb.png");
  113.  
  114.         this->sprite.setTexture(texture);
  115.     }
  116. };
  117.  
  118. class Queen : public Piece {
  119. public:
  120.     Queen(int x, int y, sf::Color color) : Piece(x, y, color, QUEEN) {
  121.         sf::Color white = sf::Color(235, 236, 238);
  122.         sf::Color black = sf::Color(119, 149, 86);
  123.  
  124.         if (color == black) {
  125.             this->texture.loadFromFile("sprites\\bq.png");
  126.         }
  127.         else this->texture.loadFromFile("sprites\\wq.png");
  128.  
  129.         this->sprite.setTexture(texture);
  130.     }
  131. };
  132.  
  133. class King : public Piece {
  134. public:
  135.     King(int x, int y, sf::Color color) : Piece(x, y, color, KING) {
  136.         sf::Color white = sf::Color(235, 236, 238);
  137.         sf::Color black = sf::Color(119, 149, 86);
  138.  
  139.         if (color == black) {
  140.             this->texture.loadFromFile("sprites\\bk.png");
  141.         }
  142.         else this->texture.loadFromFile("sprites\\wk.png");
  143.  
  144.         this->sprite.setTexture(texture);
  145.     }
  146. };
  147.  
  148. // Создаем класс Cell для представления клетки доски
  149. class Cell {
  150.     // Приватные поля класса
  151. private:
  152.     // Координаты клетки на доске
  153.     int x;
  154.     int y;
  155.     // Цвет клетки (белый или черный)
  156.     sf::Color color;
  157.     // Прямоугольник для отрисовки клетки
  158.     sf::RectangleShape rect;
  159.     // Указатель на фигуру, которая стоит на клетке (NULL, если нет фигуры)
  160.     Piece* piece;
  161.     // Публичные методы класса
  162. public:
  163.     // Конструктор класса, принимает координаты и цвет клетки
  164.     Cell(int x, int y, sf::Color color) {
  165.         // Инициализируем поля класса
  166.         this->x = x;
  167.         this->y = y;
  168.         this->color = color;
  169.         this->piece = NULL; // По умолчанию нет фигуры на клетке
  170.         // Вычисляем размер одной клетки
  171.         int cell_size = WINDOW_WIDTH / BOARD_SIZE;
  172.         // Устанавливаем размер и позицию прямоугольника
  173.         rect.setSize(sf::Vector2f(cell_size, cell_size));
  174.         rect.setPosition(x * cell_size, y * cell_size);
  175.         // Устанавливаем цвет прямоугольника
  176.         rect.setFillColor(color);
  177.     }
  178.     // Метод для установки фигуры на клетку
  179.     void set_piece(Piece* piece) {
  180.         // Присваиваем указатель на фигуру полю класса
  181.         this->piece = piece;
  182.     }
  183.     // Метод для отрисовки клетки в окне
  184.     void draw(sf::RenderWindow& window) {
  185.         // Рисуем прямоугольник в окне
  186.         window.draw(rect);
  187.         // Если есть фигура на клетке, то рисуем ее в окне
  188.         if (piece != NULL) {
  189.             piece->draw(window);
  190.         }
  191.     }
  192. };
  193.  
  194. // Создаем класс Board для представления шахматной доски
  195. class Board {
  196.     // Приватные поля класса
  197. private:
  198.     // Двумерный массив из клеток доски
  199.     Cell* cells[BOARD_SIZE][BOARD_SIZE];
  200.     // Публичные методы класса
  201. public:
  202.     // Конструктор класса, не принимает параметров
  203.     Board() {
  204.         // Цвета для белых и черных клеток и фигур
  205.         sf::Color white = sf::Color(235, 236, 238);
  206.         sf::Color black = sf::Color(119, 149, 86);
  207.         // Переменная для хранения текущего цвета клетки
  208.         sf::Color current_color = white;
  209.         // Цикл по строкам доски
  210.         for (int i = 0; i < BOARD_SIZE; i++) {
  211.             // Цикл по столбцам доски
  212.             for (int j = 0; j < BOARD_SIZE; j++) {
  213.                 // Создаем новую клетку с текущим цветом и координатами
  214.                 cells[i][j] = new Cell(i, j, current_color);
  215.                 // Меняем текущий цвет на противоположный
  216.                 current_color = (current_color == white) ? black : white;
  217.             }
  218.             // Меняем текущий цвет на противоположный в начале новой строки
  219.             current_color = (current_color == white) ? black : white;
  220.         }
  221.  
  222.         // Создаём чёрные и белые пешки
  223.         for (int i = 0; i < BOARD_SIZE; i++) {
  224.             cells[i][1]->set_piece(new Pawn(i, 1, black));
  225.             cells[i][6]->set_piece(new Pawn(i, 6, white));
  226.         }
  227.  
  228.         // Создаём чёрные и белые лодьи
  229.         cells[0][0]->set_piece(new Rook(0, 0, black));
  230.         cells[7][0]->set_piece(new Rook(7, 0, black));
  231.  
  232.         cells[0][7]->set_piece(new Rook(0, 7, white));
  233.         cells[7][7]->set_piece(new Rook(7, 7, white));
  234.  
  235.         // Создаём чёрных и белых коней
  236.         cells[1][0]->set_piece(new Knight(1, 0, black));
  237.         cells[6][0]->set_piece(new Knight(6, 0, black));
  238.  
  239.         cells[1][7]->set_piece(new Knight(1, 7, white));
  240.         cells[6][7]->set_piece(new Knight(6, 7, white));
  241.  
  242.         // Создаём чёрных и белых слонов
  243.         cells[2][0]->set_piece(new Bishop(2, 0, black));
  244.         cells[5][0]->set_piece(new Bishop(5, 0, black));
  245.  
  246.         cells[2][7]->set_piece(new Bishop(2, 7, white));
  247.         cells[5][7]->set_piece(new Bishop(5, 7, white));
  248.  
  249.         // Создаём чёрного и белого ферзя
  250.         cells[3][0]->set_piece(new Queen(3, 0, black));
  251.         cells[3][7]->set_piece(new Queen(3, 7, white));
  252.  
  253.         // Создаём чёрного и белого короля
  254.         cells[4][0]->set_piece(new King(4, 0, black));
  255.         cells[4][7]->set_piece(new King(4, 7, white));
  256.  
  257.        
  258.     }
  259.     // Метод для отрисовки доски в окне
  260.     void draw(sf::RenderWindow& window) {
  261.         // Цикл по строкам доски
  262.         for (int i = 0; i < BOARD_SIZE; i++) {
  263.             // Цикл по столбцам доски
  264.             for (int j = 0; j < BOARD_SIZE; j++) {
  265.                 // Отрисовываем клетку в окне
  266.                 cells[i][j]->draw(window);
  267.             }
  268.         }
  269.     }
  270. };
  271.  
  272. // Главная функция программы
  273. int main() {
  274.     // Создаем объект окна с заданными размерами и заголовком
  275.     sf::RenderWindow window(sf::VideoMode(WINDOW_WIDTH, WINDOW_HEIGHT), "Chess Board");
  276.     // Создаем объект доски
  277.     Board board;
  278.     // Главный цикл программы
  279.     while (window.isOpen()) {
  280.         // Обрабатываем события окна
  281.         sf::Event event;
  282.         while (window.pollEvent(event)) {
  283.             // Если событие - закрытие окна, то закрываем окно
  284.             if (event.type == sf::Event::Closed) {
  285.                 window.close();
  286.             }
  287.         }
  288.         // Очищаем окно
  289.         window.clear();
  290.         // Отрисовываем доску в окне
  291.         board.draw(window);
  292.         // Обновляем окно
  293.         window.display();
  294.     }
  295.     // Завершаем программу
  296.     return 0;
  297. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement