Inna historia z czasów college'u. Uważaj, długi artykuł.
uczelnie techniczne w Kerala wymagać od studentów do przedstawienia projektu mini w trzecim roku ich sztuka i kursów technicznych. Jest to dodatek do głównego projektu, który ma być przedstawiony w ostatnim roku studiów.
Dwóch moich kolegów - Praveen Kumar (który w naszych kręgach uważana jest równa Jon Skeet ), Philip i tworzą nasz zespół w tym projekcie mini. Byliśmy bardzo podekscytowani tym projektem, że rozpoczęliśmy rozmowy o tym dużo wcześniej niż oficjalny czas rozpoczęcia projektu. Po wielu debatach noc późno zdecydowaliśmy się opracować program gry w szachy.

Trójka była podziału wynajętym domu w pobliżu uczelni, a my wykorzystane do opracowania programów narzędziowych do różnych celów # 1. Głównym punktem jest tutaj zauważyć, że te programy opracowane w - uwaga - Visual Basic 6.
Byliśmy bardzo wygodne w Visual Basic, a ponieważ jest bardzo łatwy do opracowania dobrych szachy interfejsu użytkownika w języku Visual Basic , rozpoczęliśmy budowę prototypu aplikacji w VB6. Myśleliśmy, że po podstawowych logika jest zrobione i działa, to my go do portu lepiej i szybciej języka. Niestety, pracował na kod bardzo długo i ciężko, że podstawa kod stawały się coraz większe i dłuższe.
Testowanie programu było trochę skomplikowane. Alfa-beta algorytm oparty na warunki pracy i program tworzenia i co kilka podstawowych ruchów, ale znaleźli się w obliczu dwóch problemów:
Problem 1: Jak sprawdzić, czy komputer ma grać poprawnie? Nie ma sposobu, aby naprawdę mieć pewność, że komputer ma grać prawidłowego przemieszczania się (na każdej głębokości), ponieważ sami nie znają prawidłowego ruchu! Oczywiście, jeśli jesteś dobrym graczem w szachy można dowiedzieć się dobrym posunięciem dla danej pozycji statku, ale to nie rozwiąże problemu. Przede wszystkim nie możesz mieć pewność, że ruch to najlepszy ruch. Co zrobić, jeśli nie było lepiej, że porusza się po prostu nie widzi? Po drugie, szachiści nie myślę dokładnie tak samo jak komputer. Nie porusza się dokładnie obliczyć za pomocą algorytmu. Niektóre z ich decyzje są oparte na intuicji.
Najlepszych szachistów można patrzeć tylko na pozycji szachy i zobaczyć 2-3 linie gry, że powinni oni przeanalizować zamiast analizę wszystkich 30 + dostępne ruchy. Komputery nie mogą zrobić. Komputery powinny przyjrzeć się wszystkim zdecydować, czy przenosi się do przeprowadzenia analizy line gry do więcej głębi, czy nie. Ludzie są dobrzy w strategii szachy a komputery są w dobrej taktyki. Oznacza to, że człowiek nie może powiedzieć, czy komputer jest w doskonałej gry (na dowolnej głębokości), czy nie.
Problem 2: Od czasu naszej realizacji nie było kompletne i brak optymalizacji były początkowo, komputer zajmie bardzo dużo czasu do myślenia i dokonania ruchu. Musieliśmy czekać coś jak 4 minut lub tak, aby każdy ruch z komputera i było podjęcie dużo naszego czasu. Sprawdzaniu prawidłowości program zajmie dużo czasu.

