Skip to content

my attempt at blocking checks(not complete) #10

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: testing
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
build/
src/*.gch
*~
**/*~
**/*~
.vscode
2 changes: 1 addition & 1 deletion src/board.c
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ validate_move(position origin, position target, board * game, position * amoves)
/* assign passed moves array, else calculate it */
position *valid_moves = amoves;
if (valid_moves == NULL) {
valid_moves = moves(origin_cell.piece, origin, game->game, &game->game_flags);
valid_moves = moves(origin_cell.piece, origin, game->game, &game->game_flags, game->last_check_line);
allocated_by_me = 1;
}

Expand Down
4 changes: 2 additions & 2 deletions src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ main()
* following checks
*/
free(moves(game_board->game[target.rank][target.file].piece, target,
game_board->game, &game_board->game_flags));
game_board->game, &game_board->game_flags, game_board->last_check_line));
/*
* we do not actually need those moves, so
* that's why we just free them afterwards,
Expand Down Expand Up @@ -172,7 +172,7 @@ main()
* chosen piece
*/
amoves = moves(game_board->game[sel_row][sel_col].piece, coords_to_pos(sel_row, sel_col),
game_board->game, &game_board->game_flags);
game_board->game, &game_board->game_flags, game_board->last_check_line);
/* if no moves have been returned, ignore */
if (amoves == NULL)
break;
Expand Down
116 changes: 74 additions & 42 deletions src/piece.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,15 @@ opposite(SIDE orig) {
}

