From 23674dd8e3e668bb5873a8792aa13d4c29b72f7c Mon Sep 17 00:00:00 2001 From: AdmiralEmser Date: Mon, 10 Oct 2022 23:07:17 +0200 Subject: [PATCH 1/4] added more movement checks and minor fixes --- FC-Chess/FC-Chess.cpp | 261 ++++++++++++++++++++++++++++++++++++++++-- FC-Chess/FC-Chess.h | 13 ++- 2 files changed, 261 insertions(+), 13 deletions(-) diff --git a/FC-Chess/FC-Chess.cpp b/FC-Chess/FC-Chess.cpp index b93c987..5340cd0 100644 --- a/FC-Chess/FC-Chess.cpp +++ b/FC-Chess/FC-Chess.cpp @@ -62,15 +62,13 @@ void FCC::Chess::startupGame() bool FCC::Chess::checkIsEnemyOnField(uint8_t* x, uint8_t* y) { - // Check if the selected piece/field unequals the target piece/field => is true then - if (posColor[*x][*y] != posColor[selX][selY]) - { - return true; - } + // Check if the color of the selected piece/field is the opposite of the target piece/field => is true then + if (posColor[*x][*y] == FCC::PiecesColors::BLACK && posColor[selX][selY] == FCC::PiecesColors::WHITE) return true; + if (posColor[*x][*y] == FCC::PiecesColors::WHITE && posColor[selX][selY] == FCC::PiecesColors::BLACK) return true; return false; } -bool FCC::Chess::checkPosInBounds(uint8_t* x, uint8_t* y) +bool FCC::Chess::checkIsPosInBounds(uint8_t* x, uint8_t* y) { // check if X and Y values are below 8. No negative values have to be checked since the var type is unsigned int if (*x <= 7 && *y <= 7) @@ -107,13 +105,15 @@ void FCC::Chess::checkMovesHorizontal() { for (uint8_t i = selX; i <= 7; i++) { - if (checkIsEnemyOnField(&i, &selY)) break; + if (checkIsFriendlyOnField(&i, &selY)) break; posPossible[i][selY] = true; + if (checkIsEnemyOnField(&i, &selY)) break; } for (uint8_t i = selX; i >= 0; i--) { - if (checkIsEnemyOnField(&i, &selY)) break; + if (checkIsFriendlyOnField(&i, &selY)) break; posPossible[i][selY] = true; + if (checkIsEnemyOnField(&i, &selY)) break; } } @@ -121,16 +121,257 @@ void FCC::Chess::checkMovesVertical() { for (uint8_t i = selY; i <= 7; i++) { - if (checkIsEnemyOnField(&selX, &i)) break; + if (checkIsFriendlyOnField(&selX, &i)) break; posPossible[selX][i] = true; + if (checkIsEnemyOnField(&selX, &i)) break; } for (uint8_t i = selY; i >= 0; i--) { - if (checkIsEnemyOnField(&selX, &i)) break; + if (checkIsFriendlyOnField(&selX, &i)) break; posPossible[selX][i] = true; + if (checkIsEnemyOnField(&selX, &i)) break; } } +void FCC::Chess::checkMovesDiagonal() +{ + // creating variables for x and y + uint8_t i = selX, j = selY; + + // checking possible moves + for (; i <= 7 && j <= 7;) + { + if (checkIsFriendlyOnField(&i, &j)) break; + posPossible[i][j] = true; + if (checkIsEnemyOnField(&i, &j)) break; + i++; + j++; + } + + i = selX, j = selY; // resetting variables + for (; i <= 7 && j >= 0;) + { + if (checkIsFriendlyOnField(&i, &j)) break; + posPossible[i][j] = true; + if (checkIsEnemyOnField(&i, &j)) break; + i++; + j--; + } + + i = selX, j = selY; // resetting variables + for (; i >= 0 && j <= 7;) + { + if (checkIsFriendlyOnField(&i, &j)) break; + posPossible[i][j] = true; + if (checkIsEnemyOnField(&i, &j)) break; + i--; + j++; + } + + i = selX, j = selY; // resetting variables + for (; i >= 0 && j >= 0;) + { + if (checkIsFriendlyOnField(&i, &j)) break; + posPossible[i][j] = true; + if (checkIsEnemyOnField(&i, &j)) break; + i--; + j--; + } +} + +void FCC::Chess::checkMovesKnight() +{ + // creating variables for x and y + uint8_t i = selX, j = selY; + + // checking possible moves + i += 1, j += 3; + if (checkIsPosInBounds(&i, &j)) + { + if (!checkIsFriendlyOnField(&i, &j)) posPossible[i][j] = true; + } + + i = selX, j = selY; // resetting variables + i += 1, j -= 3; + if (checkIsPosInBounds(&i, &j)) + { + if (!checkIsFriendlyOnField(&i, &j)) posPossible[i][j] = true; + } + + i = selX, j = selY; // resetting variables + i -= 1, j += 3; + if (checkIsPosInBounds(&i, &j)) + { + if (!checkIsFriendlyOnField(&i, &j)) posPossible[i][j] = true; + } + + i = selX, j = selY; // resetting variables + i -= 1, j -= 3; + if (checkIsPosInBounds(&i, &j)) + { + if (!checkIsFriendlyOnField(&i, &j)) posPossible[i][j] = true; + } + + i = selX, j = selY; // resetting variables + i += 3, j += 1; + if (checkIsPosInBounds(&i, &j)) + { + if (!checkIsFriendlyOnField(&i, &j)) posPossible[i][j] = true; + } + + i = selX, j = selY; // resetting variables + i += 3, j -= 1; + if (checkIsPosInBounds(&i, &j)) + { + if (!checkIsFriendlyOnField(&i, &j)) posPossible[i][j] = true; + } + + i = selX, j = selY; // resetting variables + i -= 3, j += 1; + if (checkIsPosInBounds(&i, &j)) + { + if (!checkIsFriendlyOnField(&i, &j)) posPossible[i][j] = true; + } + + i = selX, j = selY; // resetting variables + i -= 3, j -= 1; + if (checkIsPosInBounds(&i, &j)) + { + if (!checkIsFriendlyOnField(&i, &j)) posPossible[i][j] = true; + } +} + +void FCC::Chess::checkMovesKing() +{ + // creating variables for x and y + uint8_t i, j; + + // checking possible moves + i = selX - 1, j = selY + 1; + for (; i <= selX + 1; i++) + { + if (checkIsPosInBounds(&i, &j)) + { + if (!checkIsFriendlyOnField(&i, &j)) posPossible[i][j] = true; + } + } + + i = selX - 1, j = selY - 1; + for (; i <= selX + 1; i++) + { + if (checkIsPosInBounds(&i, &j)) + { + if (!checkIsFriendlyOnField(&i, &j)) posPossible[i][j] = true; + } + } + + i = selX - 1, j = selY; + if (checkIsPosInBounds(&i, &j)) + { + if (!checkIsFriendlyOnField(&i, &j)) posPossible[i][j] = true; + } + + i = selX + 1, j = selY; + if (checkIsPosInBounds(&i, &j)) + { + if (!checkIsFriendlyOnField(&i, &j)) posPossible[i][j] = true; + } +} + +void FCC::Chess::checkMovesPawn() +{ + // black pieces + if (posColor[selX][selY] == FCC::PiecesColors::BLACK) + { + // creating variables for x and y + uint8_t i, j; + + // checking possible moves + i = selX - 1, j = selY - 1; + for (; i <= selX + 1;) + { + if (checkIsPosInBounds(&i, &j)) + { + if (checkIsEnemyOnField(&i, &j)) posPossible[i][j] = true; + } + i += 2; + } + + i = selX, j = selY - 1; + if (checkIsPosInBounds(&i, &j)) + { + if (checkIsPositionClear(&i, &j)) posPossible[i][j] = true; + } + } + + // white pieces + if (posColor[selX][selY] == FCC::PiecesColors::WHITE) + { + // creating variables for x and y + uint8_t i, j; + + // checking possible moves + i = selX - 1, j = selY + 1; + for (; i <= selX + 1;) + { + if (checkIsPosInBounds(&i, &j)) + { + if (checkIsEnemyOnField(&i, &j)) posPossible[i][j] = true; + } + i += 2; + } + + i = selX, j = selY + 1; + if (checkIsPosInBounds(&i, &j)) + { + if (checkIsPositionClear(&i, &j)) posPossible[i][j] = true; + } + } +} + +bool FCC::Chess::checkIsPawnChangingToQueen() +{ + //black pieces + if (posColor[selX][selY] == FCC::PiecesColors::BLACK) + { + if (selY == 0) return true; + return false; + } + + // white pieces + if (posColor[selX][selY] == FCC::PiecesColors::WHITE) + { + if (selY == 7) return true; + return false; + } + + // no piece at all + return false; +} + +void FCC::Chess::resetAllowedMovement() +{ + for (uint8_t i = 0; i <= 7; i++) + { + for (uint8_t j = 0; j <= 7; j++) + { + posPossible[i][j] = false; + } + } +} + +bool FCC::Chess::checkIsPositionClear(uint8_t* x, uint8_t* y) +{ + if (posColor[*x][*y] == FCC::PiecesColors::NONE) return true; + return false; +} + +bool FCC::Chess::checkIsFriendlyOnField(uint8_t* x, uint8_t* y) +{ + if (posColor[*x][*y] == posColor[selX][selY]) return true; + return false; +} + //void FCC::Chess::set_lang(FCC::Languages lang) { // m_lang = lang; //} diff --git a/FC-Chess/FC-Chess.h b/FC-Chess/FC-Chess.h index 206d31a..e67b97a 100644 --- a/FC-Chess/FC-Chess.h +++ b/FC-Chess/FC-Chess.h @@ -72,10 +72,14 @@ namespace FCC //FCC::ChessLang chessLangObj; //FCC::Languages m_lang{ FCC::Languages::ENGLISH }; - // funcs + // main funcs void input(); + + // check funcs bool checkIsEnemyOnField(uint8_t* x, uint8_t* y); - bool checkPosInBounds(uint8_t* x, uint8_t* y); + bool checkIsFriendlyOnField(uint8_t* x, uint8_t* y); + bool checkIsPositionClear(uint8_t* x, uint8_t* y); + bool checkIsPosInBounds(uint8_t* x, uint8_t* y); void checkAllowedMoves(); void checkMovesHorizontal(); void checkMovesVertical(); @@ -83,7 +87,10 @@ namespace FCC void checkMovesKnight(); void checkMovesKing(); void checkMovesPawn(); - void checkPosEqualsSelPos(uint8_t* x, uint8_t* y); + bool checkIsPawnChangingToQueen(); + bool checkIsPosEqualsSelPos(uint8_t* x, uint8_t* y); + + // reset funcs void resetFieldColors(); void resetAllowedMovement(); }; From 923b4d6d0cdaa91171b34dc3a6838758509865da Mon Sep 17 00:00:00 2001 From: AdmiralEmser Date: Sat, 29 Oct 2022 11:19:52 +0200 Subject: [PATCH 2/4] removed pointers and updated checkMovesVertical() --- FC-Chess/FC-Chess.cpp | 164 +++++++++++++++++++++--------------------- FC-Chess/FC-Chess.h | 10 +-- 2 files changed, 85 insertions(+), 89 deletions(-) diff --git a/FC-Chess/FC-Chess.cpp b/FC-Chess/FC-Chess.cpp index 5340cd0..458c51c 100644 --- a/FC-Chess/FC-Chess.cpp +++ b/FC-Chess/FC-Chess.cpp @@ -33,16 +33,17 @@ void FCC::Chess::startupGame() { // preparing board: colors for (int8_t i = 0; i < 8; i++) { - for (int j = 0; i < 2; i++) { + for (uint8_t j = 0; i < 2; i++) { posColor[i][j] = PiecesColors::BLACK; } - for (int j = 6; i < 8; i++) { + for (uint8_t j = 6; i < 8; i++) { posColor[i][j] = PiecesColors::WHITE; } - for (int j = 2; i < 7; i++) { + for (uint8_t j = 2; i < 7; i++) { posColor[i][j] = PiecesColors::NONE; } } + // preparing board: pieces for (int8_t i = 0; i < 8; i++) { posPieces[1][i] = Pieces::PAWN; @@ -60,18 +61,18 @@ void FCC::Chess::startupGame() } } -bool FCC::Chess::checkIsEnemyOnField(uint8_t* x, uint8_t* y) +bool FCC::Chess::checkIsEnemyOnField(uint8_t x, uint8_t y) { // Check if the color of the selected piece/field is the opposite of the target piece/field => is true then - if (posColor[*x][*y] == FCC::PiecesColors::BLACK && posColor[selX][selY] == FCC::PiecesColors::WHITE) return true; - if (posColor[*x][*y] == FCC::PiecesColors::WHITE && posColor[selX][selY] == FCC::PiecesColors::BLACK) return true; + if (posColor[x][y] == FCC::PiecesColors::BLACK && posColor[selX][selY] == FCC::PiecesColors::WHITE) return true; + if (posColor[x][y] == FCC::PiecesColors::WHITE && posColor[selX][selY] == FCC::PiecesColors::BLACK) return true; return false; } -bool FCC::Chess::checkIsPosInBounds(uint8_t* x, uint8_t* y) +bool FCC::Chess::checkIsPosInBounds(uint8_t x, uint8_t y) { // check if X and Y values are below 8. No negative values have to be checked since the var type is unsigned int - if (*x <= 7 && *y <= 7) + if (x <= 7 && y <= 7) { return true; } @@ -103,79 +104,74 @@ void FCC::Chess::checkAllowedMoves() void FCC::Chess::checkMovesHorizontal() { + // checking positions to the right for (uint8_t i = selX; i <= 7; i++) { - if (checkIsFriendlyOnField(&i, &selY)) break; + if (checkIsFriendlyOnField(i, selY)) break; posPossible[i][selY] = true; - if (checkIsEnemyOnField(&i, &selY)) break; + if (checkIsEnemyOnField(i, selY)) break; } + + // checking positions to the left for (uint8_t i = selX; i >= 0; i--) { - if (checkIsFriendlyOnField(&i, &selY)) break; + if (checkIsFriendlyOnField(i, selY)) break; posPossible[i][selY] = true; - if (checkIsEnemyOnField(&i, &selY)) break; + if (checkIsEnemyOnField(i, selY)) break; } } void FCC::Chess::checkMovesVertical() { + // checking positions above for (uint8_t i = selY; i <= 7; i++) { - if (checkIsFriendlyOnField(&selX, &i)) break; + if (checkIsFriendlyOnField(selX, i)) break; posPossible[selX][i] = true; - if (checkIsEnemyOnField(&selX, &i)) break; + if (checkIsEnemyOnField(selX, i)) break; } + + // checking positions below for (uint8_t i = selY; i >= 0; i--) { - if (checkIsFriendlyOnField(&selX, &i)) break; + if (checkIsFriendlyOnField(selX, i)) break; posPossible[selX][i] = true; - if (checkIsEnemyOnField(&selX, &i)) break; + if (checkIsEnemyOnField(selX, i)) break; } } void FCC::Chess::checkMovesDiagonal() { - // creating variables for x and y - uint8_t i = selX, j = selY; - - // checking possible moves - for (; i <= 7 && j <= 7;) + // checking positions up-right + for (uint8_t i = 1; checkIsPosInBounds(selX + i, selY + i); i++) { - if (checkIsFriendlyOnField(&i, &j)) break; - posPossible[i][j] = true; - if (checkIsEnemyOnField(&i, &j)) break; - i++; - j++; + if (checkIsFriendlyOnField(selX + i, selY + i)) break; + posPossible[selX + i][selY + i] = true; + if (checkIsEnemyOnField(selX + i, selY + i)) break; } - i = selX, j = selY; // resetting variables - for (; i <= 7 && j >= 0;) + // checking positions below-right + for (uint8_t i = 1; checkIsPosInBounds(selX + i, selY - i); i++) { - if (checkIsFriendlyOnField(&i, &j)) break; - posPossible[i][j] = true; - if (checkIsEnemyOnField(&i, &j)) break; - i++; - j--; + if (checkIsFriendlyOnField(selX + i, selY - i)) break; + posPossible[selX + i][selY - i] = true; + if (checkIsEnemyOnField(selX + i, selY - i)) break; } - i = selX, j = selY; // resetting variables - for (; i >= 0 && j <= 7;) + // checking positions up-left + for (uint8_t i = 1; checkIsPosInBounds(selX - i, selY + i); i++) { - if (checkIsFriendlyOnField(&i, &j)) break; - posPossible[i][j] = true; - if (checkIsEnemyOnField(&i, &j)) break; - i--; - j++; + if (checkIsFriendlyOnField(selX - i, selY + i)) break; + posPossible[selX - i][selY + i] = true; + if (checkIsEnemyOnField(selX - i, selY + i)) break; } - - i = selX, j = selY; // resetting variables - for (; i >= 0 && j >= 0;) + + // checking positions below-left + for (uint8_t i = 1; checkIsPosInBounds(selX - i, selY - i); i++) { - if (checkIsFriendlyOnField(&i, &j)) break; - posPossible[i][j] = true; - if (checkIsEnemyOnField(&i, &j)) break; - i--; - j--; + if (checkIsFriendlyOnField(selX - i, selY - i)) break; + posPossible[selX - i][selY - i] = true; + if (checkIsEnemyOnField(selX - i, selY - i)) break; } } @@ -186,58 +182,58 @@ void FCC::Chess::checkMovesKnight() // checking possible moves i += 1, j += 3; - if (checkIsPosInBounds(&i, &j)) + if (checkIsPosInBounds(i, j)) { - if (!checkIsFriendlyOnField(&i, &j)) posPossible[i][j] = true; + if (!checkIsFriendlyOnField(i, j)) posPossible[i][j] = true; } i = selX, j = selY; // resetting variables i += 1, j -= 3; - if (checkIsPosInBounds(&i, &j)) + if (checkIsPosInBounds(i, j)) { - if (!checkIsFriendlyOnField(&i, &j)) posPossible[i][j] = true; + if (!checkIsFriendlyOnField(i, j)) posPossible[i][j] = true; } i = selX, j = selY; // resetting variables i -= 1, j += 3; - if (checkIsPosInBounds(&i, &j)) + if (checkIsPosInBounds(i, j)) { - if (!checkIsFriendlyOnField(&i, &j)) posPossible[i][j] = true; + if (!checkIsFriendlyOnField(i, j)) posPossible[i][j] = true; } i = selX, j = selY; // resetting variables i -= 1, j -= 3; - if (checkIsPosInBounds(&i, &j)) + if (checkIsPosInBounds(i, j)) { - if (!checkIsFriendlyOnField(&i, &j)) posPossible[i][j] = true; + if (!checkIsFriendlyOnField(i, j)) posPossible[i][j] = true; } i = selX, j = selY; // resetting variables i += 3, j += 1; - if (checkIsPosInBounds(&i, &j)) + if (checkIsPosInBounds(i, j)) { - if (!checkIsFriendlyOnField(&i, &j)) posPossible[i][j] = true; + if (!checkIsFriendlyOnField(i, j)) posPossible[i][j] = true; } i = selX, j = selY; // resetting variables i += 3, j -= 1; - if (checkIsPosInBounds(&i, &j)) + if (checkIsPosInBounds(i, j)) { - if (!checkIsFriendlyOnField(&i, &j)) posPossible[i][j] = true; + if (!checkIsFriendlyOnField(i, j)) posPossible[i][j] = true; } i = selX, j = selY; // resetting variables i -= 3, j += 1; - if (checkIsPosInBounds(&i, &j)) + if (checkIsPosInBounds(i, j)) { - if (!checkIsFriendlyOnField(&i, &j)) posPossible[i][j] = true; + if (!checkIsFriendlyOnField(i, j)) posPossible[i][j] = true; } i = selX, j = selY; // resetting variables i -= 3, j -= 1; - if (checkIsPosInBounds(&i, &j)) + if (checkIsPosInBounds(i, j)) { - if (!checkIsFriendlyOnField(&i, &j)) posPossible[i][j] = true; + if (!checkIsFriendlyOnField(i, j)) posPossible[i][j] = true; } } @@ -250,31 +246,31 @@ void FCC::Chess::checkMovesKing() i = selX - 1, j = selY + 1; for (; i <= selX + 1; i++) { - if (checkIsPosInBounds(&i, &j)) + if (checkIsPosInBounds(i, j)) { - if (!checkIsFriendlyOnField(&i, &j)) posPossible[i][j] = true; + if (!checkIsFriendlyOnField(i, j)) posPossible[i][j] = true; } } i = selX - 1, j = selY - 1; for (; i <= selX + 1; i++) { - if (checkIsPosInBounds(&i, &j)) + if (checkIsPosInBounds(i, j)) { - if (!checkIsFriendlyOnField(&i, &j)) posPossible[i][j] = true; + if (!checkIsFriendlyOnField(i, j)) posPossible[i][j] = true; } } i = selX - 1, j = selY; - if (checkIsPosInBounds(&i, &j)) + if (checkIsPosInBounds(i, j)) { - if (!checkIsFriendlyOnField(&i, &j)) posPossible[i][j] = true; + if (!checkIsFriendlyOnField(i, j)) posPossible[i][j] = true; } i = selX + 1, j = selY; - if (checkIsPosInBounds(&i, &j)) + if (checkIsPosInBounds(i, j)) { - if (!checkIsFriendlyOnField(&i, &j)) posPossible[i][j] = true; + if (!checkIsFriendlyOnField(i, j)) posPossible[i][j] = true; } } @@ -290,17 +286,17 @@ void FCC::Chess::checkMovesPawn() i = selX - 1, j = selY - 1; for (; i <= selX + 1;) { - if (checkIsPosInBounds(&i, &j)) + if (checkIsPosInBounds(i, j)) { - if (checkIsEnemyOnField(&i, &j)) posPossible[i][j] = true; + if (checkIsEnemyOnField(i, j)) posPossible[i][j] = true; } i += 2; } i = selX, j = selY - 1; - if (checkIsPosInBounds(&i, &j)) + if (checkIsPosInBounds(i, j)) { - if (checkIsPositionClear(&i, &j)) posPossible[i][j] = true; + if (checkIsPositionClear(i, j)) posPossible[i][j] = true; } } @@ -314,17 +310,17 @@ void FCC::Chess::checkMovesPawn() i = selX - 1, j = selY + 1; for (; i <= selX + 1;) { - if (checkIsPosInBounds(&i, &j)) + if (checkIsPosInBounds(i, j)) { - if (checkIsEnemyOnField(&i, &j)) posPossible[i][j] = true; + if (checkIsEnemyOnField(i, j)) posPossible[i][j] = true; } i += 2; } i = selX, j = selY + 1; - if (checkIsPosInBounds(&i, &j)) + if (checkIsPosInBounds(i, j)) { - if (checkIsPositionClear(&i, &j)) posPossible[i][j] = true; + if (checkIsPositionClear(i, j)) posPossible[i][j] = true; } } } @@ -360,15 +356,15 @@ void FCC::Chess::resetAllowedMovement() } } -bool FCC::Chess::checkIsPositionClear(uint8_t* x, uint8_t* y) +bool FCC::Chess::checkIsPositionClear(uint8_t x, uint8_t y) { - if (posColor[*x][*y] == FCC::PiecesColors::NONE) return true; + if (posColor[x][y] == FCC::PiecesColors::NONE) return true; return false; } -bool FCC::Chess::checkIsFriendlyOnField(uint8_t* x, uint8_t* y) +bool FCC::Chess::checkIsFriendlyOnField(uint8_t x, uint8_t y) { - if (posColor[*x][*y] == posColor[selX][selY]) return true; + if (posColor[x][y] == posColor[selX][selY]) return true; return false; } diff --git a/FC-Chess/FC-Chess.h b/FC-Chess/FC-Chess.h index e67b97a..872f4f7 100644 --- a/FC-Chess/FC-Chess.h +++ b/FC-Chess/FC-Chess.h @@ -76,10 +76,10 @@ namespace FCC void input(); // check funcs - bool checkIsEnemyOnField(uint8_t* x, uint8_t* y); - bool checkIsFriendlyOnField(uint8_t* x, uint8_t* y); - bool checkIsPositionClear(uint8_t* x, uint8_t* y); - bool checkIsPosInBounds(uint8_t* x, uint8_t* y); + bool checkIsEnemyOnField(uint8_t x, uint8_t y); + bool checkIsFriendlyOnField(uint8_t x, uint8_t y); + bool checkIsPositionClear(uint8_t x, uint8_t y); + bool checkIsPosInBounds(uint8_t x, uint8_t y); void checkAllowedMoves(); void checkMovesHorizontal(); void checkMovesVertical(); @@ -88,7 +88,7 @@ namespace FCC void checkMovesKing(); void checkMovesPawn(); bool checkIsPawnChangingToQueen(); - bool checkIsPosEqualsSelPos(uint8_t* x, uint8_t* y); + bool checkIsPosEqualsSelPos(uint8_t x, uint8_t y); // reset funcs void resetFieldColors(); From c4b5e69cacfbcedc0ee1e101456493a3ba242c64 Mon Sep 17 00:00:00 2001 From: AdmiralEmser Date: Sat, 29 Oct 2022 11:43:19 +0200 Subject: [PATCH 3/4] updated checkMovesKnight() --- FC-Chess/FC-Chess.cpp | 60 +++++++++++++++---------------------------- 1 file changed, 21 insertions(+), 39 deletions(-) diff --git a/FC-Chess/FC-Chess.cpp b/FC-Chess/FC-Chess.cpp index 458c51c..7cea854 100644 --- a/FC-Chess/FC-Chess.cpp +++ b/FC-Chess/FC-Chess.cpp @@ -177,63 +177,45 @@ void FCC::Chess::checkMovesDiagonal() void FCC::Chess::checkMovesKnight() { - // creating variables for x and y - uint8_t i = selX, j = selY; - // checking possible moves - i += 1, j += 3; - if (checkIsPosInBounds(i, j)) + if (checkIsPosInBounds(selX + 1, selY + 3)) { - if (!checkIsFriendlyOnField(i, j)) posPossible[i][j] = true; + if (!checkIsFriendlyOnField(selX + 1, selY + 3)) posPossible[selX + 1][selY + 3] = true; } - i = selX, j = selY; // resetting variables - i += 1, j -= 3; - if (checkIsPosInBounds(i, j)) + if (checkIsPosInBounds(selX + 1, selY - 3)) { - if (!checkIsFriendlyOnField(i, j)) posPossible[i][j] = true; + if (!checkIsFriendlyOnField(selX + 1, selY - 3)) posPossible[selX + 1][selY - 3] = true; + } + + if (checkIsPosInBounds(selX - 1, selY + 3)) + { + if (!checkIsFriendlyOnField(selX - 1, selY + 3)) posPossible[selX - 1][selY + 3] = true; } - i = selX, j = selY; // resetting variables - i -= 1, j += 3; - if (checkIsPosInBounds(i, j)) + if (checkIsPosInBounds(selX - 1, selY - 3)) { - if (!checkIsFriendlyOnField(i, j)) posPossible[i][j] = true; + if (!checkIsFriendlyOnField(selX - 1, selY - 3)) posPossible[selX - 1][selY - 3] = true; } - i = selX, j = selY; // resetting variables - i -= 1, j -= 3; - if (checkIsPosInBounds(i, j)) + if (checkIsPosInBounds(selX + 3, selY + 1)) { - if (!checkIsFriendlyOnField(i, j)) posPossible[i][j] = true; + if (!checkIsFriendlyOnField(selX + 3, selY + 1)) posPossible[selX + 3][selY + 1] = true; } - i = selX, j = selY; // resetting variables - i += 3, j += 1; - if (checkIsPosInBounds(i, j)) + if (checkIsPosInBounds(selX + 3, selY - 1)) { - if (!checkIsFriendlyOnField(i, j)) posPossible[i][j] = true; + if (!checkIsFriendlyOnField(selX + 3, selY - 1)) posPossible[selX + 3][selY - 1] = true; } - - i = selX, j = selY; // resetting variables - i += 3, j -= 1; - if (checkIsPosInBounds(i, j)) + + if (checkIsPosInBounds(selX - 3, selY + 1)) { - if (!checkIsFriendlyOnField(i, j)) posPossible[i][j] = true; + if (!checkIsFriendlyOnField(selX - 3, selY + 1)) posPossible[selX - 3][selY + 1] = true; } - - i = selX, j = selY; // resetting variables - i -= 3, j += 1; - if (checkIsPosInBounds(i, j)) + + if (checkIsPosInBounds(selX - 3, selY - 1)) { - if (!checkIsFriendlyOnField(i, j)) posPossible[i][j] = true; - } - - i = selX, j = selY; // resetting variables - i -= 3, j -= 1; - if (checkIsPosInBounds(i, j)) - { - if (!checkIsFriendlyOnField(i, j)) posPossible[i][j] = true; + if (!checkIsFriendlyOnField(selX - 3, selY - 1)) posPossible[selX - 3][selY - 1] = true; } } From e5cb9a23c0a1380db04514fca0be92a77987b055 Mon Sep 17 00:00:00 2001 From: AdmiralEmser Date: Sat, 29 Oct 2022 12:43:35 +0200 Subject: [PATCH 4/4] reworked loops and removed unnecessary vars --- FC-Chess/FC-Chess.cpp | 91 ++++++++++++++++++------------------------- 1 file changed, 38 insertions(+), 53 deletions(-) diff --git a/FC-Chess/FC-Chess.cpp b/FC-Chess/FC-Chess.cpp index 7cea854..86769f4 100644 --- a/FC-Chess/FC-Chess.cpp +++ b/FC-Chess/FC-Chess.cpp @@ -212,7 +212,7 @@ void FCC::Chess::checkMovesKnight() { if (!checkIsFriendlyOnField(selX - 3, selY + 1)) posPossible[selX - 3][selY + 1] = true; } - + if (checkIsPosInBounds(selX - 3, selY - 1)) { if (!checkIsFriendlyOnField(selX - 3, selY - 1)) posPossible[selX - 3][selY - 1] = true; @@ -221,38 +221,33 @@ void FCC::Chess::checkMovesKnight() void FCC::Chess::checkMovesKing() { - // creating variables for x and y - uint8_t i, j; - // checking possible moves - i = selX - 1, j = selY + 1; - for (; i <= selX + 1; i++) + // rows above and below + for (int8_t i = selX - 1; i <= selX + 1; i++) { - if (checkIsPosInBounds(i, j)) + // row above + if (checkIsPosInBounds(i, selY + 1)) { - if (!checkIsFriendlyOnField(i, j)) posPossible[i][j] = true; + if (!checkIsFriendlyOnField(i, selY + 1)) posPossible[i][selY + 1] = true; + } + + // row below + if (checkIsPosInBounds(i, selY - 1)) + { + if (!checkIsFriendlyOnField(i, selY - 1)) posPossible[i][selY - 1] = true; } } - i = selX - 1, j = selY - 1; - for (; i <= selX + 1; i++) + // left + if (checkIsPosInBounds(selX - 1, selY)) { - if (checkIsPosInBounds(i, j)) - { - if (!checkIsFriendlyOnField(i, j)) posPossible[i][j] = true; - } + if (!checkIsFriendlyOnField(selX - 1, selY)) posPossible[selX - 1][selY] = true; } - i = selX - 1, j = selY; - if (checkIsPosInBounds(i, j)) + // right + if (checkIsPosInBounds(selX + 1, selY)) { - if (!checkIsFriendlyOnField(i, j)) posPossible[i][j] = true; - } - - i = selX + 1, j = selY; - if (checkIsPosInBounds(i, j)) - { - if (!checkIsFriendlyOnField(i, j)) posPossible[i][j] = true; + if (!checkIsFriendlyOnField(selX + 1, selY)) posPossible[selX + 1][selY] = true; } } @@ -261,48 +256,40 @@ void FCC::Chess::checkMovesPawn() // black pieces if (posColor[selX][selY] == FCC::PiecesColors::BLACK) { - // creating variables for x and y - uint8_t i, j; - // checking possible moves - i = selX - 1, j = selY - 1; - for (; i <= selX + 1;) + // left and right for enemy pieces + for (uint8_t i = selX - 1; i <= selX + 1; i += 2) { - if (checkIsPosInBounds(i, j)) + if (checkIsPosInBounds(i, selY - 1)) { - if (checkIsEnemyOnField(i, j)) posPossible[i][j] = true; + if (checkIsEnemyOnField(i, selY - 1)) posPossible[i][selY - 1] = true; } - i += 2; } - i = selX, j = selY - 1; - if (checkIsPosInBounds(i, j)) + // standard move to the front + if (checkIsPosInBounds(selX, selY - 1)) { - if (checkIsPositionClear(i, j)) posPossible[i][j] = true; + if (checkIsPositionClear(selX, selY - 1)) posPossible[selX][selY - 1] = true; } } // white pieces if (posColor[selX][selY] == FCC::PiecesColors::WHITE) { - // creating variables for x and y - uint8_t i, j; - // checking possible moves - i = selX - 1, j = selY + 1; - for (; i <= selX + 1;) + // left and right for enemy pieces + for (uint8_t i = selX - 1; i <= selX + 1; i += 2) { - if (checkIsPosInBounds(i, j)) + if (checkIsPosInBounds(i, selY + 1)) { - if (checkIsEnemyOnField(i, j)) posPossible[i][j] = true; + if (checkIsEnemyOnField(i, selY + 1)) posPossible[i][selY + 1] = true; } - i += 2; } - i = selX, j = selY + 1; - if (checkIsPosInBounds(i, j)) + // standard move to the front + if (checkIsPosInBounds(selX, selY + 1)) { - if (checkIsPositionClear(i, j)) posPossible[i][j] = true; + if (checkIsPositionClear(selX, selY + 1)) posPossible[selX][selY + 1] = true; } } } @@ -313,14 +300,12 @@ bool FCC::Chess::checkIsPawnChangingToQueen() if (posColor[selX][selY] == FCC::PiecesColors::BLACK) { if (selY == 0) return true; - return false; - } - - // white pieces - if (posColor[selX][selY] == FCC::PiecesColors::WHITE) - { - if (selY == 7) return true; - return false; + } else { + // white pieces + if (posColor[selX][selY] == FCC::PiecesColors::WHITE) + { + if (selY == 7) return true; + } } // no piece at all