Jakiego paradygmatu użyć do napisania silnika szachowego?

9

Jeśli zamierzasz napisać silnik gry w szachy, jakiego paradygmatu programistycznego byś użył (OOP, procedury itp.) I dlaczego miałbyś go wybrać? Przez silnik szachowy rozumiem część programu, która ocenia bieżącą planszę i decyduje o następnym ruchu komputera.

Pytam, bo pomyślałem, że fajnie byłoby napisać silnik szachowy. Potem przyszło mi do głowy, że mogę go wykorzystać jako projekt do nauki programowania funkcjonalnego. Potem przyszło mi do głowy, że niektóre problemy nie są dobrze dostosowane do paradygmatu funkcjonalnego. Potem przyszło mi do głowy, że to może być dobra pasza do dyskusji.

szturchać
źródło
1
Jest to podobne do pisania od zera kompilatora C. Nie wymyśliłbym koła na nowo. Najpierw przyjrzę się istniejącym.
Job
10
@Job: Moim celem jest proces, a nie wynik. Nawet jeśli skończę z bardzo złym silnikiem, myślę, że w analizie problemu i wypracowaniu sposobu na jego zaatakowanie może być wartość, szczególnie jeśli nauczyłem się w tym czasie nowych metod programowania.
poke
1
Powodzenia. Żaden prawdziwy pracodawca nigdy nie poprosi cię o opracowanie go od zera, ale podczas rozmowy kwalifikacyjnej może zapytać, jak zaatakujesz problem.
Job
6
@Job duży udział w życiu programistycznym polega na kodowaniu rzeczy nie dlatego, że jest to absolutnie potrzebne, ale dlatego, że możesz.
1
@Mark, co powiesz na obejmowanie życia;) = podróże, języki, teatr, poezja, plenerze itp.? Lubię programować, ale kiedy nie robię tego per se, mam 1000 innych rzeczy do zrobienia.
Job

Odpowiedzi:

7

O ile mi wiadomo, ewaluacja nie jest problemem równoległym, ale ewaluacja różnych łańcuchów jest, więc definitywnie napisałbym ją, aby wykorzystać wiele rdzeni i wielowątkowość.

To, czy wybierzesz funkcjonalny czy półfunkcyjny, jest kwestią gustu. Osobiście wybrałbym OOP i skorzystałbym ze wsparcia dla programowania funkcjonalnego i równoległości, które istnieją na przykład w C #

Na marginesie, gdybym napisał silnik szachowy, postaram się stworzyć taki, który naprawdę może „myśleć” o szachach. Używając oceny planszy do brutalnej siły, wszystkie możliwe kombinacje zostały wykonane na śmierć i bardzo dobrze, ale nie osiągnięto dużego postępu w tworzeniu bardziej myślącego / rozmytego silnika szachowego. To byłoby wyzwanie! :)

Znajdź kilka gier z naprawdę trudną grą w pozycji i silnymi ruchami (są oznaczone! Lub !!) i użyj ich do trenowania i testowania silnika.

Homde
źródło
2

Myślę, że to zależy od twoich celów, które uważam za ściśle dydaktyczne. Jeśli próbujesz napisać konkurencyjny produkt, chciałbyś maksymalnej wydajności w testerach najniższego poziomu. Wiele możliwości równoległości na poziomie bitów tutaj. Również wiele możliwości dla tabel skrótów. Możliwości wykorzystania równoległości. Następnie na wyższych poziomach prawdopodobnie potrzebujesz systemu dobrego dla AI, więc prawdopodobnie oznacza to funkcjonalny język programowania. Oczywiście nie chcesz robić wszystkich tych rzeczy, wybrać jedną lub dwie z nich i zadowalać się faktem, że Twój projekt nie będzie konkurencyjny w stosunku do lepszych programów.

Omega Centauri
źródło
2

Wybrałem paradygmat OOP w moim silniku szachowym o nazwie The Turk . Pierwsza wersja mojego silnika szachowego została napisana bardziej proceduralnie niż OOP. Potem tak trudno było ulepszyć mój silnik szachowy z powodu długich bloków kodu i złego projektu.

Zależy to od tego, co chcesz osiągnąć, pisząc silnik szachowy.Jeśli chcesz stworzyć silnik szachowy, który jest zbyt silny, więc nie jest to możliwe w językach OOP ze względu na powolne późne wiązania. Jeśli chcesz nauczyć się programowania, a także dobrze się bawić, pisząc silnik szachowy w tak zarządzanych językach, a OOP będzie Twoim przyjacielem. Mogę zasugerować, aby wybrać C #, ponieważ można również napisać silnik szachowy w bardziej proceduralny sposób.

Świeża krew
źródło
Jak ocenia ELO? W porównaniu do Podstępnych?
@ Thorbjørn Ravn Andersen - Podstępny jeden z lepszych silników szachowych typu open source napisany w C oraz przez dr Roberta M. Hyatta, który spędził życie w programowaniu szachów. Niestety, nie testowałem oceny elo, ponieważ wciąż jest wiele rzeczy do zrobienia przed testowaniem oceny elo. Obecnie ocena to po prostu ocena wartości sztuk, więc ma dość słabą ocenę i nadal nie wdrożyłem wszystkich niezbędnych algorytmów. Niestety nie mam w tej chwili czasu na ten projekt. Mam nadzieję, że pewnego dnia będzie można kontynuować.
Freshblood
Ach, przepraszam, myślałem, że to może grać. Mój błąd.
@ Thorbjørn Ravn Andersen - Opublikowałem tam kilka wydań i najnowszy zestaw zmian repozytorium gotowy do kompilacji. Chciałem tylko powiedzieć, że w tej chwili jest dość słaby.
Freshblood 11.01.11
2

Zaimportowałem prosty program szachowy jako środek do nauki języka Forth. Okazało się, że świetnie pasuje do tego bardzo ważnego problemu i wiele się nauczyłem. Otwarty stos pozwolił mi zaimplementować wyszukiwanie alfa-beta w unikalny sposób, co dało mi lepszy wgląd w algorytm.

Można by pomyśleć, że programowanie funkcjonalne byłoby idealne dla programów szachowych, ponieważ podstawowe algorytmy (pierwsze wyszukiwanie w głębokości alfa-beta, ocena) są rekurencyjne i funkcjonalnie ścisłe. Jednak program szachowy żyje i umiera na wydajności i żaden z obecnych zbiorów języków funkcjonalnych nie ma tego celu. Sto najlepszych najnowocześniejszych silników używa imperatywnych języków (głównie C / C ++, następnie Delphi), aby mieć maksymalną kontrolę nad wykorzystaniem pamięci, wielowątkowością, stanem globalnym i generowaniem kodu. Wszystkie języki funkcjonalne używają dynamicznej alokacji pamięci dla podstawowych struktur danych, co jest śmiercią dla programu szachowego.

Nadal chciałbym zobaczyć, jak ktoś próbuje włamać się do 100 najlepszych silników szachowych za pomocą funkcjonalnego języka.

Ian Osgood
źródło