вторник, 30 июня 2026 г.

Sdl corners

 #include <SDL2/SDL.h>

#include <iostream>

#include <vector>

#include <cmath>


// Размеры

const int CELL_SIZE = 64;

const int BOARD_SIZE = 8;

const int WINDOW_WIDTH = CELL_SIZE * BOARD_SIZE;

const int WINDOW_HEIGHT = CELL_SIZE * BOARD_SIZE;


// Цвета (SDL_RGBA)

SDL_Color COLOR_WHITE = {255, 255, 255, 255};

SDL_Color COLOR_BLACK = {0, 0, 0, 255};

SDL_Color COLOR_BOARD_LIGHT = {240, 217, 181, 255};

SDL_Color COLOR_BOARD_DARK = {181, 136, 99, 255};

SDL_Color COLOR_SELECTED = {100, 200, 255, 150};


// Типы фигур

enum PieceType { NONE, WHITE, BLACK };


struct Position {

    int row;

    int col;

    bool operator==(const Position& other) const {

        return row == other.row && col == other.col;

    }

};


// Класс игры

class Game {

public:

    std::vector<std::vector<PieceType>> board;

    PieceType currentPlayer;

    Position selectedPiece;

    bool pieceSelected;


    Game() {

        board.resize(BOARD_SIZE, std::vector<PieceType>(BOARD_SIZE, NONE));

        currentPlayer = WHITE;

        pieceSelected = false;

        selectedPiece = {-1, -1};

        

        // Расстановка фигур (как в шахматах, но только пешки и ладьи для примера)

        // Белые внизу (строки 6-7)

        for (int c = 0; c < BOARD_SIZE; c++) {

            board[6][c] = WHITE; // Верхний ряд белых

            board[7][c] = WHITE; // Нижний ряд белых

        }

        // Черные вверху (строки 0-1)

        for (int c = 0; c < BOARD_SIZE; c++) {

            board[0][c] = BLACK; 

            board[1][c] = BLACK;

        }

    }


    bool isInsideBoard(int r, int c) {

        return r >= 0 && r < BOARD_SIZE && c >= 0 && c < BOARD_SIZE;

    }


    bool makeMove(Position from, Position to) {

        if (board[from.row][from.col] != currentPlayer) return false;

        if (board[to.row][to.col] != NONE) return false;


        int dr = std::abs(to.row - from.row);

        int dc = std::abs(to.col - from.col);


        // Проверка правил

        if (dr == 1 && dc == 1) {

            // Обычный ход по диагонали

            board[to.row][to.col] = currentPlayer;

            board[from.row][from.col] = NONE;

            return true;

        } 

        else if (dr == 2 && dc == 2) {

            // Прыжок через фигуру

            int midRow = (from.row + to.row) / 2;

            int midCol = (from.col + to.col) / 2;

            if (board[midRow][midCol] != NONE && board[midRow][midCol] != currentPlayer) {

                board[to.row][to.col] = currentPlayer;

                board[from.row][from.col] = NONE;

                board[midRow][midCol] = NONE; // Съедаем фигуру

                return true;

            }

        }

        return false;

    }


    void switchTurn() {

        currentPlayer = (currentPlayer == WHITE) ? BLACK : WHITE;

    }

};


// Функции отрисовки

void drawBoard(SDL_Renderer* renderer) {

    for (int r = 0; r < BOARD_SIZE; r++) {

        for (int c = 0; c < BOARD_SIZE; c++) {

            SDL_Rect rect = {c * CELL_SIZE, r * CELL_SIZE, CELL_SIZE, CELL_SIZE};

            if ((r + c) % 2 == 0) {

                SDL_SetRenderDrawColor(renderer, COLOR_BOARD_LIGHT.r, COLOR_BOARD_LIGHT.g, COLOR_BOARD_LIGHT.b, 255);

            } else {

                SDL_SetRenderDrawColor(renderer, COLOR_BOARD_DARK.r, COLOR_BOARD_DARK.g, COLOR_BOARD_DARK.b, 255);

            }

            SDL_RenderFillRect(renderer, &rect);

        }

    }

}


