Website Summary Files Commits Branches @commit @diff @stats
diff options
context:
space:
mode:
Commitd489848bab395aea447bf6fe462f7c4f603dee1a (patch)
Author
 angeld55 <angel_dimitriev@abv.bg>
2021-06-12 17:01:20 +0300
Committer
 angeld55 <angel_dimitriev@abv.bg>
2021-06-12 17:01:20 +0300
Files1bf68497f483098888dc1f94eadbf1d50894569a
Object-oriented_programming_FMI-d489848bab395aea447bf6fe462f7c4f603dee1a.tar
Object-oriented_programming_FMI-d489848bab395aea447bf6fe462f7c4f603dee1a.tar.gz
Object-oriented_programming_FMI-d489848bab395aea447bf6fe462f7c4f603dee1a.zip
Parentd060147c32ecebaecb31cf5a93aae75318dc7ca6 (diff)
sem 16
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