From f9cc3a4cfc1d56c30f3a0e3c754f4fb91c3d9485 Mon Sep 17 00:00:00 2001 From: Eduard Dumitrescul Date: Tue, 9 Apr 2024 16:49:13 +0300 Subject: [PATCH 1/5] created state diagram --- Documentation/chess/state.puml | 48 ++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 Documentation/chess/state.puml diff --git a/Documentation/chess/state.puml b/Documentation/chess/state.puml new file mode 100644 index 0000000..0712eb5 --- /dev/null +++ b/Documentation/chess/state.puml @@ -0,0 +1,48 @@ +@startuml + +!define STATE_COLOR #87CEEB +!define ACTION_COLOR #90EE90 +!define END_STATE_COLOR #FFA07A +!define VALIDATION_COLOR #FFD700 + +skinparam state { + BackgroundColor STATE_COLOR + BorderColor Black +} + +skinparam stateEnd { + BackgroundColor END_STATE_COLOR + BorderColor Black +} + +skinparam stateValidation { + BackgroundColor VALIDATION_COLOR + BorderColor Black +} + +[*] --> Ongoing : StartGame + +state Ongoing { + [*] --> WhiteTurn: firstMove + WhiteTurn --> BlackTurn : makeValidMove + BlackTurn --> WhiteTurn : makeValidMove + WhiteTurn --> WhiteTurn : makeInvalidMove + BlackTurn --> BlackTurn : makeInvalidMove + + WhiteTurn --> BlackWin : isCheckmate + WhiteTurn --> Draw : isStalemate + BlackTurn --> Draw : isStalemate + BlackTurn --> WhiteWin : isCheckmate + + WhiteTurn --> BlackWin : resign + BlackTurn --> WhiteWin : resign +} + +BlackWin --> GameOver +WhiteWin --> GameOver +Draw --> GameOver + + + +@enduml + From fae12c8be64f802fa50bced14c4e2771576c6fc6 Mon Sep 17 00:00:00 2001 From: Eduard Dumitrescul Date: Tue, 9 Apr 2024 16:52:36 +0300 Subject: [PATCH 2/5] created log --- Documentation/chess/my-log/9th-april.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 Documentation/chess/my-log/9th-april.md diff --git a/Documentation/chess/my-log/9th-april.md b/Documentation/chess/my-log/9th-april.md new file mode 100644 index 0000000..0d54132 --- /dev/null +++ b/Documentation/chess/my-log/9th-april.md @@ -0,0 +1,7 @@ +# Working on [Player-vs-Player Chess](https://dumitresculeduard.atlassian.net/jira/software/projects/PIX/boards/2?selectedIssue=PIX-11) + +Installed PlantUml in VsCode from extenstions. + +Ran ```sudo apt install graphviz``` to fix required dependency. + +- created state diagram \ No newline at end of file From d4d977899df9990625197f07d67c430a36b9b619 Mon Sep 17 00:00:00 2001 From: Eduard Dumitrescul Date: Tue, 9 Apr 2024 18:12:24 +0300 Subject: [PATCH 3/5] class uml diagram: --- Documentation/chess/class.puml | 103 ++++++++++++++++++++++++ Documentation/chess/my-log/9th-april.md | 7 +- 2 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 Documentation/chess/class.puml diff --git a/Documentation/chess/class.puml b/Documentation/chess/class.puml new file mode 100644 index 0000000..fc4f4a6 --- /dev/null +++ b/Documentation/chess/class.puml @@ -0,0 +1,103 @@ +@startuml +class Game { + - State state + - Position position + - List moves + - Player whitePlayer + - Player blackPlayer + +} +Game : void initialize() +Game : void run() +Game : Move waitForMove() +Game : void makeMove(Move move) +Game : boolean isValid(Move move) +Game : void updateState() +Game : boolean isCheckmate() +Game : boolean isStalemate() +Game : List possibleMoves() +Game : boolean isOngoing() +Game : PositionAnalyzer currentPositionAnalyzer() + +Game o-- Position +Game o-- State +Game o-- Player +Game o-- Move + +class Position { + - Piece board[8][8] + - boolean whiteCanShortCastle + - boolean whiteCanLongCastle + - boolean blackCanShortCastle + - boolean blackCanLongCastle +} +Position : makeMove(Move move) + +Position o-- Piece + +class PositionAnalyzer { + - Position position + - Color turn +} +PositionAnalyzer : boolean isCheck() +PositionAnalyzer : boolean isCheckmate() +PositionAnalyzer : boolean isStalemate() +PositionAnalyzer : boolean isValid(Move move) + +PositionAnalyzer o-- Position +PositionAnalyzer o-- Color + +class MoveGenerator { + - Position position + - Color turn +} +MoveGenerator : List possibleMoves() + +MoveGenerator o-- Position +MoveGenerator o-- Color + + +class Player { + - Color color +} +Player : Move makeMove(Position P) + +Player o-- Color + + + +class Move { + + byte initialSquare + + byte finalSquare +} + +enum State { + + WhiteTurn + + BlackTurn + + WhiteWon + + BlackWon + + Draw +} + +enum Piece { + + None(0) + + WhiteKing(1) + + WhiteQueen(2) + + WhiteRook(3) + + WhiteBishop(4) + + WhiteKnight(5) + + WhitePawn(6) + + BlackKing(7) + + BlackQueen(8) + + BlackRook(9) + + BlackBishop(10) + + BlackKnight(11) + + BlackPawn(12) +} + +enum Color { + + White + + Black +} + +@enduml \ No newline at end of file diff --git a/Documentation/chess/my-log/9th-april.md b/Documentation/chess/my-log/9th-april.md index 0d54132..28cf0fc 100644 --- a/Documentation/chess/my-log/9th-april.md +++ b/Documentation/chess/my-log/9th-april.md @@ -4,4 +4,9 @@ Installed PlantUml in VsCode from extenstions. Ran ```sudo apt install graphviz``` to fix required dependency. -- created state diagram \ No newline at end of file +- created state diagram + +## How do we store a chess position? +- 8x8 matrix of bytes corresponding to piece type + +- created initial class diagram \ No newline at end of file From 5494a3e3a44ca6836fe8d494896a9029c6221659 Mon Sep 17 00:00:00 2001 From: Eduard Dumitrescul Date: Wed, 10 Apr 2024 14:51:35 +0300 Subject: [PATCH 4/5] setup database documentation --- Documentation/database-setup.md | 21 +++++++++++++++++++++ Documentation/image.png | Bin 0 -> 41973 bytes 2 files changed, 21 insertions(+) create mode 100644 Documentation/database-setup.md create mode 100644 Documentation/image.png diff --git a/Documentation/database-setup.md b/Documentation/database-setup.md new file mode 100644 index 0000000..49af2cc --- /dev/null +++ b/Documentation/database-setup.md @@ -0,0 +1,21 @@ +# Setup MySql Database inside IntelliJ + +## General +- database name = mydatabase +- user = root +- password = root + +## How to Create Docker Container +Make sure to have Docker enabled in IntelliJ. + +From the Services window (bottom right): +- click "images" +- download image ```eduardvalentindumitrescul/mysql-pixelplay:latest``` +- create container from this image +- Modify Options -> Bind Ports -> Press + +![bind ports screenshot](image.png) + +## How to Access Mysql +- from container -> terminal +- write ```mysql -p``` (password is ```root```) +- you are inside mysql \ No newline at end of file diff --git a/Documentation/image.png b/Documentation/image.png new file mode 100644 index 0000000000000000000000000000000000000000..e6997d719b7c177e6917ad8b22636e0e0cb72ac3 GIT binary patch literal 41973 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%0AR;Rx4K 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 literal 0 HcmV?d00001 From 970380390958bca88e779e591b88e2a1fc57d0bd Mon Sep 17 00:00:00 2001 From: Eduard Dumitrescul Date: Wed, 10 Apr 2024 14:58:08 +0300 Subject: [PATCH 5/5] remved files from another branch --- Documentation/chess/class.puml | 103 ------------------------ Documentation/chess/my-log/9th-april.md | 12 --- Documentation/chess/state.puml | 48 ----------- 3 files changed, 163 deletions(-) delete mode 100644 Documentation/chess/class.puml delete mode 100644 Documentation/chess/my-log/9th-april.md delete mode 100644 Documentation/chess/state.puml diff --git a/Documentation/chess/class.puml b/Documentation/chess/class.puml deleted file mode 100644 index fc4f4a6..0000000 --- a/Documentation/chess/class.puml +++ /dev/null @@ -1,103 +0,0 @@ -@startuml -class Game { - - State state - - Position position - - List moves - - Player whitePlayer - - Player blackPlayer - -} -Game : void initialize() -Game : void run() -Game : Move waitForMove() -Game : void makeMove(Move move) -Game : boolean isValid(Move move) -Game : void updateState() -Game : boolean isCheckmate() -Game : boolean isStalemate() -Game : List possibleMoves() -Game : boolean isOngoing() -Game : PositionAnalyzer currentPositionAnalyzer() - -Game o-- Position -Game o-- State -Game o-- Player -Game o-- Move - -class Position { - - Piece board[8][8] - - boolean whiteCanShortCastle - - boolean whiteCanLongCastle - - boolean blackCanShortCastle - - boolean blackCanLongCastle -} -Position : makeMove(Move move) - -Position o-- Piece - -class PositionAnalyzer { - - Position position - - Color turn -} -PositionAnalyzer : boolean isCheck() -PositionAnalyzer : boolean isCheckmate() -PositionAnalyzer : boolean isStalemate() -PositionAnalyzer : boolean isValid(Move move) - -PositionAnalyzer o-- Position -PositionAnalyzer o-- Color - -class MoveGenerator { - - Position position - - Color turn -} -MoveGenerator : List possibleMoves() - -MoveGenerator o-- Position -MoveGenerator o-- Color - - -class Player { - - Color color -} -Player : Move makeMove(Position P) - -Player o-- Color - - - -class Move { - + byte initialSquare - + byte finalSquare -} - -enum State { - + WhiteTurn - + BlackTurn - + WhiteWon - + BlackWon - + Draw -} - -enum Piece { - + None(0) - + WhiteKing(1) - + WhiteQueen(2) - + WhiteRook(3) - + WhiteBishop(4) - + WhiteKnight(5) - + WhitePawn(6) - + BlackKing(7) - + BlackQueen(8) - + BlackRook(9) - + BlackBishop(10) - + BlackKnight(11) - + BlackPawn(12) -} - -enum Color { - + White - + Black -} - -@enduml \ No newline at end of file diff --git a/Documentation/chess/my-log/9th-april.md b/Documentation/chess/my-log/9th-april.md deleted file mode 100644 index 28cf0fc..0000000 --- a/Documentation/chess/my-log/9th-april.md +++ /dev/null @@ -1,12 +0,0 @@ -# Working on [Player-vs-Player Chess](https://dumitresculeduard.atlassian.net/jira/software/projects/PIX/boards/2?selectedIssue=PIX-11) - -Installed PlantUml in VsCode from extenstions. - -Ran ```sudo apt install graphviz``` to fix required dependency. - -- created state diagram - -## How do we store a chess position? -- 8x8 matrix of bytes corresponding to piece type - -- created initial class diagram \ No newline at end of file diff --git a/Documentation/chess/state.puml b/Documentation/chess/state.puml deleted file mode 100644 index 0712eb5..0000000 --- a/Documentation/chess/state.puml +++ /dev/null @@ -1,48 +0,0 @@ -@startuml - -!define STATE_COLOR #87CEEB -!define ACTION_COLOR #90EE90 -!define END_STATE_COLOR #FFA07A -!define VALIDATION_COLOR #FFD700 - -skinparam state { - BackgroundColor STATE_COLOR - BorderColor Black -} - -skinparam stateEnd { - BackgroundColor END_STATE_COLOR - BorderColor Black -} - -skinparam stateValidation { - BackgroundColor VALIDATION_COLOR - BorderColor Black -} - -[*] --> Ongoing : StartGame - -state Ongoing { - [*] --> WhiteTurn: firstMove - WhiteTurn --> BlackTurn : makeValidMove - BlackTurn --> WhiteTurn : makeValidMove - WhiteTurn --> WhiteTurn : makeInvalidMove - BlackTurn --> BlackTurn : makeInvalidMove - - WhiteTurn --> BlackWin : isCheckmate - WhiteTurn --> Draw : isStalemate - BlackTurn --> Draw : isStalemate - BlackTurn --> WhiteWin : isCheckmate - - WhiteTurn --> BlackWin : resign - BlackTurn --> WhiteWin : resign -} - -BlackWin --> GameOver -WhiteWin --> GameOver -Draw --> GameOver - - - -@enduml -