void drawPieces(SDL_Renderer* renderer, Game& game) {

    for (int r = 0; r < BOARD_SIZE; r++) {

        for (int c = 0; c < BOARD_SIZE; c++) {

            if (game.board[r][c] == NONE) continue;


            SDL_Rect rect = {c * CELL_SIZE + 8, r * CELL_SIZE + 8, CELL_SIZE - 16, CELL_SIZE - 16};

            

            // Выбор цвета фигуры

            if (game.board[r][c] == WHITE) {

                SDL_SetRenderDrawColor(renderer, COLOR_WHITE.r, COLOR_WHITE.g, COLOR_WHITE.b, 255);

            } else {

                SDL_SetRenderDrawColor(renderer, COLOR_BLACK.r, COLOR_BLACK.g, COLOR_BLACK.b, 255);

            }

            

            // Рисуем круг (используем многоугольник для простоты или можно использовать SDL_RenderDrawPoint, но это медленно)

            // Для простоты рисуем квадрат со скругленными углами, но в SDL2 нет встроенной функции круга.

            // Нарисуем эллипс вручную (или просто квадрат для скорости).

            // Давайте нарисуем круг через серию точек.

            int cx = rect.x + rect.w/2;

            int cy = rect.y + rect.h/2;

            int radius = rect.w/2 - 2;

            

            for (int w = 0; w < radius * 2; w++) {

                for (int h = 0; h < radius * 2; h++) {

                    int dx = radius - w;

                    int dy = radius - h;

                    if ((dx*dx + dy*dy) <= (radius * radius)) {

                        SDL_RenderDrawPoint(renderer, cx + dx, cy + dy);

                    }

                }

            }

            

            // Если фигура выбрана, обводим её

            if (game.pieceSelected && game.selectedPiece.row == r && game.selectedPiece.col == c) {

                SDL_SetRenderDrawColor(renderer, COLOR_SELECTED.r, COLOR_SELECTED.g, COLOR_SELECTED.b, 255);

                SDL_Rect outline = {rect.x - 2, rect.y - 2, rect.w + 4, rect.h + 4};

                SDL_RenderDrawRect(renderer, &outline);

            }

        }

    }

}


int main(int argc, char* argv[]) {

    if (SDL_Init(SDL_INIT_VIDEO) != 0) {

        std::cerr << "SDL Init Error: " << SDL_GetError() << std::endl;

        return 1;

    }


    SDL_Window* window = SDL_CreateWindow("Уголки (Corners)", 

                                          SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,

                                          WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_SHOWN);

    if (!window) {

        std::cerr << "Window Error: " << SDL_GetError() << std::endl;

        SDL_Quit();

        return 1;

    }


    SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);

    if (!renderer) {

        std::cerr << "Renderer Error: " << SDL_GetError() << std::endl;

        SDL_DestroyWindow(window);

        SDL_Quit();

        return 1;

    }


    Game game;

    bool running = true;

    SDL_Event event;


    while (running) {

        while (SDL_PollEvent(&event)) {

            if (event.type == SDL_QUIT) {

                running = false;

            }

            else if (event.type == SDL_MOUSEBUTTONDOWN) {

                int mouseX = event.button.x;

                int mouseY = event.button.y;

                int col = mouseX / CELL_SIZE;

                int row = mouseY / CELL_SIZE;


                if (game.isInsideBoard(row, col)) {

                    // Если фигура уже выбрана

                    if (game.pieceSelected) {

                        // Пытаемся сделать ход

                        if (game.makeMove(game.selectedPiece, {row, col})) {

                            game.switchTurn();

                            game.pieceSelected = false;

                        } else {

                            // Если ход не удался, либо снимаем выделение, либо выбираем новую фигуру

                            if (game.board[row][col] == game.currentPlayer) {

                                game.selectedPiece = {row, col};

                            } else {

                                game.pieceSelected = false;

                            }

                        }

                    } 

                    // Выбираем фигуру

                    else {

                        if (game.board[row][col] == game.currentPlayer) {

                            game.selectedPiece = {row, col};

                            game.pieceSelected = true;

                        }

                    }

                }

            }

        }


        // Отрисовка

        SDL_SetRenderDrawColor(renderer, 50, 50, 50, 255);

        SDL_RenderClear(renderer);


        drawBoard(renderer);

        drawPieces(renderer, game);


        SDL_RenderPresent(renderer);

        SDL_Delay(10);

    }


    SDL_DestroyRenderer(renderer);

    SDL_DestroyWindow(window);

    SDL_Quit();

    return 0;

}

/////////

/*

g++ main.cpp -o corners.exe -I"path\to\SDL2\include" -L"path\to\SDL2\lib" -lSDL2main -lSDL2


    Да, SDL2.dll (или SDL2main.dll, если у вас статическая линковка) обязан находиться в той же папке, где лежит ваш .exe файл.

    Как это сделать правильно:

    1. Скачайте библиотеку SDL2 с официального сайта (обычно это SDL2-devel-2.x.x-mingw.zip).



Откройте командную строку (cmd) или PowerShell в папке с вашим corners.exe и введите команду:

cmd
dumpbin /headers corners.exe | find "machine"

Что вы увидите:

  • Если в выводе есть 14C → это x86 (32-bit).

  • Если в выводе есть 8664 → это x64 (64-bit).


  •  */


Комментариев нет:

Отправить комментарий