W prototypie, który robię, jest mini-gra podobna do bejeweled. Używając siatki, która jest tablicą 2d ( int[,]
), skąd mam wiedzieć, kiedy użytkownik utworzył dopasowanie? Dbam tylko o poziomo i pionowo.
Z czubka głowy myślałem, że po prostu spojrzę w każdym kierunku. Coś jak:
int item = grid[x,y];
if(grid[x-1,y]==item)
{
int step=x;
int matches =2;
while(grid[step-1,y]==item)
{
step++;
matches++
}
if(matches>2)
//remove all matching items
}
else if(grid[x+1,y]==item
//....
else if(grid[x,y-1==item)
//...
else if(grid[x,y+1]==item)
//...
Wydaje się, że powinien istnieć lepszy sposób. Jest tu?
Odpowiedzi:
Pętlę przez każdy element na tej samej osi (x lub y), jeśli są one takie same jak poprzedni element, zwiększają liczbę pasujących elementów. Gdy następny element stanie się inny, sprawdź, czy dopasowania są większe niż 3, wywołaj funkcję, która usuwa pasujące elementy i kontynuuj.
Kod AS3:
To jest tylko dla osi x, dla y, grid [col] [i] zmieni się w grid [i] [row] itp. Jestem pewien, że możesz to rozgryźć :)
źródło
Pomyślałem, że skorzystam z naszego doświadczenia w tworzeniu gry typu „Dopasuj 3”.
Zbudowaliśmy prototyp gry słownej opartej na dopasowaniu 3, trochę jak zebranie scrabble i Bejeweled. Bardzo wcześnie zdaliśmy sobie sprawę, że silnik, który dostarcza nowe klejnoty / kafelki do wypełnienia pustych miejsc, musiałby być wysoce introspektywny (prowadzimy heurystykę hybrydową i próbkowanie MonteCarlo), aby stworzyć graczowi rzeczywiste możliwości ciągnięcia liter w celu tworzenia słów przez Mechanik Match-3. Jest o wiele bardziej skomplikowany niż opis, ale krótko mówiąc, bo musielibyśmy napisać artykuł.
Aby odpowiedzieć na OP - przeprowadzamy sprawdzanie wzorca, aby ocenić, ile pasowań jest w danym momencie, za pomocą metody bardzo podobnej do fragmentu kodu „gladoscc”. Choć działa solidnie, koszt obliczeniowy związany z uruchomieniem rekurencyjnym podczas odtwarzania wyszukiwania drzewa staje się znaczącym obciążeniem, dlatego jesteśmy w trakcie przepisywania tej części logiki i reprezentacji danych przy użyciu metodologii tablicy bitów ( powszechnie zaimplementowane w grach innych niż grid, takich jak szachy, warcaby, Othello itp.) W testach pokazaliśmy, że może on działać ponad 20 razy szybciej w ActionScript, więc dla nas potrzeba wykonania tego jest bardzo prosta - i uwalnia niezbędne cykle dla reakcji, dźwięku, animacji itp.
źródło
Rekurencja, yo. Jest tak, gdy nie znasz swoich granic.
źródło
Możesz użyć algorytmu wypełniania zalania . Jest to naprawdę przydatne w tego rodzaju problemach.
źródło