int get_capture_moves(Pos start, Pos piece, char board[BOARD_SIZE][BOARD_SIZE], COLOR player, int count, Pos* dests){ Pos pos[4] = { { piece.col - 1, piece.row - 1 }, { piece.col + 1, piece.row - 1 }, { piece.col - 1, piece.row + 1 }, { piece.col + 1, piece.row + 1 } }; int found_now = 0, found_ahead; for (int p = 0; p < 4; p++) if (is_valid_pos(pos[p]) && is_opposite(player, board[pos[p].col][pos[p].row])){ Pos new_piece = get_next_diag(piece, pos[p]); if (is_valid_pos(new_piece) && board[new_piece.col][new_piece.row] == EMPTY){ found_now++; char tmp = board[pos[p].col][pos[p].row]; board[pos[p].col][pos[p].row] = EMPTY; Pos* new_dests = malloc(sizeof(Pos) * (count + 1)); for (int i = 0; i < count; i++){ new_dests[i].row = dests[i].row; new_dests[i].col = dests[i].col; } new_dests[count].row = new_piece.row; new_dests[count].col = new_piece.col; found_ahead = get_capture_moves(start, new_piece, board, player, count + 1, new_dests); if (found_ahead == 0){ add_move(start, new_dests, count + 1); free(new_dests); } board[pos[p].row][pos[p].col] = tmp; } } return found_now; }
void get_king_moves(char board[BOARD_SIZE][BOARD_SIZE], COLOR player, Pos piece){ Move* res = NULL; Move* res_head = res; Pos pos[4] = { { piece.col - 1, piece.row - 1 }, { piece.col + 1, piece.row - 1 }, { piece.col - 1, piece.row + 1 }, { piece.col + 1, piece.row + 1 } }; Pos curr; int found_ahead; for (int p = 0; p < 4; p++){ curr = pos[p]; while (is_valid_pos(curr) && board[curr.col][curr.row] == EMPTY){ add_move(piece, &curr, 1); curr = get_next_diag(piece, curr); // BUG - once dests_num == 1 and |dest-start| != 1 add_moves thinks its 1 capture and not a simple move.. } if (is_valid_pos(curr) && is_opposite(player, board[curr.col][curr.row])){ char tmp = board[curr.row][curr.col]; board[curr.row][curr.col] = EMPTY; Pos new_piece = get_next_diag(piece, curr); if (is_valid_pos(new_piece) && board[new_piece.row][new_piece.col] == EMPTY){ found_ahead = get_capture_moves(piece, new_piece, board, player, 1, &new_piece); if (found_ahead == 0) add_move(piece, &new_piece, 1); } board[curr.row][curr.col] = tmp; } } }
// finds all moves of a single king piece void get_king_moves(char board[BOARD_SIZE][BOARD_SIZE], COLOR player, Pos piece){ Pos pos[4] = { { piece.col - 1, piece.row - 1 }, { piece.col + 1, piece.row - 1 }, { piece.col - 1, piece.row + 1 }, { piece.col + 1, piece.row + 1 } }; Pos curr, new_piece; int found_ahead = -1; for (int p = 0; p < 4; p++){ curr = pos[p]; while (is_valid_pos(curr) && board[curr.col][curr.row] == EMPTY){ add_move(piece, &curr, 0); curr = get_next_diag(piece, curr); } if (is_valid_pos(curr) && is_opposite(player, board[curr.col][curr.row])){ char tmp = board[curr.col][curr.row]; board[curr.col][curr.row] = EMPTY; board[piece.col][piece.row] = EMPTY; new_piece = get_next_diag(piece, curr); if (is_valid_pos(new_piece) && board[new_piece.col][new_piece.row] == EMPTY){ found_ahead = get_capture_moves(piece, new_piece, board, player, 1, &new_piece); if (found_ahead == 0) add_move(piece, &new_piece, 1); } board[curr.col][curr.row] = tmp; board[piece.col][piece.row] = curr_piece; } } }
void get_man_moves(char board[BOARD_SIZE][BOARD_SIZE], COLOR player, Pos piece){ Move* res = NULL; Move* res_head = res; Pos pos[4] = { { piece.col - 1, piece.row - 1 }, { piece.col + 1, piece.row - 1 }, { piece.col - 1, piece.row + 1 }, { piece.col + 1, piece.row + 1 } }; int direction = 1, found_ahead; if (player == BLACK) direction = -1; for (int p = 0; p < 4; p++){ if (is_valid_pos(pos[p]) && pos[p].row == piece.row + direction && board[pos[p].col][pos[p].row] == EMPTY) add_move(piece, &pos[p], 1); else if (is_valid_pos(pos[p]) && is_opposite(player, board[pos[p].col][pos[p].row])){ char tmp = board[pos[p].row][pos[p].col]; board[pos[p].row][pos[p].col] = EMPTY; Pos new_piece = get_next_diag(piece, pos[p]); if (is_valid_pos(new_piece) && board[new_piece.row][new_piece.col] == EMPTY){ found_ahead = get_capture_moves(piece, new_piece, board, player, 1, &new_piece); if (found_ahead == 0) add_move(piece, &new_piece, 1); } board[pos[p].row][pos[p].col] = tmp; } } }