Jeden dobry sposób na przetestowanie programu Chess jest sprawienie, aby grać przeciwko sobie # 2. Dlatego też naszym kod do późnej nocy i rano kiedy idziemy do szkoły chcemy uruchomić program i sprawiają, że grają przeciwko sobie. Kiedy wrócimy będziemy patrzeć na logi i zobaczyć co się stało. Jak byliśmy podekscytowani, wyniki były często przygnębiające. Przez większość czasu gry trafi do pętli, gdzie każdy z graczy w grze (tam iz powrotem) same ruchy . Powodem było to, że raz w szachy AI # 3 znalezionych najlepiej przenieść do określonego stanowiska rady, to po prostu gra na ruch bez względu na inne okoliczności, takie jak historia. Najlepszym sposobem, aby to naprawić to powiedz program do rozważenia również w historii ruch podejmowania decyzji, o której kawałek przenieść.
Innym powodem było to, że często pętli zarówno graczy w grze były tej samej mocy (obaj myślenia x idzie naprzód). Aby rozwiązać ten problem i zobaczyć prawdziwych wyników zrobiliśmy o różnych stężeniach. Jeden z graczy będzie myśleć x idzie naprzód, podczas gdy inne uznają, x-2 lub coś w tym stylu. Poprawa ta pomogła nam zobaczyć konkretne wyniki. Kiedy wróciliśmy do sprawdzania wyników na koniec dnia, można było zobaczyć jeden z graczy mata!
Jeśli do komputerów, programowania w szachy jest jednym z najlepszych sposobów na dobrą zabawę. Istnieje wiele zawiłości w realizacji, dzięki czemu można dostosować program ponownie i znowu stać się wydajności. Najlepsze programy szachowe tutorial (dla początkujących), spotykam się jest jednym z GameDev.net .
Pamiętam innych małych błędów mamy do czynienia. O to w jaki sposób program gry w szachy dowiaduje się najlepszy możliwy ruch:
Pokaż wszystkie ważne ruchy do dyspozycji gracza. Zakładam, że grałeś w ruchu i dowiedzieć się nowego położenia statku. Teraz spojrzeć na nowe stanowisko zarządu z punktu widzenia przeciwnika i spróbuj dowiedzieć się, co jego ruch jest najbardziej prawdopodobne, aby. Jeśli sprawia, że ruch, co będzie w nowej odsłonie stanowisko rady jak? Co można zrobić ruch w celu przeciwdziałania jego ruch?
Możesz iść i na iteracyjne głębiej i głębiej do tego drzewa, wyszukiwanie # 4. Głębsze wyszukiwanie, tym lepiej decyzji (ruchu) będzie. Dla każdej pozycji pokładzie algorytm przypisać wynik. Wynik określa, jak dobry jest stanowisko zarządu. Jeśli w jednym z kawałków jest zrobione, że tracisz dużo punktów. Na przykład w przypadku utraty piona, tracisz 1 punkt.
Teraz spójrz na następujące drzewa gry. Blue stanowi przejście przez komputer i czerwone, przejść przez przeciwnika. Cyfry oznaczają punkty zdobyte przez komputer w każdym kroku.

