diff options
sem 16
16 files changed, 257 insertions, 76 deletions
| -rw-r--r-- | Sem. 15/Chess/ChessBoard/ChessBoard.cpp | 58 | ||||
| -rw-r--r-- | Sem. 15/Chess/ChessBoard/ChessBoard.h | 3 | ||||
| -rw-r--r-- | Sem. 15/Chess/ConfigEnums/ConfigEnums.h | 11 | ||||
| -rw-r--r-- | Sem. 15/Chess/FigureFactory/FigureFactory.cpp | 43 | ||||
| -rw-r--r-- | Sem. 15/Chess/FigureFactory/FigureFactory.h | 8 | ||||
| -rw-r--r-- | Sem. 15/Chess/Figures/Bishop/Bishop.cpp | 2 | ||||
| -rw-r--r-- | Sem. 15/Chess/Figures/FigureBase/Figure.h | 6 | ||||
| -rw-r--r-- | Sem. 15/Chess/Figures/King/King.cpp | 2 | ||||
| -rw-r--r-- | Sem. 15/Chess/Figures/Knight/Knight.cpp | 2 | ||||
| -rw-r--r-- | Sem. 15/Chess/Figures/Pawn/Pawn.cpp | 25 | ||||
| -rw-r--r-- | Sem. 15/Chess/Figures/Queen/Queen.cpp | 2 | ||||
| -rw-r--r-- | Sem. 15/Chess/Figures/Rook/Rook.cpp | 2 | ||||
| -rw-r--r-- | Sem. 15/Chess/main.cpp | 4 | ||||
| -rw-r--r-- | Sem. 16/LogicExpressions/LogicExpr.h | 150 | ||||
| -rw-r--r-- | Sem. 16/README.md | 0 | ||||
| -rw-r--r-- | Sem. 16/Source.cpp | 15 |
diff --git a/Sem. 15/Chess/ChessBoard/ChessBoard.cpp b/Sem. 15/Chess/ChessBoard/ChessBoard.cpp index dc809cc..2c618bd 100644 --- a/Sem. 15/Chess/ChessBoard/ChessBoard.cpp +++ b/Sem. 15/Chess/ChessBoard/ChessBoard.cpp @@ -3,34 +3,34 @@ ChessBoard::ChessBoard() { - FigureFactory factory; + for (int i = 0; i < BOARD_SIZE; i++) { - board[1][i].f = factory.createPawn(false); - board[6][i].f = factory.createPawn(true); + board[1][i].f = FigureFactory::createFigure(false, PawnFigure); + board[6][i].f = FigureFactory::createFigure(true, PawnFigure); } - board[0][0].f = factory.createRook(false); - board[0][7].f = factory.createRook(false); + board[0][0].f = FigureFactory::createFigure(false, RookFigure); + board[0][7].f = FigureFactory::createFigure(false, RookFigure); - board[7][0].f = factory.createRook(true); - board[7][7].f = factory.createRook(true); + board[7][0].f = FigureFactory::createFigure(true, RookFigure); + board[7][7].f = FigureFactory::createFigure(true, RookFigure); - board[0][1].f = factory.createKnight(false); - board[0][6].f = factory.createKnight(false); - board[7][1].f = factory.createKnight(true); - board[7][6].f = factory.createKnight(true); + board[0][1].f = FigureFactory::createFigure(false, KnightFigure); + board[0][6].f = FigureFactory::createFigure(false, KnightFigure); + board[7][1].f = FigureFactory::createFigure(true, KnightFigure);; + board[7][6].f = FigureFactory::createFigure(true, KnightFigure); - board[0][2].f = factory.createBishop(false); - board[0][5].f = factory.createBishop(false); - board[7][2].f = factory.createBishop(true); - board[7][5].f = factory.createBishop(true); + board[0][2].f = FigureFactory::createFigure(false, BishopFigure); + board[0][5].f = FigureFactory::createFigure(false, BishopFigure);; + board[7][2].f = FigureFactory::createFigure(true, BishopFigure); + board[7][5].f = FigureFactory::createFigure(true, BishopFigure); - board[0][3].f = factory.createKnig(false); - board[0][4].f = factory.createQueen(false); - board[7][4].f = factory.createQueen(true); - board[7][3].f = factory.createKnig(true); + board[0][3].f = FigureFactory::createFigure(false, KingFigure); + board[0][4].f = FigureFactory::createFigure(false, QueenFigure); + board[7][4].f = FigureFactory::createFigure(true, QueenFigure); + board[7][3].f = FigureFactory::createFigure(true, KingFigure); } void ChessBoard::print() const @@ -43,4 +43,24 @@ void ChessBoard::print() const } std::cout << std::endl; } +} + +void ChessBoard::move(size_t x, size_t y, size_t destX, size_t destY) +{ + + Figure* current = board[x][y].f; + + if (current->getType() == PawnFigure) + { + //Some logic..... + } + else + { + if (board[x][y].f && board[x][y].f->canBeMoved(x, y, destX, destY)) + { + board[destX][destY].f = board[x][y].f; + board[x][y].f = nullptr; + } + } + }
\ No newline at end of file diff --git a/Sem. 15/Chess/ChessBoard/ChessBoard.h b/Sem. 15/Chess/ChessBoard/ChessBoard.h index d2bf81f..e38acd5 100644 --- a/Sem. 15/Chess/ChessBoard/ChessBoard.h +++ b/Sem. 15/Chess/ChessBoard/ChessBoard.h @@ -37,6 +37,7 @@ public: ChessBoard& operator=(const ChessBoard&) = delete; void print() const; + + void move(size_t x, size_t y, size_t destX, size_t destY); - //TODO. Free memory? }; diff --git a/Sem. 15/Chess/ConfigEnums/ConfigEnums.h b/Sem. 15/Chess/ConfigEnums/ConfigEnums.h new file mode 100644 index 0000000..c3448e8 --- /dev/null +++ b/Sem. 15/Chess/ConfigEnums/ConfigEnums.h @@ -0,0 +1,11 @@ +#pragma once + +enum FigureType +{ + KingFigure, + QueenFigure, + KnightFigure, + BishopFigure, + PawnFigure, + RookFigure +};
\ No newline at end of file diff --git a/Sem. 15/Chess/FigureFactory/FigureFactory.cpp b/Sem. 15/Chess/FigureFactory/FigureFactory.cpp index db70d1e..e9db605 100644 --- a/Sem. 15/Chess/FigureFactory/FigureFactory.cpp +++ b/Sem. 15/Chess/FigureFactory/FigureFactory.cpp @@ -6,31 +6,22 @@ #include "../Figures/Queen/Queen.h" #include "../Figures/Pawn/Pawn.h" -Figure* FigureFactory::createPawn(bool isWhite) +Figure* FigureFactory::createFigure(bool isWhite, FigureType type) { - return new Pawn(isWhite); -} -Figure* FigureFactory::createBishop(bool isWhite) -{ - return new Bishop(isWhite); -} -Figure* FigureFactory::createRook(bool isWhite) -{ - return new Rook(isWhite); -} -Figure* createQueen(bool isWhite) -{ - return new Queen(isWhite); -} -Figure* FigureFactory::createKnight(bool isWhite) -{ - return new Knight(isWhite); -} -Figure* FigureFactory::createKnig(bool isWhite) -{ - return new King(isWhite); -} -Figure* FigureFactory::createQueen(bool isWhite) -{ - return new Queen(isWhite); + + switch (type) + { + case KingFigure: + return new King(isWhite); + case QueenFigure: + return new Queen(isWhite); + case KnightFigure: + return new Knight(isWhite); + case BishopFigure: + return new Bishop(isWhite); + case PawnFigure: + return new Pawn(isWhite); + case RookFigure: + return new Rook(isWhite); + } }
\ No newline at end of file diff --git a/Sem. 15/Chess/FigureFactory/FigureFactory.h b/Sem. 15/Chess/FigureFactory/FigureFactory.h index da5b4db..012a60c 100644 --- a/Sem. 15/Chess/FigureFactory/FigureFactory.h +++ b/Sem. 15/Chess/FigureFactory/FigureFactory.h @@ -1,13 +1,9 @@ #pragma once #include "../Figures/FigureBase/Figure.h" +#include "../ConfigEnums/ConfigEnums.h" class FigureFactory { public: - Figure* createPawn(bool isWhite); - Figure* createBishop(bool isWhite); - Figure* createRook(bool isWhite); - Figure* createQueen(bool isWhite); - Figure* createKnight(bool isWhite); - Figure* createKnig(bool isWhite); + static Figure* createFigure(bool isWhite, FigureType); //enum };
\ No newline at end of file diff --git a/Sem. 15/Chess/Figures/Bishop/Bishop.cpp b/Sem. 15/Chess/Figures/Bishop/Bishop.cpp index 80121e2..786c9eb 100644 --- a/Sem. 15/Chess/Figures/Bishop/Bishop.cpp +++ b/Sem. 15/Chess/Figures/Bishop/Bishop.cpp @@ -1,7 +1,7 @@ #include "Bishop.h" #include <cmath> -Bishop::Bishop(bool isWhite) : Figure(isWhite) +Bishop::Bishop(bool isWhite) : Figure(isWhite, RookFigure) {} bool Bishop::canBeMoved(size_t currentX, size_t currentY, size_t destX, size_t destY) const { diff --git a/Sem. 15/Chess/Figures/FigureBase/Figure.h b/Sem. 15/Chess/Figures/FigureBase/Figure.h index c0a84a5..3e0bc07 100644 --- a/Sem. 15/Chess/Figures/FigureBase/Figure.h +++ b/Sem. 15/Chess/Figures/FigureBase/Figure.h @@ -1,16 +1,20 @@ #pragma once #include <iostream> +#include "../../ConfigEnums/ConfigEnums.h" class Figure { bool isWhite; + FigureType type; + public: - Figure(bool isWhite) :isWhite(isWhite) + Figure(bool isWhite, FigureType type) :isWhite(isWhite), type(type) {} virtual bool canBeMoved(size_t currentX, size_t currentY, size_t destX, size_t destY) const = 0; virtual void print() const = 0; bool getIsWhite() const { return isWhite; }; + FigureType getType() const { return type; } virtual ~Figure(){}; };
\ No newline at end of file diff --git a/Sem. 15/Chess/Figures/King/King.cpp b/Sem. 15/Chess/Figures/King/King.cpp index 9d323f3..8ca67e8 100644 --- a/Sem. 15/Chess/Figures/King/King.cpp +++ b/Sem. 15/Chess/Figures/King/King.cpp @@ -1,7 +1,7 @@ #include "King.h" #include <cmath> -King::King(bool isWhite) : Figure(isWhite) +King::King(bool isWhite) : Figure(isWhite, KingFigure) {} bool King::canBeMoved(size_t currentX, size_t currentY, size_t destX, size_t destY) const { diff --git a/Sem. 15/Chess/Figures/Knight/Knight.cpp b/Sem. 15/Chess/Figures/Knight/Knight.cpp index e6db119..5713d7c 100644 --- a/Sem. 15/Chess/Figures/Knight/Knight.cpp +++ b/Sem. 15/Chess/Figures/Knight/Knight.cpp @@ -1,7 +1,7 @@ #include "Knight.h" #include <cmath> -Knight::Knight(bool isWhite) : Figure(isWhite) +Knight::Knight(bool isWhite) : Figure(isWhite, KnightFigure) {} bool Knight::canBeMoved(size_t currentX, size_t currentY, size_t destX, size_t destY) const { diff --git a/Sem. 15/Chess/Figures/Pawn/Pawn.cpp b/Sem. 15/Chess/Figures/Pawn/Pawn.cpp index fd04dad..347032b 100644 --- a/Sem. 15/Chess/Figures/Pawn/Pawn.cpp +++ b/Sem. 15/Chess/Figures/Pawn/Pawn.cpp @@ -1,27 +1,16 @@ #include "Pawn.h" #include <cmath> -Pawn::Pawn(bool isWhite) : Figure(isWhite), isFirstMove(true) +Pawn::Pawn(bool isWhite) : Figure(isWhite, PawnFigure), isFirstMove(true) {} + bool Pawn::canBeMoved(size_t currentX, size_t currentY, size_t destX, size_t destY) const { - /*if (currentX != destX) - return false; - - int diff = destY - currentY; - - if (abs(diff) > 2) - return false; - - if (diff < 0 && getIsWhite() || diff > 0 && !getIsWhite()) - return false; - - if (!abs(diff) == 2 || isFirstMove) - { - return true; - } - return false;*/ - return false; + if (getIsWhite()) + return currentY - 1 == destY && abs((int)currentX - (int)destX) <= 1; + else + return currentY + 1 == destY && abs((int)currentX - (int)destX) <= 1; } + void Pawn::print() const { if (getIsWhite()) diff --git a/Sem. 15/Chess/Figures/Queen/Queen.cpp b/Sem. 15/Chess/Figures/Queen/Queen.cpp index da49c1c..0e33198 100644 --- a/Sem. 15/Chess/Figures/Queen/Queen.cpp +++ b/Sem. 15/Chess/Figures/Queen/Queen.cpp @@ -1,6 +1,6 @@ #include "Queen.h" -Queen::Queen(bool isWhite) : Bishop(isWhite), Rook(isWhite), Figure(isWhite) +Queen::Queen(bool isWhite) : Bishop(isWhite), Rook(isWhite), Figure(isWhite, QueenFigure) {} bool Queen::canBeMoved(size_t currentX, size_t currentY, size_t destX, size_t destY) const diff --git a/Sem. 15/Chess/Figures/Rook/Rook.cpp b/Sem. 15/Chess/Figures/Rook/Rook.cpp index 19e84a6..2cb96a3 100644 --- a/Sem. 15/Chess/Figures/Rook/Rook.cpp +++ b/Sem. 15/Chess/Figures/Rook/Rook.cpp @@ -1,6 +1,6 @@ #include "Rook.h" -Rook::Rook(bool isWhite) : Figure(isWhite) +Rook::Rook(bool isWhite) : Figure(isWhite, RookFigure) {} bool Rook::canBeMoved(size_t currentX, size_t currentY, size_t destX, size_t destY) const { diff --git a/Sem. 15/Chess/main.cpp b/Sem. 15/Chess/main.cpp index 15db61d..12ad76d 100644 --- a/Sem. 15/Chess/main.cpp +++ b/Sem. 15/Chess/main.cpp @@ -9,4 +9,8 @@ int main() ChessBoard c; c.print(); + + c.move(0, 1, 2, 0); + + c.print(); }
\ No newline at end of file diff --git a/Sem. 16/LogicExpressions/LogicExpr.h b/Sem. 16/LogicExpressions/LogicExpr.h new file mode 100644 index 0000000..ebb84b4 --- /dev/null +++ b/Sem. 16/LogicExpressions/LogicExpr.h @@ -0,0 +1,150 @@ +#include <iostream> +#include <algorithm> +#include <string> +#include <vector> + +using namespace std; + +namespace LogicExpressions +{ + + const int ENGLISH_ALPHABET_SIZE = 26; + struct BooleanInterpretation + { + bool values[ENGLISH_ALPHABET_SIZE]; + BooleanInterpretation() + { + for (int i = 0; i < ENGLISH_ALPHABET_SIZE; i++) + values[i] = false; + } + void setVarValue(char v, bool value) + { + values[v - 'a'] = value; + } + + bool getVarValue(char v) const + { + return values[v - 'a']; + } + }; + + struct LogicExpr + { + virtual void print() const = 0; + LogicExpr() = default; + LogicExpr(const LogicExpr&) = delete; + LogicExpr& operator=(const LogicExpr& other) = delete; + + virtual bool evaluate(const BooleanInterpretation& interpret) const = 0; + virtual ~LogicExpr(){}; + }; + struct Var : public LogicExpr + { + char v; + Var(char v) :v(v){} + + void print() const + { + cout << v; + } + + bool evaluate(const BooleanInterpretation& interpret) const + { + return interpret.getVarValue(v); + } + }; + struct Operation : public LogicExpr + { + LogicExpr* left; + char op; + LogicExpr* right; + + Operation(LogicExpr* lhs, char op, LogicExpr* rhs) : left(lhs), op(op), right(rhs){} + + void print() const + { + cout << "("; + left->print(); + cout << op; + right->print(); + cout << ")"; + } + ~Operation() + { + delete left; + delete right; + } + + bool evaluate(const BooleanInterpretation& interpret) const + { + bool res1 = left->evaluate(interpret); + bool res2 = right->evaluate(interpret); + + switch (op) + { + case '^':return res1 && res2; + case '|':return res1 || res2; + case '>':return !res1 || res2; + case '+': return res1 ^ res2; + case '-': return (res1 && res2) || (!res1 && !res2); + } + + } + }; + struct Negation : public LogicExpr + { + LogicExpr* current; + Negation(LogicExpr* current) :current(current){} + + void print() const + { + cout << "!("; + current->print(); + cout << ")"; + } + ~Negation() + { + delete current; + } + + bool evaluate(const BooleanInterpretation& interpret) const + { + bool result = current->evaluate(interpret); + return !result; + } + }; + + BooleanInterpretation convertNumberToInterpretation(size_t n, const std::vector<char>& vars) + { + BooleanInterpretation current; + for (int i = vars.size() - 1; i >= 0; i--, n/=2) + current.setVarValue(vars[i], n % 2); + + return std::move(current); + } + + bool CheckValues(LogicExpr* expr, const std::vector<char>& vars, bool value) + { + size_t checksCounts = 1 << vars.size(); + + for (int i = 0; i < checksCounts; i++) + { + BooleanInterpretation currentInterpret = convertNumberToInterpretation(i, vars); + + if (expr->evaluate(currentInterpret) != value) + return false; + } + return true; + } + + bool isTautology(LogicExpr* expr, const std::vector<char>& vars) + { + return CheckValues(expr, vars, true); + } + + bool isContradiction(LogicExpr* expr, const std::vector<char>& vars) + { + return CheckValues(expr, vars, false); + } +} + diff --git a/Sem. 16/README.md b/Sem. 16/README.md new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/Sem. 16/README.md diff --git a/Sem. 16/Source.cpp b/Sem. 16/Source.cpp new file mode 100644 index 0000000..2b810b8 --- /dev/null +++ b/Sem. 16/Source.cpp @@ -0,0 +1,15 @@ +#include "LogicExpressions/LogicExpr.h" + +using namespace LogicExpressions; + + +int main() +{ + LogicExpr* expr = new Operation(new Var('p'), '|', new Negation(new Var('p'))); // p & !p + expr->print(); + cout << " " << isTautology(expr, { 'p' }) << endl; + + LogicExpr* expr2 = new Operation(new Var('q'),'^',new Operation(new Var('p'), '^', new Negation(new Var('p')))); // q ^ (p ^ !p) + expr2->print(); + cout << " " << isContradiction(expr2, { 'p', 'q' }); +}
\ No newline at end of file |
