В прототипе, который я делаю, есть мини-игра, похожая на bejeweled. Используя сетку, которая является двумерным массивом ( int[,]
), как узнать, когда пользователь сформировал совпадение? Я забочусь только о горизонтально и вертикально.
Сверху головы я думал, что просто посмотрю каждое направление. Что-то вроде:
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)
//...
Кажется, должен быть лучший способ. Есть?
Ответы:
Циклически перебирайте каждый элемент на одной оси (x или y), если они совпадают с предыдущим элементом, и их совпадение увеличивается. Когда следующий элемент станет другим, проверьте, соответствует ли совпадение или больше 3, вызовите функцию, которая удаляет совпадающие элементы, и продолжайте.
Код AS3:
Это только для оси x, для y, grid [col] [i] станет grid [i] [row] и т. Д. Я уверен, что вы можете понять это :)
источник
Подумал, что я подумаю о нашем опыте создания игры в стиле Match-3.
Мы создали прототип для основанной на Match-3 игры в слова, немного напоминающей скрэббл и Bejeweled. Мы очень рано поняли, что движок, который поставляет новые драгоценные камни / плитки для заполнения пустых пространств, должен быть очень интроспективным (мы запускаем гибридную эвристику и выборку по методу Монте-Карло), чтобы дать игроку реальную возможность струнных букв формировать слова через слова. Матч-3 механик. Это намного сложнее, чем описание, но я держу его кратким, потому что нам нужно написать статью.
Чтобы ответить на OP - мы выполняем проверки шаблонов, чтобы подсчитать, сколько совпадений имеется в любом заданном наборе в текущий момент, с помощью метода, очень похожего на фрагмент кода "gladoscc". Хотя он работает надежно, вычислительные затраты на рекурсивный запуск во время воспроизведения поиска по дереву становятся существенным бременем, поэтому мы находимся в процессе переписывания этой части логики и представления данных с помощью методологии «битовая доска» ( обычно реализуется в других сетках, таких как игры, такие как шахматы, шашки, Отелло и т. д.) В тестах мы показали, что он может работать в 20 раз быстрее в ActionScript, и поэтому для нас это нужно делать - это хлопотник - и освобождает необходимые циклы для отзывчивости, звука, анимации и т. д.
источник
Рекурсия, йо. Это когда ты не знаешь своих границ.
источник
Вы можете использовать алгоритм заливки . Это действительно полезно для такого типа проблемы.
источник