From 8c7fe707a1b0d03a91ad0790884264217acd3146 Mon Sep 17 00:00:00 2001 From: Marcus Penate Date: Thu, 14 Apr 2022 16:03:32 -0400 Subject: [PATCH] Initial version, load default FEN, displays for 5 seconds and closes --- .gitignore | 1 + .vscode/launch.json | 34 ++++++++ .vscode/tasks.json | 30 +++++++ Chess_Pieces_Sprite.bmp | Bin 0 -> 28918 bytes app_consts.hpp | 35 ++++++++ board.cpp | 171 ++++++++++++++++++++++++++++++++++++++++ board.hpp | 26 ++++++ main.cpp | 58 ++++++++++++++ piece.cpp | 30 +++++++ piece.hpp | 20 +++++ sprites.cpp | 43 ++++++++++ sprites.hpp | 17 ++++ 12 files changed, 465 insertions(+) create mode 100644 .gitignore create mode 100755 .vscode/launch.json create mode 100755 .vscode/tasks.json create mode 100755 Chess_Pieces_Sprite.bmp create mode 100755 app_consts.hpp create mode 100755 board.cpp create mode 100755 board.hpp create mode 100755 main.cpp create mode 100644 piece.cpp create mode 100644 piece.hpp create mode 100644 sprites.cpp create mode 100644 sprites.hpp diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7b05f41 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +chess diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100755 index 0000000..11e5c3d --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,34 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "g++ - Build and debug active project", + "type": "cppdbg", + "request": "launch", + "program": "${fileDirname}/chess", + "args": [], + "stopAtEntry": false, + "cwd": "${fileDirname}", + "environment": [], + "externalConsole": false, + "MIMode": "gdb", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + }, + { + "description": "Set Disassembly Flavor to Intel", + "text": "-gdb-set disassembly-flavor intel", + "ignoreFailures": true + } + ], + "preLaunchTask": "C/C++: g++ build project", + "miDebuggerPath": "/usr/bin/gdb" + } + ] +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100755 index 0000000..1a7ab04 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,30 @@ +{ + "tasks": [ + { + "type": "cppbuild", + "label": "C/C++: g++ build project", + "command": "/usr/bin/g++", + "args": [ + "*.cpp", + "-std=c++1z", + "-fdiagnostics-color=always", + "-g", + "-lSDL2", + "-o", + "./chess" + ], + "options": { + "cwd": "${fileDirname}" + }, + "problemMatcher": [ + "$gcc" + ], + "group": { + "kind": "build", + "isDefault": true + }, + "detail": "Task generated by Debugger." + } + ], + "version": "2.0.0" +} \ No newline at end of file diff --git a/Chess_Pieces_Sprite.bmp b/Chess_Pieces_Sprite.bmp new file mode 100755 index 0000000000000000000000000000000000000000..ea8071c227558b66d256987717cf88b33b1ea443 GIT binary patch literal 28918 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 eX+|%iL&%cHJbo_%_r + +inline constexpr int SPRITE_SIZE{45}; +inline constexpr int SCREEN_WIDTH{SPRITE_SIZE*8}; +inline constexpr int SCREEN_HEIGHT{SPRITE_SIZE*8}; + +inline constexpr int BOARD_SIZE{8}; + +enum Type +{ + NO_TYPE=-1, + KING=0, + QUEEN=1, + BISHOP=2, + KNIGHT=3, + ROOK=4, + PAWN=5, + UNKNOWN=6, +}; + +enum Team +{ + NO_TEAM=-1, + WHITE=0, + BLACK=1, +}; + +enum Visibility +{ + VIS_NONE=-1, + SHOWN=0, + HIDDEN=1, +}; diff --git a/board.cpp b/board.cpp new file mode 100755 index 0000000..1ceb98b --- /dev/null +++ b/board.cpp @@ -0,0 +1,171 @@ +#include "board.hpp" + +#include + +#include "sprites.hpp" + +Board::Board() +{ + load_FEN(std::string("rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/SOCQKCOS w KQkq - 0 1")); +} + +Board::Board(std::string board_fen) +{ + load_FEN(board_fen); +} + +void Board::load_FEN(std::string board_fen) +{ + active_color = WHITE; + able_to_castle[0][0] = false; + able_to_castle[0][1] = false; + able_to_castle[1][0] = false; + able_to_castle[1][1] = false; + half_turn_count = 0; + full_turn_count = 0; + + int x=0,y=0; + std::string black_team("kqbnrpcos"); + std::string white_team("KQBNRPCOS"); + for(int i = 0; i < board_fen.size() && !(x==BOARD_SIZE && y==BOARD_SIZE); i++) + { + if (board_fen[i] == '/') + { + x++; + y=0; + } + else if (std::isdigit(board_fen[i])) + { + y += board_fen[i]-'0'; + } + else + { + size_t loc = black_team.find(board_fen[i],0); + if (std::string::npos != loc) + { + Visibility vis = SHOWN; + if (loc >= UNKNOWN) + { + vis = HIDDEN; + loc -= UNKNOWN; + loc += BISHOP; + } + Type type = (Type)loc; + Team team = BLACK; + + game_board[x][y] = Piece(type, team, vis); + } + else + { + loc = white_team.find(board_fen[i],0); + + if (std::string::npos != loc) + { + Visibility vis = SHOWN; + if (loc >= UNKNOWN) + { + vis = HIDDEN; + loc -= UNKNOWN; + loc += BISHOP; + } + Type type = (Type)loc; + Team team = WHITE; + + game_board[x][y] = Piece(type, team, vis); + } + } + y++; + } + } + + size_t active_color_loc = board_fen.find(' ', 0); + if (std::string::npos == active_color_loc || active_color_loc+1 >= board_fen.size()) + { + return; + } + else + { + active_color_loc = active_color_loc+1; + } + active_color = ('w'==board_fen[active_color_loc])?WHITE:BLACK; + size_t able_to_castle_loc = active_color_loc+2; + while(board_fen[able_to_castle_loc] != ' ') + { + switch(board_fen[able_to_castle_loc]) + { + case 'K': + able_to_castle[WHITE][KING] = true; + break; + case 'Q': + able_to_castle[WHITE][QUEEN] = true; + break; + case 'k': + able_to_castle[BLACK][KING] = true; + break; + case 'q': + able_to_castle[BLACK][QUEEN] = true; + break; + } + able_to_castle_loc++; + } + + size_t en_passant_loc = able_to_castle_loc+1; + while(board_fen[en_passant_loc] != ' ') + { + if (board_fen[en_passant_loc == '-']) + { + en_passant_loc++; + break; + } + + x = board_fen[en_passant_loc]-'a'; + y = board_fen[en_passant_loc]-'0'; + + en_passant.push_back(x+y*BOARD_SIZE); + + en_passant_loc+=2; + } + + size_t half_turn_count_loc = en_passant_loc+1; + const char* board_fen_cstr = board_fen.c_str(); + char* full_turn_count_loc; + half_turn_count = strtol(board_fen_cstr+half_turn_count_loc, &full_turn_count_loc, 10); + full_turn_count = strtol(full_turn_count_loc, nullptr, 10); +} + +void Board::draw_board(SDL_Surface* dest_surface) +{ + bool light_tile = true; + for (int y = 0; y < BOARD_SIZE; y++) + { + for (int x = 0; x < BOARD_SIZE; x++) + { + SDL_Rect dest_rect({SPRITE_SIZE*y,SPRITE_SIZE*x,SPRITE_SIZE,SPRITE_SIZE}); + + uint32_t color = 0; + if (light_tile) + { + color = SDL_MapRGB(dest_surface->format, 235, 236, 208); + } + else + { + color = SDL_MapRGB(dest_surface->format, 119, 149, 86); + } + + SDL_FillRect(dest_surface, &dest_rect, color); + SDL_Surface* piece_surface = SDL_CreateRGBSurfaceWithFormat(0, SPRITE_SIZE, SPRITE_SIZE, 32, dest_surface->format->format); + SDL_FillRect(piece_surface, nullptr, SDL_MapRGB(piece_surface->format, 0xFF, 0x00, 0xFF)); + SDL_SetColorKey(piece_surface, SDL_TRUE, SDL_MapRGB(piece_surface->format, 0xFF, 0x00, 0xFF)); + + if (0 == Sprite::get(game_board[x][y], piece_surface)) + { + SDL_BlitSurface(piece_surface, nullptr, dest_surface, &dest_rect); + } + + SDL_FreeSurface(piece_surface); + + light_tile = !light_tile; + } + light_tile = !light_tile; + } +} \ No newline at end of file diff --git a/board.hpp b/board.hpp new file mode 100755 index 0000000..b2ddc96 --- /dev/null +++ b/board.hpp @@ -0,0 +1,26 @@ +#pragma once + +#include +#include +#include + +#include "app_consts.hpp" +#include "piece.hpp" + +class Board +{ +public: + Board(); + Board(std::string board_fen); + + void load_FEN(std::string board_fen); + + void draw_board(SDL_Surface* dest_surface); + +private: + Piece game_board[BOARD_SIZE][BOARD_SIZE]; + Team active_color; + bool able_to_castle[2][2]; + std::vector en_passant; + int half_turn_count, full_turn_count; +}; diff --git a/main.cpp b/main.cpp new file mode 100755 index 0000000..c9f06ef --- /dev/null +++ b/main.cpp @@ -0,0 +1,58 @@ +#include + +#include "app_consts.hpp" +#include "board.hpp" +#include "sprites.hpp" + +int main(int argc, char** argv) +{ + //Sourced from lazyfoo's SDL2 tutorials, not really any special code here, just standard init process for the window + //The window we'll be rendering to + SDL_Window* window = NULL; + + //The surface contained by the window + SDL_Surface* screenSurface = NULL; + + //Initialize SDL + if(SDL_Init(SDL_INIT_VIDEO) < 0) + { + printf("SDL could not initialize! SDL_Error: %s\n", SDL_GetError()); + } + else + { + //Create window + window = SDL_CreateWindow("SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN); + if(window == NULL) + { + printf("Window could not be created! SDL_Error: %s\n", SDL_GetError()); + } + else + { + //Get window surface + screenSurface = SDL_GetWindowSurface(window); + + //Fill the surface white + SDL_FillRect(screenSurface, NULL, SDL_MapRGB(screenSurface->format, 0x00, 0x00, 0x00)); + + Board board; + + board.draw_board(screenSurface); + + //Update the surface + SDL_UpdateWindowSurface(window); + + //Wait two seconds + SDL_Delay(5000); + } + } + + Sprite::close(); + + //Destroy window + SDL_DestroyWindow(window); + + //Quit SDL subsystems + SDL_Quit(); + + return 0; +} \ No newline at end of file diff --git a/piece.cpp b/piece.cpp new file mode 100644 index 0000000..033d611 --- /dev/null +++ b/piece.cpp @@ -0,0 +1,30 @@ +#include "piece.hpp" + +Piece::Piece() +{ + type = NO_TYPE; + team = NO_TEAM; + vis = VIS_NONE; +} + +Piece::Piece(Type type, Team team, Visibility vis) +{ + this->type = type; + this->team = team; + this->vis = vis; +} + +Team Piece::get_team() +{ + return team; +} + +Type Piece::get_type() +{ + return type; +} + +Visibility Piece::get_vis() +{ + return vis; +} \ No newline at end of file diff --git a/piece.hpp b/piece.hpp new file mode 100644 index 0000000..f888b15 --- /dev/null +++ b/piece.hpp @@ -0,0 +1,20 @@ +#pragma once + +#include + +#include "app_consts.hpp" + +class Piece +{ +public: + Piece(); + Piece(Type type, Team team, Visibility vis); + + Team get_team(); + Type get_type(); + Visibility get_vis(); +private: + Type type; + Team team; + Visibility vis; +}; diff --git a/sprites.cpp b/sprites.cpp new file mode 100644 index 0000000..91029bd --- /dev/null +++ b/sprites.cpp @@ -0,0 +1,43 @@ +#include "sprites.hpp" + +SDL_Surface* Sprite::sheet = nullptr; + +int Sprite::get(Piece piece, SDL_Surface* dest_surface) +{ + return get(piece.get_team(), piece.get_type(), piece.get_vis(), dest_surface); +} + +int Sprite::get(Team team, Type type, Visibility vis, SDL_Surface* dest_surface) +{ + if (nullptr == sheet) + { + load(); + } + + if (NO_TYPE == type || NO_TEAM == team || VIS_NONE == vis) + { + return -1; + } + + SDL_Rect dest_rect{0,0,45,45}; + SDL_Rect src_rect{type*45,team*45+vis*90,45,45}; + SDL_BlitSurface(sheet, &src_rect, dest_surface, &dest_rect); + + return 0; +} + +void Sprite::close() +{ + if (nullptr != sheet) + { + SDL_FreeSurface(sheet); + sheet = nullptr; + } +} + +void Sprite::load() +{ + close(); + sheet = SDL_LoadBMP("Chess_Pieces_Sprite.bmp"); + SDL_SetColorKey(sheet, SDL_TRUE, SDL_MapRGB(sheet->format, 0xFF, 0, 0xFF)); +} \ No newline at end of file diff --git a/sprites.hpp b/sprites.hpp new file mode 100644 index 0000000..09e79f6 --- /dev/null +++ b/sprites.hpp @@ -0,0 +1,17 @@ +#pragma once + +#include "piece.hpp" + +class Sprite +{ +public: + static int get(Piece piece, SDL_Surface* dest_surface); + static int get(Team team, Type type, Visibility vis, SDL_Surface* dest_surface); + + static void close(); +private: + static void load(); + + static SDL_Surface* sheet; + +}; \ No newline at end of file