Добавил:
Рад, если кому-то помог Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
0
Добавлен:
01.11.2025
Размер:
4.01 Кб
Скачать
#include <iostream>
#include <string>
#include <map>
#include <stdexcept>
#include <clocale>
#include <locale>
using namespace std;

enum class Color { White, Black };

class ChessBoard {
private:
    map<string, pair<string, Color>> board;

    bool isValidSquare(const string& pos) {
        return pos.length() == 2 &&
               pos[0] >= 'a' && pos[0] <= 'h' &&
               pos[1] >= '1' && pos[1] <= '8';
    }

    bool isWhiteSquare(const string& pos) {
        return (pos[0] - 'a' + pos[1] - '1') % 2 == 0;
    }

public:
    ChessBoard() {
        // Пример начальной расстановки
        board["a1"] = {"Ладья", Color::White};
        board["b1"] = {"Конь", Color::White};
        board["c1"] = {"Слон", Color::White};
        board["a8"] = {"Ладья", Color::Black};
        board["c8"] = {"Слон", Color::Black};
        
        // Проверка в конструкторе: чёрный слон не на белой клетке
        for (const auto& sq : board) {
            string pos = sq.first;
            auto piece = sq.second;
            if (piece.first == "Слон" && piece.second == Color::Black && isWhiteSquare(pos))
                throw "Чёрный слон не может находиться на белой клетке.";
        }
    }

    void step(const string& piece, Color color, const string& to) {
        if (!isValidSquare(to))
            throw "Некорректная клетка.";

        // Проверка для слона
        if (piece == "Слон") {
            if (color == Color::Black && isWhiteSquare(to))
                throw "Чёрный слон не может переместиться на белую клетку.";
            if (color == Color::White && !isWhiteSquare(to))
                throw "Белый слон не может переместиться на чёрную клетку.";
        }

        // Проверка для пешки (пример)
        if (piece == "Пешка") {
            if (color == Color::White && to[1] <= '1')
                throw "Белая пешка не может переместиться на 1-ю горизонталь.";
            if (color == Color::Black && to[1] >= '8')
                throw "Чёрная пешка не может переместиться на 8-ю горизонталь.";
        }

        // Проверка для короля (дополнительная проверка)
        if (piece == "Король") {
            // Проверка хода больше чем на 1 клетку
            cout << "Король делает ход на " << to << endl;
        }

        cout << piece << " перемещена на " << to << endl;
    }
};

int main() {
    setlocale(LC_ALL, "ru_RU.UTF-8");
    locale::global(locale("ru_RU.UTF-8"));
    wcout.imbue(locale("ru_RU.UTF-8"));
    cout.imbue(locale("ru_RU.UTF-8"));
    
    try {
        ChessBoard cb;
        
        // Тестовые примеры
        cout << "=== Тест 1: Чёрный слон на чёрную клетку ===" << endl;
        cb.step("Слон", Color::Black, "b3"); // b3 - чёрная клетка
        
        cout << "\n=== Тест 2: Чёрный слон на белую клетку ===" << endl;
        cb.step("Слон", Color::Black, "a3"); // a3 - белая клетка (ошибка)
        
    }
    catch (const char* msg) {
        cerr << "Ошибка: " << msg << endl;
    }
    
    try {
        ChessBoard cb2;
        cout << "\n=== Тест 3: Пешка на некорректную горизонталь ===" << endl;
        cb2.step("Пешка", Color::White, "a1"); // ошибка для пешки
    }
    catch (const char* msg) {
        cerr << "Ошибка: " << msg << endl;
    }
    
    return 0;
}
Соседние файлы в папке Лаба7