Dostępne komórki

Dostępne komórki

> Programowanie

Algorytm ten ma na celu znalezienie komórek, do których może dotrzeć por, zaczynając od danej komórki i numeru PM.

Powoduje to, że funkcja przyjmuje komórkę i liczbę jako parametr i zwraca tablicę komórek.

Jeśli powiedziano ci o funkcjach „getAccessibleCells”, „getReachableCells” lub innej podobnej nazwie, będziesz teraz wiedział, co to jest.

Używać

Od momentu, gdy zechcesz zaplanować swoje podróże, ta funkcja będzie niezbędna.

Znajomość komórek, do których możesz się udać, pozwala na przykład wybrać komórkę, w której odniesiesz najmniejsze potencjalne obrażenia, lub zobaczyć, gdzie możesz się poruszyć, aby zadać obrażenia przeciwnikowi.

Algorytm ten jest w szczególności używany w algorytmie Cache-cache (Le cache-cache).

Pierwsze metody

Zasada

Samo w sobie dość proste jest wdrożenie sposobu na uzyskanie dostępu do komórek. Najprostszą metodą jest przetestowanie odległości do każdej komórki na mapie za pomocą getPathLength.

Ale ta funkcja ma wysokie koszty operacyjne. Więc używaj go na każdej komórce mapy... Twoje zużycie operacji gwałtownie wzrośnie.

Nieco mądrzejszym rozwiązaniem byłoby najpierw znalezienie komórek w zasięgu PM, a następnie sprawdzenie, czy są one osiągalne przez getPathLength.

Jeśli te dwa rozwiązania są wykonalne, ich koszty operacyjne szybko stają się wysokie.

Jeśli jesteś początkującym, a rozwiązanie, które omówimy poniżej, nadal wydaje się nieco skomplikowane, na początku możesz zadowolić się tymi rozwiązaniami. Na początku gry niekoniecznie będziesz miał dużo obliczeń do wykonania, a na niskim poziomie nie będziesz miał dużej ilości MP. Możesz więc pozwolić sobie na korzystanie z tych rozwiązań.

Problem

Uzyskanie dostępu do komórek za pomocą tych metod będzie bezproblemowe.

Ale pierwszy problem pojawia się, gdy liczba PM wzrasta. Im wyżej się wspina, tym oczywiście więcej kwadratów będzie do przetestowania. W najgorszym przypadku, jeśli przejrzysz całą mapę za pomocą getPathLength, powinieneś otrzymać rachunek w wysokości około 4 milionów operacji, „tylko”.

Wystarczy powiedzieć, że znacznie ogranicza to operacje dostępne dla innych algorytmów, takich jak Kombinacje lub Mapa uszkodzeń.

I to nie wszystko ! Jest jeszcze jeden problem: nie jesteś sam w walce. Zdecydowanie będziesz musiał zdobyć dostępne komórki przeciwników, aby móc chronić się przed ich atakami. A jeśli różne pory zaczną przywoływać cebulki, to jeszcze więcej komórek do obliczenia.

Krótko mówiąc, jeśli zaczniesz chcieć obliczać dostępne komórki całego tego małego świata za pomocą tych metod, będzie to kosztować znacznie więcej niż ramię.

Dlatego używamy innej metody, znacznie skuteczniejszej: Idź od sąsiada do sąsiada!

Metoda sąsiada

Wymagania wstępne

Po pierwsze, co to jest „sąsiad”? Sąsiedzi komórki to po prostu sąsiadujące z nią komórki. I oczywiście mówimy o komórkach, które mają wspólną stronę, komórkach, które są bezpośrednio obok nich, a nie tych po przekątnej.

Zatem komórki znajdujące się w rogach mapy mają jednego sąsiada. Komórki na krawędziach mają dwa. A wszyscy inni mają cztery.

Pierwszą rzeczą, którą musisz wiedzieć, jak to zrobić, jest pobranie sąsiadów komórki. Korzystając z funkcji getCellX, getCellY i getCellFromXY, możesz łatwo określić tych słynnych sąsiadów.

Po odzyskaniu sąsiadów komórki musisz określić, czy ta komórka jest „przejezdna”. Oczywiście, jeśli komórka jest przeszkodą lub jest tam por, twój por nie będzie mógł się po nim poruszać.

Aby to wiedzieć, będziesz potrzebować funkcji isObstacle, isEmptyCell, isLeek lub getCellContent.

Zasada

Zasada jest właściwie dość prosta. Nawet jeśli niekoniecznie jest to łatwe do skonfigurowania dla początkującego w programowaniu.

Twój por znajduje się więc na komórce i ma określoną liczbę MP do przeniesienia. Komórka, w której aktualnie się znajduje, znajduje się w odległości 0 PM; Jak na razie dobrze...

Jeśli twój por ma 1 MP, gdzie może się poruszać? Cóż, na wolnych sąsiadach jego początkowej komórki.

Co jeśli ma 2 MP? Może zatem poruszyć się za 1 PM na wolnych sąsiadów swojej początkowej komórki. Ale także, dla 2 PM, na wolnych sąsiadach wolnych sąsiadów komórki początkowej.

I tak dalej...

<img src="https://i.ibb.co/7jdzBZr/Tuto-Cell-Accessible-Iteration.gif" alt="Tuto-Cell-Accessible -Iteracja" bor