summaryrefslogtreecommitdiff
path: root/src/Piece.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Piece.cpp')
-rw-r--r--src/Piece.cpp103
1 files changed, 103 insertions, 0 deletions
diff --git a/src/Piece.cpp b/src/Piece.cpp
new file mode 100644
index 0000000..6f9a3be
--- /dev/null
+++ b/src/Piece.cpp
@@ -0,0 +1,103 @@
+#include "Piece.hpp"
+
+namespace chessarbiter {
+Piece::Piece(char c, std::string coord)
+ : piece(c), isBlack(!isupper(c)), coord(coord) {}
+
+std::vector<std::string> Piece::GetMoves() {
+ std::vector<std::string> moves;
+ char f = coord[0]; // File
+ char r = coord[1]; // Rank
+ if (piece == 'p' || piece == 'P') {
+ char side = 1;
+ if (piece == 'p') {
+ side = -1;
+ }
+ // First two steps
+ if ((r == '2' && piece == 'P') || (r == '7' && piece == 'p')) {
+ moves.push_back(std::string() + f + (char)(r + 2 * side));
+ }
+ if ((piece == 'P' && r < '8') || (piece == 'p' && r > '1')) {
+ moves.push_back(std::string() + f + (char)(r + 1 * side));
+ }
+ PIECE__ADD_MOVE(f - 1, r + 1 * side);
+ PIECE__ADD_MOVE(f + 1, r + 1 * side);
+ } else if (piece == 'k' || piece == 'K') {
+ PIECE__ADD_MOVE(f, r - 1);
+ PIECE__ADD_MOVE(f, r + 1);
+ PIECE__ADD_MOVE(f + 1, r);
+ PIECE__ADD_MOVE(f - 1, r);
+ PIECE__ADD_MOVE(f + 1, r + 1);
+ PIECE__ADD_MOVE(f - 1, r - 1);
+ PIECE__ADD_MOVE(f + 1, r - 1);
+ PIECE__ADD_MOVE(f - 1, r + 1);
+ } else if (piece == 'n' || piece == 'N') {
+ PIECE__ADD_MOVE(f + 1, r + 2);
+ PIECE__ADD_MOVE(f - 1, r + 2);
+ PIECE__ADD_MOVE(f + 1, r - 2);
+ PIECE__ADD_MOVE(f - 1, r - 2);
+ PIECE__ADD_MOVE(f + 2, r + 1);
+ PIECE__ADD_MOVE(f - 2, r + 1);
+ PIECE__ADD_MOVE(f + 2, r - 1);
+ PIECE__ADD_MOVE(f - 2, r - 1);
+ } else {
+ if (piece == 'b' || piece == 'B' || piece == 'Q' || piece == 'q') {
+ char rtmp = r;
+ char ftmp = f;
+ while (PIECE__IS_VALID(ftmp, rtmp)) {
+ ftmp++;
+ rtmp++;
+ PIECE__ADD_MOVE(ftmp, rtmp);
+ }
+ rtmp = r;
+ ftmp = f;
+ while (PIECE__IS_VALID(ftmp, rtmp)) {
+ ftmp--;
+ rtmp--;
+ PIECE__ADD_MOVE(ftmp, rtmp);
+ }
+ rtmp = r;
+ ftmp = f;
+ while (PIECE__IS_VALID(ftmp, rtmp)) {
+ ftmp--;
+ rtmp++;
+ PIECE__ADD_MOVE(ftmp, rtmp);
+ }
+ rtmp = r;
+ ftmp = f;
+ while (PIECE__IS_VALID(ftmp, rtmp)) {
+ ftmp++;
+ rtmp--;
+ PIECE__ADD_MOVE(ftmp, rtmp);
+ }
+ }
+ if (piece == 'r' || piece == 'R' || piece == 'Q' || piece == 'q') {
+ char rtmp = r;
+ char ftmp = f;
+ while (PIECE__IS_VALID(ftmp, rtmp)) {
+ rtmp++;
+ PIECE__ADD_MOVE(ftmp, rtmp);
+ }
+ rtmp = r;
+ ftmp = f;
+ while (PIECE__IS_VALID(ftmp, rtmp)) {
+ rtmp--;
+ PIECE__ADD_MOVE(ftmp, rtmp);
+ }
+ rtmp = r;
+ ftmp = f;
+ while (PIECE__IS_VALID(ftmp, rtmp)) {
+ ftmp++;
+ PIECE__ADD_MOVE(ftmp, rtmp);
+ }
+ rtmp = r;
+ ftmp = f;
+ while (PIECE__IS_VALID(ftmp, rtmp)) {
+ ftmp--;
+ PIECE__ADD_MOVE(ftmp, rtmp);
+ }
+ }
+ }
+ return (moves);
+}
+} // namespace chessarbiter \ No newline at end of file