Zainspirowany tym ostatnim artykułem opowiadającym o francuskim programatorze, który napisał w Zgromadzeniu 487-bajtowy program dla dwóch graczy (człowiek kontra człowiek), zastanawiałem się, jak małe programy szachowe mogą być w innych językach.
Detale
- Program musi akceptować tylko legalne ruchy szachowe.
- Deklaracja czeku / mat nie jest konieczna (po prostu pożądana), chociaż pierwsza zasada ma zastosowanie w przypadkach czeku.
- Zgodnie z artykułem castling nie jest koniecznym wdrożeniem.
- Nie musisz też implementować en passant.
- Musisz jednak zezwolić na awans pionka po osiągnięciu ósmej rangi (możesz po prostu wymusić konwersję na królową).
- Od Ciebie zależy, jak zostanie wyświetlona tablica - terminal ASCII, GUI itp.
- Musisz pokazać, czyja to kolej.
Zasady gry w szachy można znaleźć tutaj - zignoruj określone zasady turnieju (np. Czas, dotyk) i pamiętaj, że castling i en passant nie są koniecznymi implementacjami.
a1 h8
przesunięcie wieży po przekątnej do przeciwległego rogu, przeskakując nad pionkamiOdpowiedzi:
C,
650600Aby zmniejszyć kod inicjujący planszę, wyświetlacz ma biały (wielkie litery) odtwarzanie od lewej do prawej i czarny (małe litery) odtwarzanie od prawej do lewej. Dane wejściowe mają postać dwóch dwucyfrowych liczb dziesiętnych (pozycja początkowa i pozycja końcowa), podając plik (0–7) i pozycję (0–7). Aby uzyskać trochę dodatkowego kodu (odejmij 11 z każdego wejścia), można wprowadzić dane zgodne z http://en.wikipedia.org/wiki/ICCF_numeric_notation (cyfry 1-8)
Oto przykładowy zrzut ekranu, na którym Black właśnie wysunął swojego pionka Wieży. White próbuje różnych nielegalnych ruchów ze swoją królową, zanim w końcu schwyta pionka. Kierunkowskazy dotyczą
a
czerni iA
bieli.Ciekawą cechą mojej walidacji jest użycie kwadratu odległości euklidesowej. Dla rycerza jest to zawsze 1 ^ 2 + 2 ^ 2 = 5, ale używam go również dla Króla i pionka.
Test na sprawdzenie odbywa się poprzez wykonanie kopii zapasowej planszy, wykonanie ruchu graczy i zeskanowanie wszystkich 64 możliwych ruchów przeciwnika.
Program należy zakończyć za pomocą Ctrl-C. Nie mogę wymyślić bardziej łaskawego sposobu na zrobienie tego niż wprowadzenie specjalnego ruchu, aby zakończyć program. Gra w szachy kończy się, gdy jeden z graczy nie jest w stanie ruszyć się w swojej turze (mat lub impas) i wymaga to wielu testów, które nie są wymagane przez specyfikację.
Skomentowany kod
źródło
s,f
trzeba go zainicjować? Miejsca na pustych kwadratach są świetne.s
była przeniesieniem z wcześniejszego etapu. Teraz to usunąłem.e=y*y+x*x=f-s-u*y=f/u-s/u;
.=
wydaje się jedyną interpretacją. Jeśli chodzie=y*y+x*(x=..
o moją ostrożność, jestem nieco ostrożny, ponieważ otrzymałem złą odpowiedź z argumentu zmodyfikowanego wprintf
instrukcji, ale w tym przypadku wydaje się, że działa dobrze na GCC / Cygwin. Zaczekam na więcej zmian, zanim dołączę to do kodu. Jedną rzeczą, której wciąż brakuje, jest sprawdzenie liczb spoza zakresu 0..77 (co nie wydaje mi się wymagane przez specyfikację, ale w każdym razie ..)t^=32
dot^=w
ia[95],b[95]
doa[z],b[z]
. Kod jest zaskakująco czytelny. Prawdopodobnie z powodu pełnych komentarzy!Python 3,
11661071993 bajtówZrozumiałem tylko, że muszę powstrzymać królów od przejścia na kontrolę po tym, jak skończę inaczej, ale oto moje poddanie się
Aby zagrać, wprowadź cztery liczby rozdzielane spacjami, pierwsze 2 to współrzędne elementu, który chcesz przenieść, a drugie 2 to miejsce, do którego chcesz się przenieść.
źródło
a=o*8;j=[list(s) for s in ["RNBKQBNR","P"*8,a,a,a,a,"p"*8,"rnbkqbnr"]]
.spilt()
domyślnie dzieli na białe znaki, więc możesz użyćinput().split()
zamiastinput().split(" ")
2and
,1or
itp)False
może być0!=0
.False
może być0
-not 0
powinien działać dobrze ...Przepraszam za opóźnienie.
Program nazywa się ChesSkelet. Obecnie używa 352 bajtów zarówno dla kodu, jak i danych. Jest napisany w Z80 Assembly, a szczególnie dla ZX Xpectrum.
Jeśli nie masz ochoty go skompilować i załadować do emulatora, możesz grać online na stronie ChesSkelet ( http://chesskelet.x10host.com ).
Program jest dość prosty, duża pętla, w której: - alternatywnie (1) biały wprowadza swój ruch lub (2) czarny uruchamia mikro AI do poruszania się. - plansza jest aktualizowana na ekranie. ponownie na stronie znajduje się ogromny przewodnik opisujący program i techniki.
źródło
> <> , 1467 bajtów
Cóż, to nie jest rekord 487 bajtów…
Wypróbuj na placu zabaw dla ryb ! (Wykorzystuje kilka błędów w tym tłumaczu, więc nie mogę obiecać, że zadziała gdzie indziej. Prawdopodobnie będziesz chciał uruchomić go z maksymalną prędkością - wykonanie jednego ruchu może potrwać ponad minutę.)
Po uruchomieniu kodu zostanie wydrukowany
Wielkie litery oznaczają biały, małe litery - czarny. Można wtedy dać swój ruch jako wkład w postaci
[a-h][1-8][a-h][1-8]
, na przykłade2e4
, co oznacza „przejść kawałek nae2
celue4
”. Program wydrukuje na przykładGłówną formą pamięci w> <> jest stos; nie jest to jednak zbyt praktyczne do przechowywania szachownicy. Zamiast tego użyłem możliwości samodostosowania> <> do przechowywania szachownicy jako części samego kodu źródłowego, uzyskując do niej dostęp za pomocą
g
ip
.Większość kodu polega na sprawdzeniu, czy Twój ruch jest legalny. Tutaj jest kilka rzeczy do sprawdzenia:
Jeśli którekolwiek z tych pytań mają złą odpowiedź, program zgłasza błąd i zatrzymuje się; w przeciwnym razie edytuje szachownicę w kodzie źródłowym, drukuje ją ponownie i czeka na następny ruch.
Do ruchów króla i rycerza pożyczyłem sztuczkę Level River St polegającą na sprawdzeniu kwadratowej odległości euklidesowej: dla króla jest mniej niż 3, a dla rycerza dokładnie 5.
źródło