uint8_t
check_if_king(position * valid_moves, int move_idx, cell game[SIZE_STD][SIZE_STD],
check_if_king(position * lcl, int move_idx, cell game[SIZE_STD][SIZE_STD],
uint8_t game_flags){
if (move_idx == 0 || valid_moves == NULL)
if (move_idx == 0 || lcl == NULL)
return game_flags;

uint8_t flags = game_flags;
if (game[valid_moves[move_idx - 1].rank][valid_moves[move_idx - 1].file].piece != NULL &&
game[valid_moves[move_idx - 1].rank][valid_moves[move_idx - 1].file].piece->ident == 'k') {
switch (game[valid_moves[move_idx - 1].rank][valid_moves[move_idx - 1].file].side) {
if (game[lcl[move_idx - 1].rank][lcl[move_idx - 1].file].piece != NULL &&
game[lcl[move_idx - 1].rank][lcl[move_idx - 1].file].piece->ident == 'k') {
switch (game[lcl[move_idx - 1].rank][lcl[move_idx - 1].file].side) {
case BLACK:
flags |= FLAG_CHECK_BLACK;
break;
Expand All @@ -40,12 +41,15 @@ check_if_king(position * valid_moves, int move_idx, cell game[SIZE_STD][SIZE_STD
default:
break;
}
} else {
lcl = NULL;
free(lcl);
}
return flags;
}

position *
rook_valid(position pos, cell game[SIZE_STD][SIZE_STD], uint8_t * game_flags)
rook_valid(position pos, cell game[SIZE_STD][SIZE_STD], uint8_t * game_flags, position * lcl)
{
const int max_length = (SIZE_STD - 1) * 2; /* a rook can move ( not
* counting other pieces
Expand All @@ -61,56 +65,69 @@ rook_valid(position pos, cell game[SIZE_STD][SIZE_STD], uint8_t * game_flags)
* clarify that's
* reserved for the
* sentinel */
int move_idx = 0;
lcl = malloc(sizeof(position)*SIZE_STD);
int move_idx = 0, lcl_move_idx = 0;;

/* Line up */
for (int row = pos.rank + 1; row < SIZE_STD; row++) {
if (game[row][pos.file].piece != NULL) {
if (game[row][pos.file].side == opposite(game[pos.rank][pos.file].side)) {
valid_moves[move_idx++] = coords_to_pos(row, pos.file);
lcl[lcl_move_idx++] = coords_to_pos(row, pos.file);
break;
}
break;
}
valid_moves[move_idx++] = coords_to_pos(row, pos.file);
lcl[lcl_move_idx++] = coords_to_pos(row, pos.file);
}
*game_flags = check_if_king(valid_moves, move_idx, game, *game_flags);
lcl[lcl_move_idx] = SENTINEL;
memcpy(valid_moves, lcl, (lcl_move_idx-1) * sizeof(position));
*game_flags = check_if_king(lcl, lcl_move_idx, game, *game_flags);
move_idx+=lcl_move_idx;
/* Line down */
for (int row = pos.rank - 1; row >= 0; row--) {
if (game[row][pos.file].piece != NULL) {
if (game[row][pos.file].side == opposite(game[pos.rank][pos.file].side)) {
valid_moves[move_idx++] = coords_to_pos(row, pos.file);
lcl[lcl_move_idx++] = coords_to_pos(row, pos.file);
break;
}
break;
}
valid_moves[move_idx++] = coords_to_pos(row, pos.file);
lcl[lcl_move_idx++] = coords_to_pos(row, pos.file);
}
*game_flags = check_if_king(valid_moves, move_idx, game, *game_flags);
lcl[lcl_move_idx] = SENTINEL;
memcpy(valid_moves, lcl, (lcl_move_idx-1) * sizeof(position));
*game_flags = check_if_king(lcl, lcl_move_idx, game, *game_flags);
move_idx+=lcl_move_idx-1;
/* Line left */
for (int col = pos.file - 1; col >= 0; col--) {
if (game[pos.rank][col].piece != NULL) {
if (game[pos.rank][col].side == opposite(game[pos.rank][pos.file].side)) {
valid_moves[move_idx++] = coords_to_pos(pos.rank, col);
lcl[lcl_move_idx++] = coords_to_pos(pos.rank, col);
break;
}
break;
}
valid_moves[move_idx++] = coords_to_pos(pos.rank, col);
lcl[lcl_move_idx++] = coords_to_pos(pos.rank, col);
}
*game_flags = check_if_king(valid_moves, move_idx, game, *game_flags);
lcl[lcl_move_idx] = SENTINEL;
memcpy(valid_moves + move_idx, lcl, (lcl_move_idx-1) * sizeof(position));
*game_flags = check_if_king(lcl, lcl_move_idx, game, *game_flags);
move_idx+=lcl_move_idx;
/* Line right */
for (int col = pos.file + 1; col < SIZE_STD; col++) {
if (game[pos.rank][col].piece != NULL) {
if (game[pos.rank][col].side == opposite(game[pos.rank][pos.file].side)) {
valid_moves[move_idx++] = coords_to_pos(pos.rank, col);
lcl[lcl_move_idx++] = coords_to_pos(pos.rank, col);
break;
}
break;
}
valid_moves[move_idx++] = coords_to_pos(pos.rank, col);
lcl[lcl_move_idx++] = coords_to_pos(pos.rank, col);
}
*game_flags = check_if_king(valid_moves, move_idx, game, *game_flags);
lcl[lcl_move_idx] = SENTINEL;
memcpy(valid_moves + move_idx, lcl, (lcl_move_idx-1) * sizeof(position));
*game_flags = check_if_king(lcl, lcl_move_idx, game, *game_flags);
move_idx+=lcl_move_idx;
valid_moves[move_idx] = SENTINEL;
return valid_moves;
}
Expand Down Expand Up @@ -141,7 +158,7 @@ knight_valid(position pos, cell game[SIZE_STD][SIZE_STD], uint8_t * game_flags)
}

position *
bishop_valid(position pos, cell game[SIZE_STD][SIZE_STD], uint8_t * game_flags)
bishop_valid(position pos, cell game[SIZE_STD][SIZE_STD], uint8_t * game_flags, position * lcl)
{
/*
* we can approximate, in the worst case the bishop will take
Expand All @@ -151,72 +168,87 @@ bishop_valid(position pos, cell game[SIZE_STD][SIZE_STD], uint8_t * game_flags)
position *valid_moves = malloc(sizeof(position) * max_length + sizeof(position)); /* allocate vertical +
* horizontal moves +
* sentinel */
int i = 1, move_idx = 0;
lcl = malloc(sizeof(position)*SIZE_STD); /* allocate one diagonal worst case scenario takes 7 cells */
int i = 1, move_idx = 0, lcl_move_idx = 0;

/* first diagonal: top right */
while (pos.rank + i < SIZE_STD && pos.file + i < SIZE_STD) {
if (game[pos.rank + i][pos.file + i].piece != NULL) {
if (game[pos.rank + i][pos.file + i].side == opposite(game[pos.rank][pos.file].side)) {
valid_moves[move_idx++] = coords_to_pos(pos.rank + i, pos.file + i);
lcl[lcl_move_idx++] = coords_to_pos(pos.rank + i, pos.file + i);
break;
}
break;
}
valid_moves[move_idx++] = coords_to_pos(pos.rank + i, pos.file + i);
lcl[lcl_move_idx++] = coords_to_pos(pos.rank + i, pos.file + i);
i++;
}
*game_flags = check_if_king(valid_moves, move_idx, game, *game_flags);
lcl[lcl_move_idx] = SENTINEL;
memcpy(valid_moves, lcl, (lcl_move_idx-1) * sizeof(position));
*game_flags = check_if_king(lcl, lcl_move_idx, game, *game_flags);
move_idx+=lcl_move_idx-1;

/* second diagonal: top left */
i = 1;
i = 1, lcl_move_idx=0;
while (pos.rank + i < SIZE_STD && pos.file - i >= 0) {
if (game[pos.rank + i][pos.file - i].piece != NULL) {
if (game[pos.rank + i][pos.file - i].side == opposite(game[pos.rank][pos.file].side)) {
valid_moves[move_idx++] = coords_to_pos(pos.rank + i, pos.file - i);
lcl[lcl_move_idx++] = coords_to_pos(pos.rank + i, pos.file - i);
break;
}
break;
}
valid_moves[move_idx++] = coords_to_pos(pos.rank + i, pos.file - i);
lcl[lcl_move_idx++] = coords_to_pos(pos.rank + i, pos.file - i);
i++;
}
*game_flags = check_if_king(valid_moves, move_idx, game, *game_flags);
lcl[lcl_move_idx] = SENTINEL;
memcpy(valid_moves + move_idx, lcl, (lcl_move_idx-1) * sizeof(position));
*game_flags = check_if_king(lcl, lcl_move_idx, game, *game_flags);
move_idx+=lcl_move_idx;

/* third diagonal: bottom left */
i = 1;
i = 1, lcl_move_idx=0;
while (pos.rank - i >= 0 && pos.file - i >= 0) {
if (game[pos.rank - i][pos.file - i].piece != NULL) {
if (game[pos.rank - i][pos.file - i].side == opposite(game[pos.rank][pos.file].side)) {
valid_moves[move_idx++] = coords_to_pos(pos.rank - i, pos.file - i);
lcl[lcl_move_idx++] = coords_to_pos(pos.rank - i, pos.file - i);
break;
}
break;
}
valid_moves[move_idx++] = coords_to_pos(pos.rank - i, pos.file - i);
lcl[lcl_move_idx++] = coords_to_pos(pos.rank - i, pos.file - i);
i++;
}
*game_flags = check_if_king(valid_moves, move_idx, game, *game_flags);
lcl[lcl_move_idx] = SENTINEL;
memcpy(valid_moves + move_idx, lcl, (lcl_move_idx-1) * sizeof(position));
*game_flags = check_if_king(lcl, lcl_move_idx, game, *game_flags);
move_idx+=lcl_move_idx;
/* fourth diagonal: bottom right */
i = 1;
while (pos.rank - i >= 0 && pos.file + i < SIZE_STD) {
if (game[pos.rank - i][pos.file + i].piece != NULL) {
if (game[pos.rank - i][pos.file + i].side == opposite(game[pos.rank][pos.file].side)) {
valid_moves[move_idx++] = coords_to_pos(pos.rank - i, pos.file + i);
lcl[lcl_move_idx++] = coords_to_pos(pos.rank - i, pos.file + i);
break;
}
break;
}
valid_moves[move_idx++] = coords_to_pos(pos.rank - i, pos.file + i);
lcl[lcl_move_idx++] = coords_to_pos(pos.rank - i, pos.file + i);
i++;
}
*game_flags = check_if_king(valid_moves, move_idx, game, *game_flags);
lcl[lcl_move_idx] = SENTINEL;
memcpy(valid_moves + move_idx, lcl, (lcl_move_idx-1) * sizeof(position));
*game_flags = check_if_king(lcl, lcl_move_idx, game, *game_flags);
move_idx+=lcl_move_idx;
valid_moves[move_idx] = SENTINEL;
return valid_moves;
}

position *
queen_valid(position pos, cell game[SIZE_STD][SIZE_STD], uint8_t * game_flags)
queen_valid(position pos, cell game[SIZE_STD][SIZE_STD], uint8_t * game_flags, position * last_check_line)
{
position *bishop_moves = bishop_valid(pos, game, game_flags);
position *rook_moves = rook_valid(pos, game, game_flags);
position *bishop_moves = bishop_valid(pos, game, game_flags, last_check_line);
position *rook_moves = rook_valid(pos, game, game_flags, last_check_line);
int bishop_moves_len, rook_moves_len;
for (bishop_moves_len = 0; bishop_moves[bishop_moves_len].file != -1; bishop_moves_len++)
;
Expand Down Expand Up @@ -306,20 +338,20 @@ pawn_valid(position pos, cell game[SIZE_STD][SIZE_STD], uint8_t * game_flags)
}

position *
moves(piece * piece, position pos, cell game[SIZE_STD][SIZE_STD], uint8_t * game_flags)
moves(piece * piece, position pos, cell game[SIZE_STD][SIZE_STD], uint8_t * game_flags, position *last_check_line)
{
switch (piece->ident) {
case 'r':
return rook_valid(pos, game, game_flags);
return rook_valid(pos, game, game_flags, last_check_line);
break;
case 'b':
return bishop_valid(pos, game, game_flags);
return bishop_valid(pos, game, game_flags, last_check_line);
break;
case 'n':
return knight_valid(pos, game, game_flags);
break;
case 'q':
return queen_valid(pos, game, game_flags);
return queen_valid(pos, game, game_flags, last_check_line);
break;
case 'k':
return king_valid(pos, game, game_flags);
Expand Down
2 changes: 1 addition & 1 deletion src/piece.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ typedef struct {
uint8_t flags;
} cell;

position * moves(piece * piece, position pos, cell game[SIZE_STD][SIZE_STD], uint8_t * game_flags);
position * moves(piece * piece, position pos, cell game[SIZE_STD][SIZE_STD], uint8_t * game_flags, position *last_check_line);
extern piece rook, bishop, knight, queen, pawn, king;
position coords_to_pos(short rank, short file);
piece *ident_to_piece(char ident);
Expand Down