#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 с официального сайта (обычно это
SDL2-devel-2.x.x-mingw.zip).
Да, SDL2.dll (или SDL2main.dll, если у вас статическая линковка) обязан находиться в той же папке, где лежит ваш .exe файл.
Как это сделать правильно:
Откройте командную строку (cmd) или PowerShell в папке с вашим corners.exe и введите команду:
dumpbin /headers corners.exe | find "machine"
Что вы увидите:
Если в выводе есть
14C→ это x86 (32-bit).Если в выводе есть
8664→ это x64 (64-bit).*/