Projekt semestralny z Programowania Obiektowego (2023, semestr letni)
- Maksym Bieńkowski
- Mikołaj Garbowski
- Michał Łuszczek
Projekt umożliwia grę w szachy z drugą osobą lub z botem za pośrednictwem interfejsu graficznego lub tekstowego, wspiera import i eksport stanu gry w formacie FEN.
- CMake do budowania projektu
- bibliotekę Qt do interfejsu graficznego i zarządzania komunikacją międzyprocesową
- framework GoogleTest do testów jednostkowych
- silnik szachowy Stockfish jako backend dla jednej z implementacji bota szachowego
Projekt jest podzielony na 4 moduły oraz moduł z testami jednostkowymi.
Zawiera podstawową logikę gry w szachy, linkowana jako zależność do różnych implementacji interfejsu użytkownika.
Główna funkcjonalność (wykonywanie ruchu, cofanie ruchu, sprawdzanie stanu zakończenia gry) jest dostępna z poziomu obiektu klasy Game
reprezentującego partię szachów, najważniejsze metody do wykorzystania przez interfejs użytkownika to:
(plik Game.h
)
class Game {
...
public:
GameOver isOver() const;
void makeMove(const Move& move, bool updateHistory = true);
void undoMove();
void redoMove();
};
Do importowania i eksportowania stanu gry w notacji FEN służy klasa FENParser
class FENParser {
...
public:
static Game parseGame(const std::string &fen);
static std::string gameToString(const Game &game);
};
Wyliczenie GameOver
informuje o powodzie zakończenia gry
enum class GameOver {
NOT_OVER,
MATE,
STALEMATE,
INSUFFICIENT_MATERIAL,
FIFTY_MOVE_RULE,
THREEFOLD_REPETITION,
};
Zawiera interfejs ChessBot
do bota szachowego, wyliczającego najlepszy ruch w danym momencie gry.
Implementacja StockfishBot
wykorzystuje silnik szachowy stockfish
class ChessBot {
...
public:
virtual Move getBestNextMove() const = 0;
...
};
Tekstowy interfejs użytkownika umożliwiający grę w 2 osoby lub grę z botem. Zależy od bibliotek chess
i bot
.
Jako opcjonalny pierwszy argument pozycyjny przyjmuje początkowy stan gry zapisany w notacji FEN (wspierany przez popularne serwisy jak https://chess.com)
8 ♜ ♞ ♝ ♛ ♚ ♝ ♞ ♜
7 ♟ ♟ ♟ ♟ ♟ ♟ ♟ ♟
6
5
4
3
2 ♙ ♙ ♙ ♙ ♙ ♙ ♙ ♙
1 ♖ ♘ ♗ ♕ ♔ ♗ ♘ ♖
A B C D E F G H
White move >
Graficzny interfejs użytkownika umożliwiający grę w 2 osoby lub grę z botem. Zależy od bibliotek chess
i bot
oraz Qt.
Wspiera import i eksport stanu gry do notacji FEN, a także cofanie i odcofywanie ruchów klawiszami strzałek lub z poziomu paska menu.
Testy wykorzystują framework GoogleTest
Wszystkie testy można uruchomić jako aplikację all-unit-tests
dostępna jako cel kompilacji dla CMake
- Poprawne działanie logiki jest zapewniane przez pokrycie testami
- Zastosowanie inwersji zależności umożliwia rozbudowanie projektu o więcej implementajci bota szachowego lub dodanie wsparcia dla większej liczby standardowych formatów
- Modularna budowa projektu pozwala na reużywania logiki gry przez różne implementacje interfejsu użytkownika
- Zastosowanie dynamicznego polimorfizmu i wzorców projektowych eliminuje duplikację kodu
Narzędzie do edycji - Visual Paradigm
Plik do zaimportowania w aplikacji ./docs/class-diagram.vpd
- Qt w wersji 6.5
- Stockfish (wymagany w przypadku gry z botem) zainstalowany lokalnie i dostępny w PATH jako
stockfish
Pobierz plik binarny właściwy dla danej platformy ze strony lub skompiluj ze źródeł
Dodaj lokalną instalację do PATH, (zmodyfikuj zmienną środowiskową PATH
lub dodaj symlink do pliku wykonywalnego w katalogu znajdującym się w PATH)
sudo ln -s <ścieżka do pliku wykonywalnego> /usr/local/bin/stockfish
Utwórz katalog docelowy
mkdir chess-build
cd chess-build
Załaduj konfigurację CMake, wymaga podania ściezki do lokalnej instalacji biblioteki
cmake <główny katalog projektu> -DQt6_DIR:PATH=<ścieżka do instalacji Qt>
Na przykład:
cmake /home/mgarbowski/proi/chess -DQt6_DIR:PATH=~/Qt/6.5.0/gcc_64/lib/cmake/Qt6
Aby skompilować projekt należy wskazać target, dostępne to
gui
dla interfejsu graficznegocli
dla interfejsu tekstowegoall-unit-tests
- dla testów jendostkowych
cmake --build . --target gui
Uruchomienie pliku wykonywalnego
./src/gui/gui