Refactor and move things around.

This commit is contained in:
Daniel Weber 2024-09-14 09:40:43 -04:00
parent 6314bc756a
commit 9c31cc66e7
8 changed files with 77 additions and 55 deletions

View File

@ -4,12 +4,21 @@ project(Chess C CXX)
find_package(SDL2 REQUIRED) find_package(SDL2 REQUIRED)
file(GLOB sources file(GLOB_RECURSE sources
CONFIGURE_DEPENDS CONFIGURE_DEPENDS
src/*.cpp) "src/*.cpp")
file (GLOB_RECURSE headers CONFIGURE_DEPENDS "src/*.h")
set (include_dirs "")
foreach (_headerFile ${headers})
get_filename_component(_dir ${_headerFile} PATH)
list (APPEND include_dirs ${_dir})
endforeach()
add_executable(Chess ${sources}) add_executable(Chess ${sources})
set_target_properties(Chess PROPERTIES CXX_STANDARD 17) # set standard level set_target_properties(Chess PROPERTIES CXX_STANDARD 17) # set standard level
target_include_directories(Chess PRIVATE ${include_dirs})
target_compile_options(Chess PRIVATE target_compile_options(Chess PRIVATE
-Wall -Wextra -Wredundant-decls -Wcast-align -Wall -Wextra -Wredundant-decls -Wcast-align
-Wshadow -Wnon-virtual-dtor -Wshadow -Wnon-virtual-dtor

View File

@ -25,7 +25,7 @@ static uint8_t Pawn_Converted_To = QUEEN_WHITE;
/** /**
* @brief Function for clearing all of the lights on the board. Except for error moves. * @brief Function for clearing all of the lights on the board. Except for error moves.
* @retval None * @retval None
*/ */
static void clear_lights(void) static void clear_lights(void)
@ -40,13 +40,13 @@ static void clear_lights(void)
} }
} }
} }
} }
/** /**
* @brief Function for determining if the piece is on the white team or on the black team. * @brief Function for determining if the piece is on the white team or on the black team.
* @note Pieces should be enumerated even if white and odd if black. * @note Pieces should be enumerated even if white and odd if black.
* @param piece: The piece under question. * @param piece: The piece under question.
* @retval Return true if on the white team, else false. * @retval Return true if on the white team, else false.
*/ */
static bool white_team(uint8_t piece) static bool white_team(uint8_t piece)
@ -55,9 +55,9 @@ static bool white_team(uint8_t piece)
} }
/** /**
* @brief Function for determining if two pieces are on the same team or not. * @brief Function for determining if two pieces are on the same team or not.
* @param piece_one: Piece one ofcoarse. * @param piece_one: Piece one ofcoarse.
* @param piece_two: Piece two obviously. * @param piece_two: Piece two obviously.
* @retval True if on opposite teams, else false. * @retval True if on opposite teams, else false.
*/ */
static bool opposite_teams(uint8_t piece_one, uint8_t piece_two) static bool opposite_teams(uint8_t piece_one, uint8_t piece_two)
@ -69,7 +69,7 @@ static bool opposite_teams(uint8_t piece_one, uint8_t piece_two)
* @brief Check to see if the square is safe from the other team. * @brief Check to see if the square is safe from the other team.
* @param column: Column of potential move * @param column: Column of potential move
* @param row: Row of the potential move * @param row: Row of the potential move
* @retval True if the square is safe, else is false * @retval True if the square is safe, else is false
*/ */
bool square_is_safe(uint8_t row, uint8_t column) bool square_is_safe(uint8_t row, uint8_t column)
{ {
@ -292,7 +292,7 @@ static bool Set_Light(uint8_t piece, uint8_t row, uint8_t column, uint8_t state)
} }
/** /**
* @brief Function for marking potential moves for pawns. * @brief Function for marking potential moves for pawns.
* @param row: row to move to * @param row: row to move to
* @param column: column to move to * @param column: column to move to
* @retval None * @retval None
@ -309,12 +309,12 @@ static bool pawn_move(uint8_t piece, uint8_t row, uint8_t column)
/** /**
* @brief Function for "casting" a ray in any direction, vertical, horizontal, or diagonal. If the ray hits someone from the other team * @brief Function for "casting" a ray in any direction, vertical, horizontal, or diagonal. If the ray hits someone from the other team
* or the end of the board the array will be terminated. * or the end of the board the array will be terminated.
* @param direction_r: Row direction * @param direction_r: Row direction
* @param direction_c: Column direction * @param direction_c: Column direction
* @param row: current row location * @param row: current row location
* @param column: current column location * @param column: current column location
* @param piece: the piece that is casting the ray. * @param piece: the piece that is casting the ray.
* @retval None * @retval None
*/ */
static bool cast_a_ray(uint8_t piece, int8_t direction_r, int8_t direction_c, uint8_t column, uint8_t row) static bool cast_a_ray(uint8_t piece, int8_t direction_r, int8_t direction_c, uint8_t column, uint8_t row)
@ -366,10 +366,10 @@ static bool pawn_take(uint8_t piece, uint8_t row, uint8_t column)
} }
/** /**
* @brief Function for marking the potential moves. * @brief Function for marking the potential moves.
* @param piece: Piece that we are marking the potential moves for. * @param piece: Piece that we are marking the potential moves for.
* @param row: Current row location of the piece. * @param row: Current row location of the piece.
* @param column: Current column location of the piece. * @param column: Current column location of the piece.
* @retval None * @retval None
*/ */
static bool Mark_Potential_Moves(uint8_t piece, uint8_t column, uint8_t row) static bool Mark_Potential_Moves(uint8_t piece, uint8_t column, uint8_t row)
@ -431,8 +431,8 @@ static bool Mark_Potential_Moves(uint8_t piece, uint8_t column, uint8_t row)
} }
ret_val = cast_a_ray(piece, up_down_step, left_right_step, column, row) || ret_val; ret_val = cast_a_ray(piece, up_down_step, left_right_step, column, row) || ret_val;
} }
break; break;
} }
case KNIGHT_WHITE: case KNIGHT_WHITE:
case KNIGHT_BLACK: case KNIGHT_BLACK:
@ -472,7 +472,7 @@ static bool Mark_Potential_Moves(uint8_t piece, uint8_t column, uint8_t row)
{ {
up_down_step = (i == 0u) ? -1 : 1; up_down_step = (i == 0u) ? -1 : 1;
} }
int8_t x = (int8_t)row + left_right_step; int8_t x = (int8_t)row + left_right_step;
int8_t y = (int8_t)column + up_down_step; int8_t y = (int8_t)column + up_down_step;
if ((x >= 0) && (y >= 0) && (x < 8) && (y < 8)) if ((x >= 0) && (y >= 0) && (x < 8) && (y < 8))
@ -565,7 +565,7 @@ static bool Mark_Potential_Moves(uint8_t piece, uint8_t column, uint8_t row)
if (square_is_safe(row, column)) if (square_is_safe(row, column))
{ {
// Queen side castle // Queen side castle
if(Castling_Allowed[white_black_idx][0u] && (Board_State[kings_row][1u] == SQUARE_EMPTY) if(Castling_Allowed[white_black_idx][0u] && (Board_State[kings_row][1u] == SQUARE_EMPTY)
&& (Board_State[kings_row][2u] == SQUARE_EMPTY) && (Board_State[kings_row][3u]) == SQUARE_EMPTY) && (Board_State[kings_row][2u] == SQUARE_EMPTY) && (Board_State[kings_row][3u]) == SQUARE_EMPTY)
{ {
//First Check to see if the king will pass through check //First Check to see if the king will pass through check
@ -617,7 +617,7 @@ bool Check_If_Player_Can_Move(bool white)
} }
} }
} }
} }
clear_lights(); clear_lights();
// SDL_Log("Player cant move"); // SDL_Log("Player cant move");
@ -625,18 +625,18 @@ bool Check_If_Player_Can_Move(bool white)
} }
/** /**
* @brief Function for switching the players turn. Incharge of handling the state machine reset. * @brief Function for switching the players turn. Incharge of handling the state machine reset.
*/ */
static void Switch_Turns(void) static void Switch_Turns(void)
{ {
Game_State = (White_Turn ? GAME_STATE_P2_TURN_BEGINING : GAME_STATE_P1_TURN_BEGINING); Game_State = (White_Turn ? GAME_STATE_P2_TURN_BEGINING : GAME_STATE_P1_TURN_BEGINING);
White_Turn = !White_Turn; White_Turn = !White_Turn;
// Square is safe assumes the other team is trying to attack the square so for example at the end of // Square is safe assumes the other team is trying to attack the square so for example at the end of
// White's turn we want to see if the black king is now in check, so we will switch teams and then // White's turn we want to see if the black king is now in check, so we will switch teams and then
// Check if the current kings locations is safe. If it is safe then check is false, if it isnt safe then check is true. // Check if the current kings locations is safe. If it is safe then check is false, if it isnt safe then check is true.
uint8_t white_black_idx = White_Turn ? 0u : 1u; uint8_t white_black_idx = White_Turn ? 0u : 1u;
Check[white_black_idx] = !square_is_safe(King_Locations[white_black_idx][0u], King_Locations[white_black_idx][1u]); Check[white_black_idx] = !square_is_safe(King_Locations[white_black_idx][0u], King_Locations[white_black_idx][1u]);
//Last thing we need to check before sitching turns is to check if the game is over. //Last thing we need to check before sitching turns is to check if the game is over.
bool player_can_play = Check_If_Player_Can_Move(White_Turn); bool player_can_play = Check_If_Player_Can_Move(White_Turn);
if(!player_can_play) if(!player_can_play)
@ -654,7 +654,7 @@ static void Switch_Turns(void)
} }
/** /**
* @brief Function for checking the selected piece to see if we are moving the king. * @brief Function for checking the selected piece to see if we are moving the king.
* If we are then we also want to update the new location of the corresponding king. * If we are then we also want to update the new location of the corresponding king.
* @param row: Current row location of the piece. * @param row: Current row location of the piece.
* @param column: Current column location of the piece. * @param column: Current column location of the piece.
@ -670,7 +670,7 @@ static void Check_If_Moving_King(uint8_t row, uint8_t column)
Castling_Allowed[white_black_idx][0u] = false; Castling_Allowed[white_black_idx][0u] = false;
Castling_Allowed[white_black_idx][1u] = false; Castling_Allowed[white_black_idx][1u] = false;
} }
// Disable the castling of the corresponding side if the rook is being moved. // Disable the castling of the corresponding side if the rook is being moved.
else if (((Selected_Piece == ROOK_WHITE) && (row == 7u)) else if (((Selected_Piece == ROOK_WHITE) && (row == 7u))
|| ((Selected_Piece == ROOK_BLACK) && (row == 0u))) || ((Selected_Piece == ROOK_BLACK) && (row == 0u)))
{ {
@ -727,7 +727,7 @@ static bool Converting_Pawn_If_Applicable(uint8_t row, uint8_t column)
{ {
Pawn_Converted_To += 8u; Pawn_Converted_To += 8u;
} }
} }
ret_val = true; ret_val = true;
} }
@ -739,9 +739,9 @@ static bool Converting_Pawn_If_Applicable(uint8_t row, uint8_t column)
/** /**
* @brief Function for toggeling a square's state. * @brief Function for toggeling a square's state.
* @param j: row location that was toggled. * @param j: row location that was toggled.
* @param i: column location that was toggled. * @param i: column location that was toggled.
* @retval None * @retval None
*/ */
static void Board_Square_Was_Toggled(uint8_t j, uint8_t i) static void Board_Square_Was_Toggled(uint8_t j, uint8_t i)
@ -885,7 +885,7 @@ static void Board_Square_Was_Toggled(uint8_t j, uint8_t i)
{ {
/* Do nothing. */ /* Do nothing. */
} }
} }
else if (Board_Lights[j][i] == PIECE_NEEDS_TO_BE_REMOVED) else if (Board_Lights[j][i] == PIECE_NEEDS_TO_BE_REMOVED)
{ {
@ -948,9 +948,9 @@ void Board_get_lights_and_state(uint8_t board_lights[8][8], uint8_t board_state[
/** /**
* @brief The Board changed so now we have to see what is different and act accordingly. * @brief The Board changed so now we have to see what is different and act accordingly.
* @note Yes i know the design of this seems really bad but it's important to remember this is supposed to simulate the chess board I'm creating. * @note Yes i know the design of this seems really bad but it's important to remember this is supposed to simulate the chess board I'm creating.
* so I'm designing it this way because of the hardware that I'm using. * so I'm designing it this way because of the hardware that I'm using.
* @retval None * @retval None
*/ */
void Board_Changed(uint8_t current_binary_board[8]) void Board_Changed(uint8_t current_binary_board[8])
@ -970,17 +970,16 @@ void Board_Changed(uint8_t current_binary_board[8])
} }
Saved_Binary_Board[j] = current_binary_board[j]; Saved_Binary_Board[j] = current_binary_board[j];
} }
} }
/** /**
* @brief Function for initializing the board * @brief Function for initializing the board
* @note * @note
* @retval None * @retval None
*/ */
void chess_board_init(void) void chess_board_init(void)
{ {
for (uint8_t i = 0u; i < 8u; i++) for (uint8_t i = 0u; i < 8u; i++)
{ {
for (uint8_t j = 0u; j < 8u; j++) for (uint8_t j = 0u; j < 8u; j++)

View File

@ -56,7 +56,7 @@ int begin_game(SDL_Renderer *renderer, SDL_Window *win)
{ {
/* Do nothing. */ /* Do nothing. */
} }
} }
else if (event.type == SDL_QUIT) else if (event.type == SDL_QUIT)
{ {
@ -92,7 +92,7 @@ int begin_game(SDL_Renderer *renderer, SDL_Window *win)
start_time = clock(); start_time = clock();
ui_redraw_board(renderer); ui_redraw_board(renderer);
end_time = clock(); end_time = clock();
SDL_RenderPresent(renderer); SDL_RenderPresent(renderer);
clock_t t = end_time - start_time; clock_t t = end_time - start_time;
@ -105,5 +105,5 @@ int begin_game(SDL_Renderer *renderer, SDL_Window *win)
} }
//g++ main.cpp -o blah `sdl2-config --cflags --libs` //g++ main.cpp -o blah `sdl2-config --cflags --libs`
/* /*
g++ main.cpp -IC:\Users\Daniel\Documents\Projects\i686-w64-mingw32\include\SDL2 -LC:\Users\Daniel\Documents\Projects\i686-w64-mingw32\lib -w -Wl,-subsystem,windows -lmingw32 -lSDL2main -lSDL2 -o SDLMain g++ main.cpp -IC:\Users\Daniel\Documents\Projects\i686-w64-mingw32\include\SDL2 -LC:\Users\Daniel\Documents\Projects\i686-w64-mingw32\lib -w -Wl,-subsystem,windows -lmingw32 -lSDL2main -lSDL2 -o SDLMain
*/ */

View File

@ -28,6 +28,7 @@ int main( int argc, const char* argv[] )
printf("Could not create window: %s\n", SDL_GetError()); printf("Could not create window: %s\n", SDL_GetError());
return 1; return 1;
} }
renderer = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED); renderer = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED);
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
SDL_Rect rectangle; SDL_Rect rectangle;
@ -48,5 +49,5 @@ int main( int argc, const char* argv[] )
} }
//g++ main.cpp -o blah `sdl2-config --cflags --libs` //g++ main.cpp -o blah `sdl2-config --cflags --libs`
/* /*
g++ main.cpp -IC:\Users\Daniel\Documents\Projects\i686-w64-mingw32\include\SDL2 -LC:\Users\Daniel\Documents\Projects\i686-w64-mingw32\lib -w -Wl,-subsystem,windows -lmingw32 -lSDL2main -lSDL2 -o SDLMain g++ main.cpp -IC:\Users\Daniel\Documents\Projects\i686-w64-mingw32\include\SDL2 -LC:\Users\Daniel\Documents\Projects\i686-w64-mingw32\lib -w -Wl,-subsystem,windows -lmingw32 -lSDL2main -lSDL2 -o SDLMain
*/ */

