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 :)

- Rejestracja:ponad 5 lat
- Ostatnio:około 3 godziny
- Postów:56
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".
- Rejestracja:prawie 5 lat
- Ostatnio:3 dni
- Postów:354
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]

- Rejestracja:około 8 lat
- Ostatnio:około 4 lata
- Postów:607
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.

- Rejestracja:ponad 5 lat
- Ostatnio:około 3 godziny
- Postów:56
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.
- Rejestracja:prawie 21 lat
- Ostatnio:8 dni
- Postów:700
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/