-
-
Save geocachecs/d8d2f402b0843231231b to your computer and use it in GitHub Desktop.
| #include "chess.h" | |
| Square::Square() | |
| { | |
| piece = EMPTY; | |
| color = NONE; | |
| } | |
| void Square::setSpace(Square* space) | |
| { | |
| color = space->getColor(); | |
| piece = space->getPiece(); | |
| } | |
| void Square::setEmpty() | |
| { | |
| color = NONE; | |
| piece = EMPTY; | |
| } | |
| Piece Square::getPiece() | |
| { | |
| return piece; | |
| } | |
| Color Square::getColor() | |
| { | |
| return color; | |
| } | |
| void Square::setPieceAndColor(Piece p, Color c) | |
| { | |
| piece = p; | |
| color = c; | |
| } | |
| void Board::printBoard() { | |
| using namespace std; | |
| cout << " y: 0 1 2 3 4 5 6 7 " << endl << "x:" << endl; | |
| for (int i = 0; i < 8; i++) | |
| { | |
| cout << " " << i << " "; | |
| for (int j = 0; j < 8; j++) | |
| { | |
| Piece p = square[i][j].getPiece(); | |
| Color c = square[i][j].getColor(); | |
| switch (p) | |
| { | |
| case KING: (c == WHITE) ? cout << " K " : cout << " k "; | |
| break; | |
| case QUEEN: (c == WHITE) ? cout << " Q " : cout << " q "; | |
| break; | |
| case BISHOP:(c == WHITE) ? cout << " B " : cout << " b "; | |
| break; | |
| case KNIGHT:(c == WHITE) ? cout << " H " : cout << " h "; | |
| break; | |
| case ROOK: (c == WHITE) ? cout << " R " : cout << " r "; | |
| break; | |
| case PAWN: (c == WHITE) ? cout << " P " : cout << " p "; | |
| break; | |
| case EMPTY: cout << " " << "\21" << " "; | |
| break; | |
| default: cout << "XXX"; | |
| break; | |
| } | |
| } | |
| cout << endl; | |
| } | |
| } | |
| bool Board::doMove() { | |
| using namespace std; | |
| string move; | |
| int x1, x2, y1, y2; | |
| bool stop = false; | |
| while (!stop) | |
| { | |
| (turn == WHITE) ? cout << "White's turn" << endl : cout << "Black's turn" << endl; | |
| cout << "Type in your move as a single four character string. Use x-coordinates first in each pair." << endl; | |
| cin >> move; | |
| x1 = move[0] - 48; | |
| y1 = move[1] - 48; | |
| x2 = move[2] - 48; | |
| y2 = move[3] - 48; | |
| if (getSquare(x1, y1)->getColor() == turn) | |
| { | |
| if (makeMove(x1, y1, x2, y2) == false) | |
| { | |
| cout << "Invalid move, try again." << endl; | |
| } | |
| else | |
| stop = true; | |
| } | |
| else | |
| cout << "That's not your piece. Try again." << endl; | |
| } | |
| if (getSquare(x2, y2)->getPiece() == KING) | |
| if (getSquare(x1, y1)->getColor() == WHITE) | |
| { | |
| cout << "WHITE WINS" << endl; | |
| return false; | |
| } | |
| else | |
| { | |
| cout << "BLACK WINS" << endl; | |
| return false; | |
| } | |
| if (turn == BLACK) | |
| turn = WHITE; | |
| else | |
| turn = BLACK; | |
| return true; | |
| } | |
| void Board::setBoard() | |
| { | |
| square[0][0].setPieceAndColor(ROOK, WHITE); | |
| square[1][0].setPieceAndColor(KNIGHT, WHITE); | |
| square[2][0].setPieceAndColor(BISHOP, WHITE); | |
| square[3][0].setPieceAndColor(QUEEN, WHITE); | |
| square[4][0].setPieceAndColor(KING, WHITE); | |
| square[5][0].setPieceAndColor(BISHOP, WHITE); | |
| square[6][0].setPieceAndColor(KNIGHT, WHITE); | |
| square[7][0].setPieceAndColor(ROOK, WHITE); | |
| square[0][7].setPieceAndColor(ROOK, BLACK); | |
| square[1][7].setPieceAndColor(KNIGHT, BLACK); | |
| square[2][7].setPieceAndColor(BISHOP, BLACK); | |
| square[3][7].setPieceAndColor(QUEEN, BLACK); | |
| square[4][7].setPieceAndColor(KING, BLACK); | |
| square[5][7].setPieceAndColor(BISHOP, BLACK); | |
| square[6][7].setPieceAndColor(KNIGHT, BLACK); | |
| square[7][7].setPieceAndColor(ROOK, BLACK); | |
| for (int i = 0; i < 8; i++) | |
| { | |
| square[i][1].setPieceAndColor(PAWN, WHITE); | |
| square[i][6].setPieceAndColor(PAWN, BLACK); | |
| } | |
| for (int i = 2; i < 6; i++) | |
| { | |
| for (int j = 0; j < 8; j++) | |
| square[j][i].setPieceAndColor(EMPTY, NONE); | |
| } | |
| for (int i = 0; i < 8; i++) | |
| for (int j = 0; j < 8; j++) | |
| { | |
| square[i][j].setX(i); | |
| square[i][j].setY(j); | |
| } | |
| } | |
| bool Board::playGame() | |
| { | |
| system("cls"); | |
| printBoard(); | |
| return doMove(); | |
| } | |
| bool Board::moveKing(Square* thisKing, Square* thatSpace) { | |
| //off board inputs should be handled elsewhere (before this) | |
| //squares with same color should be handled elsewhere (before this) | |
| if (abs(thatSpace->getX() - thisKing->getX()) == 1) | |
| if (abs(thatSpace->getY() - thisKing->getY()) == 1) | |
| { | |
| thatSpace->setSpace(thisKing); | |
| thisKing->setEmpty(); | |
| return true; | |
| } | |
| else return false; | |
| else return false; | |
| } | |
| bool Board::moveQueen(Square* thisQueen, Square* thatSpace) { //there might be problems with numbers of brackets | |
| //off board inputs should be handled elsewhere (before this) | |
| //squares with same color should be handled elsewhere (before this) | |
| int queenX = thisQueen->getX(); | |
| int queenY = thisQueen->getY(); | |
| int thatX = thatSpace->getX(); | |
| int thatY = thatSpace->getY(); | |
| std::cout << "this"; | |
| int yIncrement; | |
| int xIncrement; | |
| bool invalid = false; | |
| if (queenX != thatX || queenY != thatY) | |
| { | |
| if (queenX == thatX) | |
| { | |
| yIncrement = (thatY - queenY) / (abs(thatY - queenY)); | |
| for (int i = queenY + yIncrement; i != thatY; i += yIncrement) | |
| { | |
| if (square[thatX][i].getColor() != NONE) | |
| return false; | |
| } | |
| } | |
| else | |
| if (queenY == thatY) | |
| { | |
| xIncrement = (thatX - queenX) / (abs(thatX - queenX)); | |
| for (int i = queenX + xIncrement; i != thatX; i += xIncrement) | |
| { | |
| if (square[i][thatY].getColor() != NONE) | |
| return false; | |
| } | |
| } | |
| else | |
| if (abs(queenX - thatX) == abs(queenY - thatY)) | |
| { | |
| xIncrement = (thatX - queenX) / (abs(thatX - queenX)); | |
| yIncrement = (thatY - queenY) / (abs(thatY - queenY)); | |
| for (int i = 1; i < abs(queenX - thatX); i++) | |
| { | |
| std::cout << "It got here somehow"; | |
| if (square[queenX + xIncrement*i][queenY + yIncrement*i].getColor() != NONE) | |
| return false; | |
| } | |
| } | |
| else | |
| return false; | |
| //if() | |
| } | |
| if (invalid == false) | |
| { | |
| thatSpace->setSpace(thisQueen); | |
| thisQueen->setEmpty(); | |
| return true; | |
| } | |
| else | |
| { | |
| return false; | |
| } | |
| } | |
| bool Board::moveBishop(Square* thisBishop, Square* thatSpace) { //there might be problems with number of brackets | |
| int bishopX = thisBishop->getX(); | |
| int bishopY = thisBishop->getY(); | |
| int thatX = thatSpace->getX(); | |
| int thatY = thatSpace->getY(); | |
| bool invalid = false; | |
| Square *s; | |
| if (abs(bishopX - thatX) == abs(bishopY - thatY)) | |
| { | |
| int xIncrement = (thatX - bishopX) / (abs(thatX - bishopX)); | |
| int yIncrement = (thatY - bishopY) / (abs(thatY - bishopY)); | |
| for (int i = 1; i < abs(bishopX - thatX); i++) | |
| { | |
| std::cout << "It got here somehow"; | |
| if (square[bishopX + xIncrement*i][bishopY + yIncrement*i].getColor() != NONE) | |
| return false; | |
| } | |
| } | |
| else | |
| return false; | |
| if (invalid == false) | |
| { | |
| thatSpace->setSpace(thisBishop); | |
| thisBishop->setEmpty(); | |
| return true; | |
| } | |
| else | |
| { | |
| return false; | |
| } | |
| } | |
| bool Board::moveKnight(Square* thisKnight, Square* thatSpace) | |
| { | |
| //off board inputs should be handled elsewhere (before this) | |
| //squares with same color should be handled elsewhere (before this) | |
| int knightX = thisKnight->getX(); | |
| int knightY = thisKnight->getY(); | |
| int thatX = thatSpace->getX(); | |
| int thatY = thatSpace->getY(); | |
| if ((abs(knightX - thatX) == 2 && abs(knightY - thatY) == 1) || (abs(knightX - thatX) == 1 && abs(knightY - thatY) == 2)) | |
| { | |
| thatSpace->setSpace(thisKnight); | |
| thisKnight->setEmpty(); | |
| return true; | |
| } | |
| else | |
| { | |
| return false; | |
| } | |
| } | |
| bool Board::moveRook(Square* thisRook, Square* thatSpace) | |
| { | |
| //off board inputs should be handled elsewhere (before this) | |
| //squares with same color should be handled elsewhere (before this) | |
| int rookX = thisRook->getX(); | |
| int rookY = thisRook->getY(); | |
| int thatX = thatSpace->getX(); | |
| int thatY = thatSpace->getY(); | |
| bool invalid = false; | |
| if (rookX != thatX || rookY != thatY) | |
| { | |
| if (rookX == thatX) | |
| { | |
| int yIncrement = (thatY - rookY) / (abs(thatY - rookY)); | |
| for (int i = rookY + yIncrement; i != thatY; i += yIncrement) | |
| { | |
| if (square[thatX][i].getColor() != NONE) | |
| return false; | |
| } | |
| } | |
| else | |
| if (rookY == thatY) | |
| { | |
| int xIncrement = (thatX - rookX) / (abs(thatX - rookX)); | |
| for (int i = rookX + xIncrement; i != thatX; i += xIncrement) | |
| { | |
| if (square[i][thatY].getColor() != NONE) | |
| return false; | |
| } | |
| } | |
| else | |
| return false; | |
| } | |
| if (invalid == false) | |
| { | |
| thatSpace->setSpace(thisRook); | |
| thisRook->setEmpty(); | |
| return true; | |
| } | |
| else | |
| {//Return some erorr or something. Probably return false; | |
| std::cout << "That is an invalid move for rook"; | |
| return false; | |
| } | |
| } | |
| bool Board::movePawn(Square* thisPawn, Square* thatSpace) { | |
| //off board inputs should be handled elsewhere (before this) | |
| //squares with same color should be handled elsewhere (before this) | |
| using namespace std; | |
| bool invalid = false; | |
| int pawnX = thisPawn->getX(); | |
| int pawnY = thisPawn->getY(); | |
| int thatX = thatSpace->getX(); | |
| int thatY = thatSpace->getY(); | |
| if (thisPawn->getColor() == WHITE) | |
| { | |
| if (pawnX == thatX && thatY == pawnY + 1 && thatSpace->getColor() == NONE) | |
| { | |
| thatSpace->setSpace(thisPawn); | |
| thisPawn->setEmpty(); | |
| return true; | |
| } | |
| else | |
| if ((pawnX + 1 == thatX || pawnX - 1 == thatX) && pawnY + 1 == thatY && thatSpace->getColor() == BLACK) | |
| { | |
| thatSpace->setSpace(thisPawn); | |
| thisPawn->setEmpty(); | |
| return true; | |
| } | |
| else | |
| return false; | |
| } | |
| else | |
| if (thisPawn->getColor() == BLACK) | |
| { | |
| if (pawnX == thatX && thatY == pawnY - 1 && thatSpace->getColor() == NONE) | |
| { | |
| thatSpace->setSpace(thisPawn); | |
| thisPawn->setEmpty(); | |
| return true; | |
| } | |
| else | |
| if ((pawnX + 1 == thatX || pawnX - 1 == thatX) && pawnY - 1 == thatY && thatSpace->getColor() == WHITE) | |
| { | |
| thatSpace->setSpace(thisPawn); | |
| thisPawn->setEmpty(); | |
| return true; | |
| } | |
| else | |
| return false; | |
| } | |
| else | |
| return false; | |
| } | |
| bool Board::makeMove(int x1, int y1, int x2, int y2) { | |
| //Checking for turns will be done previous to this | |
| using namespace std; | |
| if (x1 < 0 || x1>7 || y1 < 0 || y1>7 || x2 < 0 || x2>7 || y2 < 0 || y2>8) | |
| { | |
| std::cout << "One of your inputs was our of bounds" << std::endl; | |
| return false; | |
| } | |
| Square* src = getSquare(x1, y1); | |
| Square* dest = getSquare(x2, y2); | |
| if (src->getColor() == dest->getColor() && dest->getColor() != NONE) | |
| { | |
| std::cout << "Invalid move: cannot land on your own piece" << std::endl; | |
| return false; | |
| } | |
| switch (src->getPiece()) | |
| { | |
| case KING: return moveKing(src, dest); | |
| break; | |
| case QUEEN: return moveQueen(src, dest); | |
| break; | |
| case BISHOP: return moveBishop(src, dest); | |
| break; | |
| case KNIGHT: return moveKnight(src, dest); | |
| break; | |
| case ROOK: return moveRook(src, dest); | |
| break; | |
| case PAWN: return movePawn(src, dest); | |
| break; | |
| case EMPTY: std::cout << "You do not have a piece there" << std::endl; return false; | |
| break; | |
| default: std::cerr << "Something went wrong in the switch statement in makeMove()" << std::endl; | |
| break; | |
| } | |
| return false; | |
| } |
| #pragma once | |
| #include <iostream> | |
| #include <cmath> | |
| #include <string> | |
| enum Piece { KING, QUEEN, BISHOP, KNIGHT, ROOK, PAWN, EMPTY }; | |
| enum Color { WHITE, BLACK, NONE }; | |
| class Square | |
| { | |
| Piece piece; | |
| Color color; | |
| int x, y; | |
| public: | |
| void setSpace(Square*); | |
| void setEmpty(); | |
| void setPieceAndColor(Piece, Color); | |
| Piece getPiece(); | |
| Color getColor(); | |
| void setX(int ex) { x = ex; } | |
| void setY(int why) { y = why; } | |
| int getX() { return x; } | |
| int getY() { return y; } | |
| Square(); | |
| }; | |
| class Board | |
| { | |
| Square square[8][8]; | |
| Color turn=WHITE; | |
| bool moveKing(Square* thisKing, Square* thatSpace); | |
| bool moveQueen(Square* thisQueen, Square* thatSpace); | |
| bool moveBishop(Square* thisBishop, Square* thatSpace); | |
| bool moveKnight(Square* thisKnight, Square* thatSpace); | |
| bool moveRook(Square* thisRook, Square* thatSpace); | |
| bool movePawn(Square* thisPawn, Square* thatSpace); | |
| bool makeMove(int x1, int y1, int x2, int y2); | |
| void printBoard(); | |
| public: | |
| Square* getSquare(int x, int y) { | |
| return &square[x][y]; | |
| } | |
| void setSquare(Square * s, int x, int y){ | |
| square[x][y]=*s; | |
| } | |
| bool doMove(); | |
| void setBoard(); | |
| bool playGame(); | |
| }; | |
| #include <iostream> | |
| #include <string> | |
| #include "chess.h" | |
| using namespace std; | |
| int main() | |
| { | |
| Board b; | |
| string s; | |
| bool newgame = true; | |
| cout << " _____ _ _ ______ _____ _____ \n / ____| | | | ____|/ ____/ ____| \n | | | |__| | |__ | (___| (___ \n | | | __ | __| \\___ \\___ \\ \n | |____| | | | |____ ____) |___) | \n \\_____|_| |_|______|_____/_____/ \n" << endl; | |
| cout << "A game by George Harter"<<endl; | |
| cout << "Enter any key to continue" << endl; | |
| cin >> s; | |
| while(newgame){ | |
| b.setBoard(); | |
| while (b.playGame()); | |
| cout << "Do you want to play again? (y for yes, anything else for no) "; | |
| cin >> s; | |
| if (s != "y") | |
| newgame = false; | |
| } | |
| return 0; | |
| } |
Cool
what is Sqare* in
void Square::setSpace(Square* space)
{
color = space->getColor();
piece = space->getPiece();
}
how to enter a move?
how to enter a move? need it asap
what is Sqare* in void Square::setSpace(Square* space) { color = space->getColor(); piece = space->getPiece(); }
space is a pointer of type Square which can point to the member variables & functions of class Square.
a
how to make a move
Line 180/181, in chess.cpp : both "if" should be combined with an "or" gate like written below :
if ((abs(thatSpace->getX() - thisKing->getX()) == 1) || (abs(thatSpace->getY() - thisKing->getY()) == 1))
Or else, you wont be able to move the king up, down, left or right !
❌ Missing Features (Optional to Add)
No input validation for bad characters
No move logging/history
No check/checkmate logic
No castling
No pawn promotion
No en passant
Noob Code Hai
nice :)