Na przykład w pierwszym wierszu gry, zyski komputer 5 punktów w pierwszym ruchu (prawdopodobnie przez przechwytywanie wieża), w przeciw-ruch przeciwnika walczy z powrotem zdobywając 3 punkty (prawdopodobnie przez biskupa przechwytywania / rycerz). Teraz jak może pamiętasz, algorytmy wygląda po prostu na łączną punktów gracza, na końcu każdej linii gry. W obu powyższych przypadkach, całkowity zysk przez komputer jest 2 punkty.
Jeśli komputer wybiera między tymi dwoma liniami gry losowo, jesteś w kłopoty. Problemem jest to, że komputer nie wie, co dzieje się po ostatnim ruchu w linii gry. Oznacza to, że jeśli się w pierwszym wierszu zabaw, które są prawie pewne, że zdobyli 2 punkty, po kolejnych dwóch ruchów, podczas gdy w drugiej linii grać tracisz 3 punkty po dwóch następnych ruchów. Można można uzyskać 5 punktów, później w grze, ale co jeśli po dwóch ruchów, kiedy można zobaczyć jeszcze w drzewo zdajesz sobie sprawę, że przejście widziałeś wcześniej byłoby katastrofalne? Będziesz musiał zmienić swoją grę, a to oznacza, że nie można dostać tych punktów.
Istnieją dwa sposoby rozwiązania tego problemu. Pierwszy to wolą na początku wskazuje na późniejsze. W naszym przykładzie, lepiej jest wybrać pierwszą linię grać w drugiej.
Drugim sposobem jest wykorzystanie szukaj spokoju :
Efekt horyzontu można ograniczyć poprzez rozszerzenie algorytmu wyszukiwania z wyszukiwania spokoju. Daje to możliwość algorytm wyszukiwania patrzeć poza horyzont dla pewnej kategorii porusza istotne znaczenie dla stanu gry, jak pojmuje.
Zrobiliśmy wiele zmian w kodzie. Kiedyś podjąć drukowane wersje kodu źródłowego (około 100 stron) na naszej uczelni i próbował znaleźć optymalizacji, które mogą być stosowane w odniesieniu do kodu. programowania Szachy to jedna z dziedzin, w których ponad optymalizacja nie jest mile widziana.
Więc po wszystkim ciężka praca, program działa dobrze i może grać godnej gry w szachy (biorąc pod uwagę wystarczająco dużo czasu, oczywiście).
Tłumaczenie kodu źródłowego
My tylko o bycie szczęśliwym w jaki sposób projekt się dzieje, kiedy do nas trafić - kolegium wprowadzone ograniczenie, że wszystkie projekty muszą być wykonane przy użyciu języka Java. Mieliśmy do portu aplikacji Java wkrótce.
Przepisanie całej aplikacji od początku wydawało się czasochłonne i motywacji. Musieliśmy szybciej. Co o konwersji kodu źródłowego do kodu źródłowego VB6 Java automatycznie? Oczywiście aby to działało trzeba by napisać do VB tłumacz języka Java. Wydawało się zbyt trudne, biorąc pod uwagę szybko zbliża się termin przedstawienia projektu. Możemy pobrać kilka programów do tłumaczenia kodu z Internetu i próbował je, ale żaden z nich nie wydaje się działać doskonale. Przekształcania złożonych VB6 UI o sporo niestandardowych animacji Java jest prawie niemożliwe nawet dla zaawansowanych tłumacz.
Wtedy wpadł na pomysł. Regex!
Oczywiście wyrażenia regularne nie są idealne do analizowania kodu źródłowego w jakiejkolwiek formie. Nie mieliśmy czasu, więc postanowiłem spróbować i tak.
W przypadku jakichkolwiek przyzwoity program w szachy, istnieją dwie podstawowe części: silnik szachowy i modułu interfejsu użytkownika. Silnik szachy to wszystko skomplikowane obliczenia - nagranie ruchów użytkownika, dowiedzieć się, czy ruch jest ważny, czy nie, planujesz najlepiej przenieść do komputera itp. Moduł wyświetla UI szachownicy dla użytkownika i umożliwia użytkownikowi dokonanie poruszać za pomocą myszki. Teraz jak już można wywnioskować, część UI nie jest zbyt tłumaczenie między VB6 i Java. Zdecydowaliśmy się rozwijać od podstaw interfejsu użytkownika w Java.
Ciekawe o silnik szachowy, że zawiera on wiele, wiele obliczeń, warunki i pętle, które pomagają jej do podejmowania świadomych ruchu. należy pamiętać, że prawdopodobnie silnik szachowy nie może być uznany jako taki inteligentny. Szachy awarii silnika miliony liczba bardzo szybko i dowiaduje się, najlepiej przenieść komputer może zrobić z człowieka przeciwnika. Porusza może wyglądać inteligentny człowiek graczem, ale silnik szachowy nie można uznać za przykład silnik AI. To jest tylko numer cruncher pod jego warstw. W każdym razie chodzi o to, że mamy setki stron kodu, który składał się wyłącznie z algorytmów wspomagania komputerowego w grze lepiej gra w szachy.
Jak dowiedzieliśmy się, z tych algorytmów przetwarzania kodu Java VB6 nie było takie trudne jak się wydaje. Zatrudniliśmy uprawnień wyrażeń regularnych to zrobić. O to zobaczyć tego, co zrobiliśmy.
1. Otrzymuje:
Jeśli z if (Na z za (Następnie z (Z innego) else (End If, Next, End etc z funkcji)Prawda z prawdąFałszywe fałszyweI & &Lub | |Mod z%Do wyjścia z break;= W instrukcji warunkowych m-tego ==
itd.
2. Dodanej; (średnik) na końcu linii, która nie rozpoczęła z żadnej z powyższych słów kluczowych.
3. Zmiana kodu referencyjnego tablicy. in Java code. Coś Board(x,y) w VB6 kod został board[x][y] w kodzie Java.
4. Było kilka skomplikowanych instrukcji warunkowych w kodzie VB, że myśleliśmy, że byłoby niemożliwe do przejścia na Regex Java przy użyciu. Musieliśmy przerobić te ręcznie.
5. Przeliczane pętli oświadczenia w formie
For i = 0 To NumMoves - 1 to
for(int i = 0; i < numMoves-1; i++){
6. Deklaracji zmiennych z formularza
Dim index As Integer to
int index = 0;
Więcej było tego rodzaju.
Oczywiście to nie wszystkie rzeczy Regex. Nie da się zrobić to dobrze z Regex sam. Mały program, pisaliśmy do tłumaczenia kodu przeczytać każdy wiersz kodu VB oddzielnie i przekonwertować go do Java, głównie za pomocą wyrażeń regularnych. Całego tłumaczenia (wymiana Regex), została sporządzona w kilku przebiegach. Nigdy realizowane na pełną skalę lub parser tłumacz języka.
Nawet po tym całym cyrku Regex tłumaczenie nie jest kompletna. Trzeba było przeczytać większość kodu i zmienić wiele rzeczy, aby ją prawidłowo. Istnieje wiele różnic między językami (podobnie jak indeksy tablicy rozpoczął 0 w Java i 1 w VB6) oraz te musiały być pod opieką. To miało nas nieco wysiłku, aby uzyskać szczegółowe informacje prawdziwe, ale w końcu zakończyliśmy konwersję kodu Java z dużo mniej wysiłku niż przepisanie go całkowicie.
Proszę, nie pozwól tym artykule sprawiają, że myślisz, że adwokat przy użyciu Regex do tego typu pracy. Ja nie.
# 1 Więcej o tym później. Przypomnij mi, jeśli zapomnę. Obiecuję, że to się zmieni życie wielu studentów.
# 2 Innym dobrym sposobem jest od dołu to lepsze silniki szachy.
# 3 I zawiera słowo "AI" jest po prostu tak, że mogę pisać tego do wiadomości. algorytm gry w szachy nie mogą być uznane sztucznej inteligencji. gry w szachy jest problem pożerające liczby. Realizacja algorytmów w najbardziej efektywny sposób jest najlepszy sposób, aby uzyskać dobre wyniki. Nie trzeba nic wywiadu (w porównaniu do rzeczywistych technik sztucznej inteligencji, takich jak sieci neuronowe).
# 4 jest ograniczone przez moc obliczeniową masz. Na średniej liczby ważnych ruchów, które masz na każdy ruch w szachy jest około 30. Jeśli masz zamiar Wyszukaj w 8 porusza się do przodu, trzeba będzie szukać ^ 8 do 30 węzłów, co jest bardzo dużą liczbą.


Dobry artykuł ...
Ciekawe, ładne i świetny artykuł!
Interesujące. Jeśli było to mini projektu, co było Twoim głównym projektu?
Btw, wyrażenia regularne mogą być przydatne w tłumaczeniu kodu, jeśli stosowane ostrożnie na kod, który znasz (stosując się do kodowania i formatowania konwencji przyjętych przez regex). Niedawno zrobił to na przebudowę niektórych klas z java do actionscript - dopiero później zdałem sobie sprawę, że nie był pierwszym, aby spróbować java do AS3 i było gotowych narzędzi dostępnych w sieci.
Amarghosh,
Moim głównym projektu było rozpoznawanie znaków przy użyciu sieci neuronowych .
Tak - zrobiłem, że zbyt. Mam stworzyć skrypt TCL Perl do tłumaczenia. Tak, to też stosowane wyrażenia regularne. W mojej obronie to było dawno z powrotem
Jako fan gry w szachy sam uważam, że to bardzo interesujące. Wielki praca.
Nice & Cool, Innym prostym stylu wyjaśnić hard style. THX
Potrzebuję kod do studiowania, badania i java
możesz pomóc
Mój e-mail
trade.1000 @ yahoo.com
Dziękuję
Gabi
Kidu ...
Późno czytać, ale tak naprawdę napisać ... Nice one reszta to!