Rozważ siatkę kwadratów 2 x 2. Gracz może przejść na pole, jeżeli:
- żaden inny gracz nie chce przejść na pole w następnej turze
- żaden inny gracz nie czekał i nadal zajmuje pole w tej turze
Dołączyłem obraz powyżej, aby opisać mój problem.
Gracze poruszają się jednocześnie.
Jeśli 2 (lub więcej) graczy próbuje przenieść się na to samo pole, żaden z nich nie porusza się.
turn-based
t123
źródło
źródło
Odpowiedzi:
Myślę, że to powinno działać. Z pewnością działa w przypadku opublikowanej przez Ciebie skrzynki i kilku innych trywialnych przypadkach, w których ją przetestowałem.
źródło
Rozwiązywanie kolizji zamiast zapobiegania kolizjom.
Po prostu przesuń obiekty, a następnie sprawdź, czy nie doszło do kolizji. Jeśli doszło do kolizji z innym blokiem, wróć na poprzedni kwadrat lub, w zależności od rodzaju gry, inny kwadrat.
źródło
Wymaga to, aby każdy gracz pamiętał, skąd się przeprowadził, aby mógł zostać zwrócony, a także pamiętał, czy przeprowadził się w tej turze. To drugie sprawdzenie oznacza, że każdy element będzie wymagał zwrotu tylko raz i powinien gwarantować prawidłowe zakończenie działania algorytmu. Zapewnia również, że tylko gracze, którzy się przenieśli, są zwracani - pierwotny użytkownik może pozostać, ponieważ nie są brani pod uwagę do usunięcia.
źródło
Innym rozwiązaniem jest użycie mapy 2x większej niż to, co pokazujesz. za każdym razem, gdy chcesz przenieść graczy, przenosisz ich dwukrotnie, więc gracze zawsze lądują na kafelkach o równej wartości zarówno dla X, jak i Y. Znowu pojawią się rzadkie przypadki, które będą wymagały więcej uwagi, ale większość możliwych przypadków zostanie rozwiązana (np. opisane) bez zastanowienia.
źródło
Zarejestruj wszystkie wymagane ruchy za pomocą tablicy lub mapy.
W przypadku konfliktu wycofaj dane żądanie przeniesienia. Jeśli to zwróci obiekt na kwadrat, który inny obiekt próbuje zająć, cofnij żądanie obiektu żądającego.
Pseudo kod:
źródło
Opierając się na odpowiedzi SimonW , oto wyraźny algorytm:
Pozwolić
squares
będzie tablicą indeksowaną przez lokalizacje gracza i zawierającą dla każdej możliwej lokalizacji indeks innej lokalizacji lub wartość specjalnąNULL
. (Możesz zapisać to jako rzadką tablicę.) Możliwe wartości wpisów w tej tablicy można interpretować w następujący sposób:squares[S]
jestNULL
, kwadratS
może się swobodnie poruszać.squares[S] == S
albo graczS
nie może się ruszyć, albo dwóch (lub więcej) graczy próbowało przenieść sięS
w tym samym czasie i obaj zostali odrzuceni.squares[S]
będzie zawierać indeks kwadratu, z którego gracz chce przejść do kwadratuS
.W każdej turze zainicjuj wszystkie wpisy
squares
do,NULL
a następnie uruchom następujący algorytm:Następnie ponownie przejrzyj listę graczy i przesuń tych, którzy są w stanie to zrobić:
Ponieważ każdy ruch można zaplanować tylko raz i anulować maksymalnie raz, ten algorytm będzie działał za O ( n ) czasu n graczy, nawet w najgorszym przypadku.
(Niestety, ten algorytm nie powstrzyma graczy przed zamianą miejsc lub krzyżowaniem ścieżek po przekątnej. Może być możliwe dostosowanie do niej dwuetapowej sztuczki Gajeta , ale całkowicie naiwny sposób nie działa i jestem zbyt zmęczony wymyślić teraz lepszy sposób).
źródło