Fix knight with fixed offset method

master
Tait Hoyem 5 years ago
parent 735e14f3aa
commit 7c45069bbb

@ -32,6 +32,22 @@ Position pair_to_pos(std::pair<int, int> pr){
throw std::invalid_argument(ss.str());
}
}
Position pair_to_pos(int x, int y){
return pair_to_pos(std::make_pair(x, y));
}
bool is_valid_position(int pos){
return (pos >= 0 && pos < 64);
}
bool is_valid_position(std::pair<int, int> pos){
return (pos.first < 8 && pos.second < 8 &&
pos.first >= 0 && pos.second >=0);
}
bool is_valid_position(int x, int y){
return (x < 8 && x >= 0 &&
y < 8 && y >= 0);
}
std::vector<Position> get_possible_movers(Position pn, std::array<PieceType, 64> board){
std::vector<Position> pns = {Position::A1};
return pns;
@ -99,14 +115,21 @@ std::vector<Position> get_all_moves(Position pn, std::array<PieceType, 64> board
break;
case PieceType::B_KNIGHT:
case PieceType::W_KNIGHT:
for (int j = 7; j >= 0; j--){
for (int i = 0; i < 8; i++){
for (int k = 0; k < 9; k++){
if (std::make_pair(x+knt_dx[k],y+knt_dy[k]) == std::make_pair(i,j))
pns.push_back(pair_to_pos(std::make_pair(i,j)));
}
for (int xo=1;xo<=2;xo++){
int yo=(xo==1)?2:1;
if (is_valid_position(x+xo, y+yo)){
pns.push_back(pair_to_pos(std::make_pair(x+xo, y+yo)));
}
if (is_valid_position(x-xo, y-yo)){
pns.push_back(pair_to_pos(std::make_pair(x-xo, y-yo)));
}
if (is_valid_position(x-xo, y+yo)){
pns.push_back(pair_to_pos(std::make_pair(x-xo, y+yo)));
}
if (is_valid_position(x+xo, y-yo)){
pns.push_back(pair_to_pos(std::make_pair(x+xo, y-yo)));
}
}
}
break;
case PieceType::B_KING:
case PieceType::W_KING:

@ -12,10 +12,17 @@ int poly_knight_offset_y(int y);
// Convert pair of x y coordinates to Position enum member.
// If pr contains values above 7, or below 0 it will fail with an InvalidArgument exception.
Position pair_to_pos(std::pair<int, int> pr);
Position pair_to_pos(int x, int y);
// Convert a Position number into a pair of x y coordiinates
std::pair<int, int> pos_to_pair(Position pn);
// Check if int is a valid position in enum of Position
// Allow ints, and pairs to be checked.
bool is_valid_position(int pos);
bool is_valid_position(std::pair<int, int> pos);
bool is_valid_position(int x, int y);
// Get all positions of pieces which can move to this square
// This may require helper functions for each individual peice.
// TODO rename to something less stupid.

@ -109,6 +109,14 @@ TEST_CASE("Test convert method to go from X and Y to board position", "[pair_to_
CHECK(pair_to_pos(std::make_pair(7, 7)) == Position::H8);
CHECK_THROWS(pair_to_pos(std::make_pair(8, 2)));
CHECK_THROWS(pair_to_pos(std::make_pair(-1, 1)));
CHECK(pair_to_pos(2, 3) == Position::C4);
CHECK(pair_to_pos(7, 0) == Position::H1);
CHECK(pair_to_pos(0, 0) == Position::A1);
CHECK(pair_to_pos(7, 7) == Position::H8);
CHECK_THROWS(pair_to_pos(8, 2));
CHECK_THROWS(pair_to_pos(-1, 1));
}
TEST_CASE("Test convert method to go from a board position to an x and y", "[pos_to_pair]"){
@ -118,6 +126,23 @@ TEST_CASE("Test convert method to go from a board position to an x and y", "[pos
CHECK(pos_to_pair(Position::H8) == std::make_pair(7, 7));
}
TEST_CASE("Test that invalid position ints return false", "[is_valid_position]"){
CHECK(is_valid_position(0)); // 0=A8
CHECK(is_valid_position(63)); // 63=H1
CHECK_FALSE(is_valid_position(-1)); // -1 is out of bounds
CHECK_FALSE(is_valid_position(64)); // 64 is out of bounds
CHECK(is_valid_position(std::make_pair(0, 0))); // 0-7,0-7 should be valid
CHECK(is_valid_position(std::make_pair(7, 7)));
CHECK_FALSE(is_valid_position(std::make_pair(-1, 5))); // should fail
CHECK_FALSE(is_valid_position(std::make_pair(5, 8))); // should fail
CHECK(is_valid_position(0, 0)); // 0-7,0-7 should be valid
CHECK(is_valid_position(7, 7));
CHECK_FALSE(is_valid_position(-1, 5)); // should fail
CHECK_FALSE(is_valid_position(5, 8)); // should fail
}
TEST_CASE("Test what pieces may move where functon", "[get_possible_movers]"){
std::vector<Position> H1_possible_movers = {Position::H2, Position::G1};
CHECK(get_possible_movers(Position::H3, DEFAULT_BOARD) == H1_possible_movers);

Loading…
Cancel
Save