View File

@ -23,6 +23,14 @@ SDL_Texture * bitmapTextures[12] = {NULL};
static uint8_t Current_Binary_Board[8] = {0}; static uint8_t Current_Binary_Board[8] = {0};
/**
* @brief Function for setting the lights on the board to the end game state,
* clearly indicating which player won.
*
* @param p_renderer Sdl Renderer
* @param board_state board state
* @param game_state games state
*/
static void ui_draw_end_game(SDL_Renderer *p_renderer, uint8_t board_state[8][8], uint8_t game_state) static void ui_draw_end_game(SDL_Renderer *p_renderer, uint8_t board_state[8][8], uint8_t game_state)
{ {
SDL_SetRenderTarget(p_renderer, Board_Texture); SDL_SetRenderTarget(p_renderer, Board_Texture);
@ -52,7 +60,7 @@ static void ui_draw_end_game(SDL_Renderer *p_renderer, uint8_t board_state[8][8]
black_color[0] = 0x00; black_color[1] = 0xFF; black_color[2] = 0x00; black_color[3] = 0x00; black_color[0] = 0x00; black_color[1] = 0xFF; black_color[2] = 0x00; black_color[3] = 0x00;
white_color[0] = 0xFF; white_color[1] = 0x00; white_color[2] = 0x00; white_color[3] = 0x00; white_color[0] = 0xFF; white_color[1] = 0x00; white_color[2] = 0x00; white_color[3] = 0x00;
} }
for (size_t j = 0; j < 8; j++) for (size_t j = 0; j < 8; j++)
{ {
@ -83,7 +91,7 @@ static void ui_draw_end_game(SDL_Renderer *p_renderer, uint8_t board_state[8][8]
{ {
/* code */ /* code */
} }
Rectangle.x += square_size; Rectangle.x += square_size;
} }
@ -96,7 +104,7 @@ static void ui_draw_end_game(SDL_Renderer *p_renderer, uint8_t board_state[8][8]
/** /**
* @brief Funtion for that will draw the current state of the board including pecies and colors for suggested and possible moves. * @brief Funtion for that will draw the current state of the board including pecies and colors for suggested and possible moves.
* @param *p_renderer pointer to the renderer object: * @param *p_renderer pointer to the renderer object:
* @retval None * @retval None
*/ */
static void ui_draw_board(SDL_Renderer *p_renderer, uint8_t board_lights[12][8], uint8_t board_state[12][8]) static void ui_draw_board(SDL_Renderer *p_renderer, uint8_t board_lights[12][8], uint8_t board_state[12][8])
@ -159,7 +167,7 @@ static void ui_draw_board(SDL_Renderer *p_renderer, uint8_t board_lights[12][8],
{ {
/* code */ /* code */
} }
if((board_state[j][i] & 0x0Fu) != SQUARE_EMPTY) if((board_state[j][i] & 0x0Fu) != SQUARE_EMPTY)
{ {
SDL_RenderCopy(p_renderer, bitmapTextures[(board_state[j][i] & 0x0Fu)], NULL, &Rectangle); SDL_RenderCopy(p_renderer, bitmapTextures[(board_state[j][i] & 0x0Fu)], NULL, &Rectangle);
@ -197,9 +205,9 @@ static void ui_draw_board(SDL_Renderer *p_renderer, uint8_t board_lights[12][8],
{ {
SDL_RenderFillRect(p_renderer, &Rectangle); SDL_RenderFillRect(p_renderer, &Rectangle);
} }
if ((board_state[j][i] & 0x0Fu) != SQUARE_EMPTY) if ((board_state[j][i] & 0x0Fu) != SQUARE_EMPTY)
{ {
SDL_RenderCopy(p_renderer, bitmapTextures[(board_state[j][i] & 0x0Fu)], NULL, &Rectangle); SDL_RenderCopy(p_renderer, bitmapTextures[(board_state[j][i] & 0x0Fu)], NULL, &Rectangle);
@ -264,8 +272,8 @@ void ui_resize(SDL_Renderer *p_renderer, int w, int h)
* @brief Function for registering an incoming click * @brief Function for registering an incoming click
* @param p_renderer: Pointer to the renderer * @param p_renderer: Pointer to the renderer
* @param x: x location of the click * @param x: x location of the click
* @param y: y location of the click * @param y: y location of the click
* @retval * @retval
*/ */
void ui_click(SDL_Renderer *p_renderer, int x, int y) void ui_click(SDL_Renderer *p_renderer, int x, int y)
{ {
@ -332,8 +340,13 @@ void ui_click(SDL_Renderer *p_renderer, int x, int y)
} }
} }
/**
* @brief Initialize the ui for the board. Setting all pieces in the correct starting positions
*
* @param p_renderer pointer to the sdl renderer
*/
void ui_init(SDL_Renderer *p_renderer) void ui_init(SDL_Renderer *p_renderer)
{ {
Current_Binary_Board[0] = 0xFF; Current_Binary_Board[0] = 0xFF;
Current_Binary_Board[1] = 0xFF; Current_Binary_Board[1] = 0xFF;
Current_Binary_Board[6] = 0xFF; Current_Binary_Board[6] = 0xFF;

View File

@ -1,7 +1,7 @@
/** /**
* The file is used to to abstract away anything realated to the user interface. * The file is used to to abstract away anything realated to the user interface.
* The intent is that the only thing that would need to be re-written between * The intent is that the only thing that would need to be re-written between
* the PC test software and the actual chess board is this module. * the PC test software and the actual chess board is this module.
*/ */
#include <SDL2/SDL.h> #include <SDL2/SDL.h>