Compare commits

..
2 Commits
Author SHA1 Message Date
lin e9f763877c Project plan completed 2026-10-19 02:40:04 +02:00
lin a3b8a267e8 Updated readme to represent requirements 2026-10-16 20:28:10 +02:00
4 changed files with 82 additions and 2 deletions

No files matched your search

+78 -2
View File
@@ -1,3 +1,79 @@
# gui-chess # Sakk alkalmazás (gui-chess)
Programozás alapjai 3 – Nagy házi feladat specifikáció
A programozás alapjai 3 nagyházi feladat; A programozás alapjai 2 nagyházi feladata átemelve JAVA környezetbe és GUI-val megvalósítva. ## 1. Célkitűzés
A projekt célja egy teljes körű sakkalkalmazás implementálása Java nyelven. A feladat alapját a „Programozás alapjai 2” tárgyban készült C++ sakkmotor adja, melynek logikáját átemelve, az objektumorientált elveket és a Java nyelvi sajátosságait kihasználva egy grafikus felhasználói felülettel (GUI) és parancssori réteggel is rendelkező szoftver készül.
## 2. Funkcionális követelmények
### 2.1 Játékszabályok és játékmódok
- Szabályrendszer: A standard sakk szabályainak teljes körű ellenőrzése és betartatása (szabályos lépések, sakk, matt, patt helyzetek detektálása, sáncolás, en passant és gyalogátváltozás).
- Játékos módok: Lokális kétfős játék (Hotseat mód), ahol a felek felváltva lépnek ugyanazon a felületen.
- Lépésvisszavonás és elemzés: Lehetőség a lépések visszavonására (Undo) és előreléptetésére.
### 2.2 Felhasználói felületek
- Grafikus felület (GUI):
- Interaktív sakktábla (kattintásos vagy drag-and-drop bábulépéssel).
- Vizuális visszajelzés az érvényes lépésekről és az aktuális sakkhelyzetről.
- Lépéslista (Move history) megjelenítése algebrai jelöléssel.
- Konzolos felület (CLI):
- A sakktábla kirajzolása terminálban szöveges karakterekkel.
- Lépések fogadása standard szöveges formátumban (pl. `e2e4`).
### 2.3. Adatkezelés és perzisztencia
- PGN (Portable Game Notation) támogatás:
- Külső forrásból származó (pl. [Chess.com](https://chess.com), [Lichess](https://lichess.org)) standard `.pgn` formátumú játszmák beolvasása, elemzése és visszajátszása.
- Az aktuálisan játszott parti kimentése szabványos PGN fájlba a metaadatokkal (dátum, felek nevei, eredmény) együtt.
- Állásmentés (FEN): Az aktuális táblaállás gyors betöltése és exportálása FEN (Forsyth–Edwards Notation) karakterlánccal.
## 3. Nem funkcionális követelmények és architektúra
- Választott architektúra (MVC):
- Model: A sakktábla állapota, szabályellenőrzés, bábuk reprezentációja és lépésgenerálás. A motor teljesen független a megjelenítéstől.
- View: `Java Swing` komponensek és a CLI kirajzoló modul.
- Controller: Eseménykezelők, amelyek a felhasználói beviteleket (GUI kattintás, CLI parancs) továbbítják a motornak.
- Perzisztencia / Fájlkezelés: Szabványos Java I/O, kivételkezeléssel.
- Tesztelhetőség: A játékmotor üzleti logikáját (speciális lépések, matt detektálás, PGN parser) lefedő JUnit egységtesztek.
## 4. Terv
### 4.1 Szereplők
- Játékos: Az a személy aki játszmát kezdeményez, lépéseket tesz, kezeli a játék felületét.
- Fájlrendszer: Másodlagos szereplő. PGN/FEN állományokat kezel.
### 4.2 Használati esetek (Use Cases):
- Új játszma indítása
- Lépés megtétele a táblán
- Lehetséges lépések megtekintése
- Lépés visszavonása
- Játszma mentése (PGN formátumban)
- Játszma betöltése és visszajátszása (PGN formátumból)
- Táblaállás betöltése/mentése (FEN formátumból/ban)
### 4.3 GUI váza:
```text
+-------------------------------------------------------------+
| Menüsor: [Fájl (Új, Betöltés, Mentés)] [Nézet] [Segítség] |
+-------------------------------------------------------------+
| +---------------------------+ +------------------------+ |
| | | | Státusz / Soron lévő: | |
| | | | Fehér | |
| | | | Sakk jelzés: Nincs | |
| | | +------------------------+ |
| | | | Lépéstörténet: | |
| | SAKKTÁBLA | | 1. e4 e5 | |
| | (8 x 8) | | 2. Nf3 Nc6 | |
| | | | 3. Bb5 ... | |
| | | +------------------------+ |
| | | | Vezérlők: | |
| | | | [< Előző] [Következő >]| |
| | | | [Undo] | |
| +---------------------------+ +------------------------+ |
+-------------------------------------------------------------+
```
### 4.4 UML
<p align="center">
<img src="assets/UML.svg" alt="Architecture Diagram" width="600" />
</p>
+4
View File
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Do not edit this file with editors other than draw.io -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" style="background: #ffffff; background-color: var(--ge-dark-color, #121212); color-scheme: dark;" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="2502px" height="1523px" viewBox="0 0 2502 1523" content="&lt;mxfile host=&quot;app.diagrams.net&quot; scale=&quot;1&quot; border=&quot;15&quot;&gt;&#xA; &lt;diagram id=&quot;C5RBs43oDa-KdzZeNtuy&quot; name=&quot;Oldal-1&quot;&gt;&#xA; &lt;mxGraphModel dx=&quot;2603&quot; dy=&quot;2222&quot; grid=&quot;1&quot; gridSize=&quot;10&quot; guides=&quot;1&quot; tooltips=&quot;1&quot; connect=&quot;1&quot; arrows=&quot;1&quot; fold=&quot;1&quot; page=&quot;1&quot; pageScale=&quot;1&quot; pageWidth=&quot;827&quot; pageHeight=&quot;1169&quot; math=&quot;0&quot; shadow=&quot;0&quot;&gt;&#xA; &lt;root&gt;&#xA; &lt;mxCell id=&quot;WIyWlLk6GJQsqaUBKTNV-0&quot; /&gt;&#xA; &lt;mxCell id=&quot;WIyWlLk6GJQsqaUBKTNV-1&quot; parent=&quot;WIyWlLk6GJQsqaUBKTNV-0&quot; /&gt;&#xA; &lt;mxCell id=&quot;_r-HP5b758gAeptMtzsk-38&quot; parent=&quot;WIyWlLk6GJQsqaUBKTNV-1&quot; style=&quot;shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;fillColor=default;&quot; value=&quot;&quot; vertex=&quot;1&quot;&gt;&#xA; &lt;mxGeometry height=&quot;880&quot; width=&quot;1750&quot; x=&quot;-500&quot; y=&quot;-370&quot; as=&quot;geometry&quot; /&gt;&#xA; &lt;/mxCell&gt;&#xA; &lt;mxCell id=&quot;_r-HP5b758gAeptMtzsk-0&quot; parent=&quot;WIyWlLk6GJQsqaUBKTNV-1&quot; style=&quot;verticalAlign=top;align=left;overflow=fill;html=1;whiteSpace=wrap;&quot; value=&quot;&amp;lt;p style=&amp;quot;margin:0px;margin-top:4px;text-align:center;&amp;quot;&amp;gt;«Abstract»&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin:0px;margin-top:4px;text-align:center;&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Piece&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;hr size=&amp;quot;1&amp;quot; style=&amp;quot;border-style:solid;&amp;quot;&amp;gt;&amp;lt;p style=&amp;quot;margin:0px;margin-left:4px;&amp;quot;&amp;gt;- PieceColor: Color&amp;lt;/p&amp;gt;&amp;lt;hr size=&amp;quot;1&amp;quot; style=&amp;quot;border-style:solid;&amp;quot;&amp;gt;&amp;lt;p style=&amp;quot;margin:0px;margin-left:4px;&amp;quot;&amp;gt;+ Piece(Color)&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin:0px;margin-left:4px;&amp;quot;&amp;gt;+ getMoveDomain() : Direction[]&amp;amp;nbsp;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin:0px;margin-left:4px;&amp;quot;&amp;gt;+ getColor() : Color&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin:0px;margin-left:4px;&amp;quot;&amp;gt;+ getSymbol() : Char&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin:0px;margin-left:4px;&amp;quot;&amp;gt;+ getType() : Type&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin:0px;margin-left:4px;&amp;quot;&amp;gt;+ hasMoved() : bool&amp;lt;/p&amp;gt;&quot; vertex=&quot;1&quot;&gt;&#xA; &lt;mxGeometry height=&quot;170&quot; width=&quot;260&quot; x=&quot;250&quot; y=&quot;-30&quot; as=&quot;geometry&quot; /&gt;&#xA; &lt;/mxCell&gt;&#xA; &lt;mxCell id=&quot;_r-HP5b758gAeptMtzsk-3&quot; parent=&quot;WIyWlLk6GJQsqaUBKTNV-1&quot; style=&quot;verticalAlign=top;align=left;overflow=fill;html=1;whiteSpace=wrap;&quot; value=&quot;&amp;lt;p style=&amp;quot;margin:0px;margin-top:4px;text-align:center;&amp;quot;&amp;gt;«Final»&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin:0px;margin-top:4px;text-align:center;&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Pawn&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;hr size=&amp;quot;1&amp;quot; style=&amp;quot;border-style:solid;&amp;quot;&amp;gt;&amp;amp;nbsp;+ getMoveDomain() : Direction[]&quot; vertex=&quot;1&quot;&gt;&#xA; &lt;mxGeometry height=&quot;70&quot; width=&quot;176&quot; x=&quot;-486&quot; y=&quot;390&quot; as=&quot;geometry&quot; /&gt;&#xA; &lt;/mxCell&gt;&#xA; &lt;mxCell id=&quot;_r-HP5b758gAeptMtzsk-4&quot; parent=&quot;WIyWlLk6GJQsqaUBKTNV-1&quot; style=&quot;verticalAlign=top;align=left;overflow=fill;html=1;whiteSpace=wrap;&quot; value=&quot;&amp;lt;p style=&amp;quot;margin:0px;margin-top:4px;text-align:center;&amp;quot;&amp;gt;«Final»&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin:0px;margin-top:4px;text-align:center;&amp;quot;&amp;gt;&amp;lt;b&amp;gt;King&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;hr size=&amp;quot;1&amp;quot; style=&amp;quot;border-style:solid;&amp;quot;&amp;gt;&amp;amp;nbsp;+ getMoveDomain() : Direction[]&quot; vertex=&quot;1&quot;&gt;&#xA; &lt;mxGeometry height=&quot;70&quot; width=&quot;176&quot; x=&quot;-176&quot; y=&quot;390&quot; as=&quot;geometry&quot; /&gt;&#xA; &lt;/mxCell&gt;&#xA; &lt;mxCell id=&quot;_r-HP5b758gAeptMtzsk-5&quot; parent=&quot;WIyWlLk6GJQsqaUBKTNV-1&quot; style=&quot;verticalAlign=top;align=left;overflow=fill;html=1;whiteSpace=wrap;&quot; value=&quot;&amp;lt;p style=&amp;quot;margin:0px;margin-top:4px;text-align:center;&amp;quot;&amp;gt;«Final»&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;Line truncated

After

Width:  |  Height:  |  Size: 850 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB