Cześć

Ostatnio pracowałem nad programem do gry w szachy. Pomysł był taki, aby program obsługiwał możliwość grania
z dowolnym silnikiem korzystającym z protokołu UCI. Całe GUI zrobione jest w WF więc szału nie ma
(poczatkowy plan to było WPF) i apka wygląda tak:

https://postimg.org/image/x0h836s1z/

Co do kodu to całość jest na githubie pod linkiem:

https://github.com/NeuroXiq/ChessPro

ChessPro.Resources - część zawierająca "Model" projektu. Znajdują się tam klasy odpowiedzialne za samą grę,
komunikację z silnikiem, parsowania itp.
ChessPro.GUI - można się domyślić

Chciałbym jeszcze z grubsza powiedzieć ten kod wygląda w środku i na co można zwrócić uwagę.

Najważniejsza klasa to ChessGame. Silnik szachowy nie posiada żadnej logiki do sprawdzania
aktualnego stanu gry (czy jest szach, szach mat, bicie w przelocie itp.) którą możemy wykorzystać. Silnikowi
podajemy stany partii w postaci notacji FEN i silnik zwraca jaki ruch zrobić w tej pozycji. Można rzucić
okiem jak notacja wygląda:

https://en.wikipedia.org/wiki/Forsyth%E2%80%93Edwards_Notation

Co do samem klasy to ja powienienem zanim zacząłem cokolwiek pisać przeczytac cokolwiek z jakieś strony w
stylu chessprogramming.com a potem zabierać się za pisanie bo tam jest "wyszystko w jednym" ;) No niestety
takie są tego skutki ale teraz trochę za późno. Klasa odpowiada za całą logikę gry , sprawdzanie czy można
wykonać dany ruch, informuje czy wystąpił szach mat itd.

https://github.com/NeuroXiq/ChessPro/blob/master/ChessPro.Resources/ChessGame.cs

ChessGame po wywołaniu StartNewGame() działa w pętli na takiej zasadzie:

while(...)
{
                move = whitePlayer.GetMove(...);
                ProcessMove(move);
                if (gameEnded)
                    break;

                move = blackPlayer.GetMove(...);
                ProcessMove(move);
}

Aktualizacja aktualnego stanu gry dzieje się gdzieś tam w czeluściach ProcessMove().
Do komunikacji z silnikiem powstała klasa UCIProtocolInterpreter:

https://github.com/NeuroXiq/ChessPro/blob/master/ChessPro.Resources/UCIProtocolInterpreter.cs

Tam jest kod który odpowiada za pobieranie ruchu z silnika.
Silnik posiada swoje globalne ustawienia a potomne klasy UCIOption są ich abstrakcją.
Wszystkie ustawienia silnika po jego załadowaniu znajdują się w GUI aplikacji:

https://postimg.org/image/hsbozv1ld/
https://postimg.org/image/bufsq18bb/

No i to by było na tyle. Proszę o ocenę kodu i uwagi.