środa, 23 lipca 2025

Chess Browser - konfigurator pozycji szachowych

Geneza projektu była taka - stworzyć narzędzie do łatwego ustawiania pozycji szachowych i analizowania możliwych posunięć. Wiadomo - posługiwanie się screenshotami szachownicy i przesuwanie pionków w Paincie było zadaniem karkołomnym. Powstał więc projekt - była szachownica, pionki z możliwością ich przesuwania, czyli wszystko co trzeba.

No dobrze, a co się stanie, jeśli wykonamy nieprawidłowy ruch? Albo wykonamy ruch białymi, gdy ruch mają czarne i vice versa? Trzeba tego pilnować. Kolejność ruchów białe-czarne to łatwizna. Prawdziwym wyzwaniem okazało się pilnowanie, aby nieprawidłowy ruch nie został wykonany. Należało wprowadzić reguły szachowe - zasady poruszania się i bicia poszczególnych figur, roszada, promocja, bicie w przelocie, sytuacja szacha, mata, pata itd. Najtrudniejsza była reguła pilnująca, aby wykonany ruch nie doprowadził do szacha na własnym królu.

Udało się wreszcie dodać wszystkie reguły. System pilnował poprawności ruchów - można było grać. Oczywiście samemu ze sobą. Ale chodziło mi o łatwe uzyskanie dowolnej sytuacji szachowej, aby następnie analizować kolejne możliwe ruchy. Na tym etapie można było to uzyskać jedynie poprzez normalną grę od pozycji startowej. A to było czasochłonne i wymagało uwagi - trzeba było zbić nie występujące w analizowanej sytuacji figury, a pozostałe ustawić na właściwych pozycjach. I to wykonując dopuszczalne posunięcia - przecież system pilnował, czy nie dochodzi do nadużyć!

Potrzebne więc było narzędzie dodatkowe. Omijające reguły szachowe. Pozwalające szybko usuwać zbędne figury, a te biorące udział w rozpatrywanej sytuacji przesuwać w dowolne miejsce. I to się udało. Pojawiły się przyciski włączające tryb usuwania figur oraz tryb ustawiania figur. W obu trybach reguły szachowe są ignorowane, co pozwala na łatwe uzyskanie żądanej konfiguracji na planszy. Po powrocie do normalnego trybu reguły szachowe znów były pilnowane i można było analizować możliwe posunięcia.

Pomocnym narzędziem okazał się rejestr posunięć. Każdy ruch był odnotowany i pokazywany na specjalnej liście. Lista miała też za zadanie umożliwić skok do wybranego kroku. Tu jednak musiałem wprowadzić ograniczenie - jeśli cofniemy się do któregoś kroku, nie będziemy mogli grać dalej. Dopiero gdy ustawimy się na ostatnim kroku, dalsza gra będzie możliwa.

Tak więc musiał powstać dodatkowy mechanizm, który umożliwi cofnięcie ostatniego kroku, tak aby możliwa była dalsza gra. I taki mechanizm powstał. Polegał na cofnięciu się do kroku poprzedniego wraz z usuwaniem wpisu, dzięki czemu nadal byliśmy na ostatnim kroku i mogliśmy grać dalej!

Przydatną opcją okazała się możliwość włączenia podświetlania pól, na które można przesunąć (bądź zbić) zaznaczoną figurę. Wygląda to bardzo efektownie.

Niezbędną natomiast opcją była możliwość zapisania naszej pracy. W końcu żal by było stracić tak żmudnie przygotowaną konfigurację po zamknięciu przeglądarki, czy nawet po ustawieniu nowej sytuacji. Tak więc zapis listy posunięć (bo przecież przygotowana sytuacja szachowa to lista posunięć) musiał powstać! I powstał. Jak to działa? Rejestr ruchów to tablica obiektów z indeksami. Taką tablicę przesyłam na serwer AWS do API Gateway na konkretny endpoint, który wywołując funkcję Lambda zapisuje przesłane dane do bazy danych DynamoDB.

A skoro można było zapisywać historię posunięć, to trzeba też móc ją potem wczytywać. No i w ten sposób powstała komplementarna do niej opcja wczytywania listy konfiguracji, a po wskazaniu jednej z nich załadowaniu jej i odtworzeniu na planszy.

I ostatnia rzecz, którą dodałem - demo gry komputer-komputer oraz komputer-gracz. W pierwszej komputer gra sam ze sobą, w drugiej - można zagrać z komputerem (gracz gra białymi).

Śmiesznie to wygląda, bo oprócz reguł szachowych zastosowałem prostą zasadę preferowania bicia figur z uwzględnieniem ich znaczenia (wagi) oraz ataku na króla. Nie ma tu żadnych strategii ani predykcji.

Kod źródłowy na Githubie: https://github.com/PrivateAccount/ChessViewer

DEMO online: https://master.d2mlbkja551bj3.amplifyapp.com

Brak komentarzy:

Prześlij komentarz