From 418b9ff72f3010d7f3f07cb28a7e12808650d701 Mon Sep 17 00:00:00 2001 From: zedarider Date: Wed, 9 Nov 2016 01:43:52 +0000 Subject: added movement to pawn --- src/chess_board.cpp | 84 ++++++++++++++++++++++++++++++++++++++++++++++------- src/chess_piece.cpp | 24 --------------- src/main.cpp | 8 +++++ 3 files changed, 81 insertions(+), 35 deletions(-) (limited to 'src') diff --git a/src/chess_board.cpp b/src/chess_board.cpp index b46a284..ac3e1ae 100644 --- a/src/chess_board.cpp +++ b/src/chess_board.cpp @@ -119,29 +119,58 @@ void chess_ai::chess_board::remove_piece(unsigned x, unsigned y) { *iterate_board(it_sqr, x, y) = chess_piece(); } -void chess_ai::chess_board::move_piece(chess_piece piece) { - move_piece(piece.x, piece.y); +chess_ai::movement_flag chess_ai::chess_board::move_piece(chess_piece piece) { + return move_piece(piece.x, piece.y); } -void chess_ai::chess_board::move_piece(unsigned x, unsigned y) { +chess_ai::movement_flag chess_ai::chess_board::move_piece(unsigned x, + unsigned y) { square_iterator it; iterate_board(it, x, y); - - ++(*it); + + if(it->y < 7 && it->y > 0) { + if(it->colour == white) + return move_piece(x, y, x, y-1); + return move_piece(x, y, x, y+1); + } + return move_error_IllegalMove; } -void chess_ai::chess_board::move_piece(chess_ai::chess_piece piece, - unsigned x, unsigned y) { - move_piece(piece.x, piece.y, x, y); +chess_ai::movement_flag chess_ai::chess_board::move_piece( + chess_ai::chess_piece piece, unsigned x, unsigned y) { + return move_piece(piece.x, piece.y, x, y); } -void chess_ai::chess_board::move_piece(unsigned orig_x, unsigned orig_y, - unsigned dest_x, unsigned dest_y) { +chess_ai::movement_flag chess_ai::chess_board::move_piece(unsigned orig_x, + unsigned orig_y, unsigned dest_x, unsigned dest_y) { + chess_piece taken; + return move_piece(orig_x, orig_y, dest_x, dest_y, taken); +} +chess_ai::movement_flag chess_ai::chess_board::move_piece(unsigned orig_x, + unsigned orig_y, unsigned dest_x, + unsigned dest_y, chess_piece& taken_piece) { + square_iterator it; + square_iterator new_it; + + iterate_board(it, orig_x, orig_y); + iterate_board(new_it, dest_x, dest_y); + + switch(it->type) { + case pawn: + return move_pawn(it, new_it, taken_piece); + case rook: + case knight: + case bishop: + case queen: + case king: + default: + return move_error_IllegalMove; + } } chess_ai::square_iterator& chess_ai::chess_board::iterate_board( - square_iterator& it, unsigned x, unsigned y) { + square_iterator& it, unsigned x, unsigned y) { unsigned vec_index, sqr_index; for(vector_iterator it_vec = grid.begin(); it_vec != grid.end(); ++it_vec) { for(square_iterator it_sqr = (*it_vec).begin(); @@ -157,3 +186,36 @@ chess_ai::square_iterator& chess_ai::chess_board::iterate_board( } return it; } + +chess_ai::movement_flag chess_ai::chess_board::move_pawn(square_iterator it, + square_iterator new_it, chess_piece& taken_piece) { + chess_piece piece(it->type, it->colour, new_it->x, new_it->y); + + if((new_it->y - it->y == 2 && it->y == 1) || + ((int)new_it->y - (int)it->y == -2 && it->y == 6) || + (new_it->y - it->y == 1 && piece.colour == black && it->y < 7) || + ((int)new_it->y - (int)it->y == -1 && piece.colour == white && + it->y > 0)) { + if(new_it->x == it->x) { + if(new_it->type == empty) { + remove_piece(it->x, it->y); + set_piece(piece); + return move_Success; + } else if(new_it->colour == it->colour) { + return move_error_FriendlyPieceOnDestination; + } + return move_error_EnemyPieceOnDestination; + } else if(new_it->x - it->x == 1 || (int)new_it->x - (int)it->x == -1) { + if(new_it->colour != it->colour && new_it->colour != none) { + taken_piece.set(new_it->type, new_it->colour, new_it->x, + new_it->y); + remove_piece(it->x, it->y); + set_piece(piece); + return move_Success; + } else if(new_it->colour == it->colour) { + return move_error_FriendlyPieceOnDestination; + } + } + } + return move_error_IllegalMove; +} diff --git a/src/chess_piece.cpp b/src/chess_piece.cpp index 44dfaa5..6eb07e7 100644 --- a/src/chess_piece.cpp +++ b/src/chess_piece.cpp @@ -46,30 +46,6 @@ void chess_ai::chess_piece::set(piece_type type, piece_colour colour, set_y(y); } -chess_ai::chess_piece& chess_ai::chess_piece::operator==(const chess_piece& - piece) { - if(this != &piece) { - this->set(piece.type, piece.colour, piece.x, piece.y); - } - return *this; -} - -chess_ai::chess_piece& chess_ai::chess_piece::operator++() { - if(type == pawn) { - if(colour == white) - --y; - else - ++y; - } - return *this; -} - -chess_ai::chess_piece chess_ai::chess_piece::operator++(int) { - chess_piece tmp(*this); - operator++(); - return tmp; -} - std::string chess_ai::chess_piece::str() { if(type == empty) return " "; diff --git a/src/main.cpp b/src/main.cpp index b41c919..d946343 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -24,6 +24,14 @@ int main(int argc, char** argv) { chess_piece piece(rook, white, 5, 3); board.set_piece(piece); + board.print_board(); + + board.remove_piece(5, 3); + + board.print_board(); + + board.move_piece(4, 6, 4, 5); + board.print_board(); return 0; -- cgit From 476e22dd7d91a8ad061e022f28f65507870ef72c Mon Sep 17 00:00:00 2001 From: zedarider Date: Wed, 9 Nov 2016 01:48:40 +0000 Subject: added movement to pawn --- src/main.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/main.cpp b/src/main.cpp index d946343..81485f3 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -30,7 +30,9 @@ int main(int argc, char** argv) { board.print_board(); - board.move_piece(4, 6, 4, 5); + board.move_piece(4, 6, 4, 4); + board.move_piece(4, 1, 4, 3); + board.move_piece(3, 6, 3, 5); board.print_board(); -- cgit