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.
Odpowiedzi:
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.
źródło
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.
źródło
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.
źródło
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.
źródło