Initial version, load default FEN, displays for 5 seconds and closes
This commit is contained in:
commit
8c7fe707a1
|
@ -0,0 +1 @@
|
|||
chess
|
|
@ -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"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -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"
|
||||
}
|
Binary file not shown.
After Width: | Height: | Size: 28 KiB |
|
@ -0,0 +1,35 @@
|
|||
#pragma once
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
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,
|
||||
};
|
|
@ -0,0 +1,171 @@
|
|||
#include "board.hpp"
|
||||
|
||||
#include <cstdlib>
|
||||
|
||||
#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;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
#pragma once
|
||||
|
||||
#include <SDL2/SDL.h>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#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<int> en_passant;
|
||||
int half_turn_count, full_turn_count;
|
||||
};
|
|
@ -0,0 +1,58 @@
|
|||
#include <SDL2/SDL.h>
|
||||
|
||||
#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;
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
#pragma once
|
||||
|
||||
#include <SDL2/SDL.h>
|
||||
|
||||
#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;
|
||||
};
|
|
@ -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));
|
||||
}
|
|
@ -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;
|
||||
|
||||
};
|
Loading…
Reference in New Issue