Gra kółko i krzyżyk - problem z oprogramowaniem poziomu Hard

0

witam,

kontynuuję mój mini projekt - ambitna gra w kółko i krzyżyk. póki co sa 3 warianty gry gracz vs gracz
gracz vs easy (komputer losuje gdzie wstawić swój ruch) oraz gracz vs medium (sprawdza czy ma 2 krzyżki koło siebie, jak ma to kończy, a jak nie może skończyć, to sprawdza czy gracz może. jeżeli tak, to blokuje go, jeżeli nie to daje losowo).

problem jest taki, że nie wiem jak zacząć pisanie poziomu hard. przykładowo w takiej sytuacji:

28827197.jpg

nie będzie tak jak poziom medium losował, tylko da krzyżyk w jednym z rogów planszy, żeby nie przegrać partii. jest dużo takich możliwości, więc jak najłatwiej będzie to zrobić? danie setki if'ów niezbyt wygląda mi na efektywny :P

dodanie obrazka do treści posta - fp

0

nie mam problemów z wymyślaniem "taktyk" dla tej gry, tylko nie wiem jak to zaimplementować.

tzn myślałem, żeby dać takie "schematy", czyli przykładowo sprawdzam, czy przeciwnik ma znaczek na środku i w rogu (np na polu [1.1]). jeżeli nie ma to obracam mape o 90stopni i jeszcze raz sprawdzam

inny pomysł to rekurencyjnie sprawdzać każde pole i robić symulację pt "co by było gdybym tutaj dał krzyżyk" a potem sprawdzał, gdzie jest najlepiej dać

0

to tylko gra w kółko i krzyżyk, nie żadne szachy ani nic skomplikowanego - maksymalnie po 5 ruchach gra się kończy
nawet jeśli dla każdego z ruchów wypiszesz odpowiednie warunki to nie będzie tam "setek ifów"

tu masz jakąś gotową implementacje
http://www.kriona.net/dml/tictactoe/code.php?target=tictactoe_ai

w sieci znajdziesz też tysiące innych gotowych implementacji - w nich szukaj inspiracji

gra jest na tyle głupia że nie wykonując błędów można ją jedynie zremisować
niższe poziomy trudności to jedynie odpowiednio zwiększone prawdopodobieństwo pomyłki

0

docelowo chce zwiększyć rozmiar mapy z 3x3 na większy, dlatego szukam bardziej uniwersalnego rozwiązania

There are two types of behavior for the computer opponent - one is blocking an
opponent from wininng, the other is making a winning move - that is, if the
computer has 2 spots in a row, picking that third spot and winning. If the
opponent choses not to block or win (or doesn't need to), it will pick a random spot.

takie coś już mam, chce iść trochę dalej

dodanie znacznika <quote> dla cytatu - fp

0

ale funkcja programmed_moves generuje najlepszy ruch i komputer na tym poziomie jest niepokonany - nie da się pójść jeszcze dalej

jeżeli chcesz krótszy kod to w pamięci rekurencyjnie przeanalizuj do 5 ruchów w przód wybierając za każdym razem tylko ruchy z sensem (nieprzegrywające), a następnie wybierz tę ścieżkę w której jest najlepszy stosunek zwycięstw / porażek
kosztem procesora zmniejszysz ilość hardkodowanego kodu i zrobisz prawdziwe AI

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