Popełniłem szachy i chyba działają.
Koniec końców nie wykorzystałem proponowanych przez siebie strategii ponieważ żeby to miało ręce i nogi trzeba każdemu bierce przekazać dane przez fabrykę, co nie jest ani zabawne, ani interesujące i mnie zniechęciło. Koniec końców i tak napisałem "fabrykę" do ustawiania początku gry i tworzenia bierek dla testów, wiec być może da rade tak zrobić bez overkill'a, na pewno łatwiej by się debugowało. Tylko tyle chciałem

Program podzieliłem na:
Game - wystawia wykonanie ruchów z punktu do punktu, sprawdza czy jest koniec, wystawia eventy do gui, pamięta historie rozgrywki, aktualnego gracza, umożliwia cofanie i podgląd wcześniejszych ruchów, itp. Jedyna walidacja jaką tu robię to sprawdzam czy to co wyklinał użytkownik jest na liście ruchów i czy gra się właśnie skończyła. Tyle chciałem napisać

ChessGame wystawia możliwe ruchy i umożliwia ich wywołania, wystawia aktualny stan gry szach, mat, pat itp. Validuje czy ruchy dostarczone przez pionki nie powodują mata na samym sobie(to jest zabronione) i sprawdza czy sa spełnione warunki do wykonania ruchów specjalnych. Nie jest wszechwiedzący, to ruszono króla wierze itp. pilnują inne klasy, które sa tutaj synchronizowane na MakeMove, UndoMove.

Rożne pionki, dostarczają ruchy które mogą wykonać Move, Odpytują mapę o pola na które mogą dojść, mapa sprawdza zakres i kolizje.

Mapa/Board przesuwa pionki według przepisu Move, poza tym to taka zaawansowana kolekcja, która zwraca infromcje na temat pola bierki.

Nie podoba mi się to że król ma z hardkowane pola do roszady, podobnie z linią do skoku pionków -nie wiem jak to rozdzielić bez popadanie w paranoje -, to że wiekszość programu ma dostęp do board, i wypadło by zablokować możliwość modyfikowania planszy wyżej, oraz sposób w jaki trzymam ruchy. U mnie to jest dataObject z numenem na typ. Przez to board robi ma dwie odpowiedzialności + musze gdzieś ten enum swichować i zastanawiam sie czy lepiej nie było by żeby ruch normalną klasą i sam umiał się wykonać, cofnąć oraz stwiedzic czy jest możliwy.