Algorytm mini-max do gry w szachy

0

Cześć mam problem z napisaniem Ai do szachów, tutaj moja klasa:
[https://pastebin.com/LRCHeG6s]
funkcja zawsze zwraca (0, 0) (0, 0), co ma zwracać gdy depth osiągnie 0?
Proszę o pomoc :)

1
Suchy702 napisał(a):

Cześć mam problem z napisaniem Ai do szachów, tutaj moja klasa:
[https://pastebin.com/LRCHeG6s]
funkcja zawsze zwraca (0, 0) (0, 0), co ma zwracać gdy depth osiągnie 0?
Proszę o pomoc :)

Powinna zwracać ruch rozważany w danym momencie (start, koniec). Jak nie chcesz używać pustych zmiennych (albo default wartości) na wejściu, to warto rozważyć rozbicie tego na 2 różne funkcje (przypinać ruch tylko na funkcji wejsciowej, a w innych wywołaniach zwracać tylko value ruchu), albo użycie algorytmu o nazwie "negamax".

0

Cześć,
Zmieniłem trochę algorytm ale teraz zwraca rzeczy totalnie bez sensu, po moim pierwszym ruchu zwraca, (1700, (4, 3), (6, 2)) co jest ruchem konia ale w głębokości 3, tak jakby mój algorytm nie dokonywał wyboru lub w jakiś zły sposób cofał zmiany, nie wiem też czy wszystko z moim algorytmem jest tak jak trzeba bo wynik 1700 jest naprawdę zastanawiający, pod dodaniu funkcji copy do figur, okazuje się też że mój algorytm chce wykonać ruch pustym polem, (No i oczywiście wywala błąd AttributeError: 'NoneType' object has no attribute 'copy') proszę o pomoc :)
Znalazłem jeden błąd, algorytm po przesunięciu nie usuwał figury którą przesuwał tylko ją kopiował, teraz niestety bot rusza się koniem na pozycję wieży bijąc ją przy tym :(
Mój poprawiony kod: [https://pastebin.com/JiddTv1Y]

1

Ja bym spytał, dlaczego to jest klasa Bot, co to w ogóle robi, jaki to ma cel? Jako Bot ma to kompletnie bez sensu, moim zdaniem, metody, min, max, possible_results - co one znaczą i w jakim kontekście? Minimalną ilość botów, maksymalną? To jest używanie OOP na pałę i jakoś to będzie.

Ileż lepiej by było, gdyby była klasa Board (szachownica) i posiadała metody: start_position(), possible_moves(), make_move(), current_position() - czyli inicjalizujesz Board, wskazujesz startową pozycję (bo ta nie musi być "domyślną"): Board.start_position(notation) i dostajesz listę ruchów Board.possible_moves() - od razu logika lepiej trzyma się kupy, a "Engine" z algorytmem wynieś do innej klasy, która w jakiś sposób może używać Board do "wizualizacji" algorytmu.

0
Suchy702 napisał(a):

Cześć,
Zmieniłem trochę algorytm ale teraz zwraca rzeczy totalnie bez sensu, po moim pierwszym ruchu zwraca, (1700, (4, 3), (6, 2)) co jest ruchem konia ale w głębokości 3, tak jakby mój algorytm nie dokonywał wyboru lub w jakiś zły sposób cofał zmiany, nie wiem też czy wszystko z moim algorytmem jest tak jak trzeba bo wynik 1700 jest naprawdę zastanawiający, pod dodaniu funkcji copy do figur, okazuje się też że mój algorytm chce wykonać ruch pustym polem, (No i oczywiście wywala błąd AttributeError: 'NoneType' object has no attribute 'copy') proszę o pomoc :)
Znalazłem jeden błąd, algorytm po przesunięciu nie usuwał figury którą przesuwał tylko ją kopiował, teraz niestety bot rusza się koniem na pozycję wieży bijąc ją przy tym :(
Mój poprawiony kod: [https://pastebin.com/JiddTv1Y]

No tutaj problem jest taki, że ten rozważany ruch o którym mówiłem to ruch na głebokości wejsciowej (pierwsze odpalenie funkcji). Musiałbyś go wsadzać kilka poziomów wywołań w dół jako argument, co może być niewygodne. Polecam zrobić oddzielna funkcje wejściowa, i w jej scope trzymać najlepszy ruch + score. Podmieniać go, razem ze score, kiedy nowy ruch ma lepsze score niż poprzedni. Na koniec kiedy każdy z ruchów zostanie juz rozważony zwrócić ten najlepszy.

0

Zawsze możesz też sprawdzić jak to jest rozwiązane tutaj ;)
https://pypi.org/project/python-chess/

albo ciagnac rozwiazania z proste z ryby https://pypi.org/project/pystockfish/

1 użytkowników online, w tym zalogowanych: 0, gości: 1