Алгоритм игры "Кварт" - PullRequest
       32

Алгоритм игры "Кварт"

1 голос
/ 16 марта 2019

В игре «Quath» вы заполняете блок и превращаете его в прямоугольник.Блок будет удален.

Обычное стирание

Normal Erase

[
 [1,1,1,1,1],
 [1,0,0,0,0]
]
// when rectangle complete ⤵️
[
 [1,1,1,1,1],
 [1,1,1,1,1]
]

Стирание цепи

Chain Erase

Но, если два блока соединены, когда они станут большим прямоугольником, они будут стерты вместе.

[
  [1,1,1,1],
  [1,0,0,1],
  [1,2,2,1],
  [0,0,2,0],
  [0,0,2,0]
]
//when rectangle complete,two block erase at same time
[
  [1,1,1,1],
  [1,0,0,1],
  [1,2,2,1],
  [1,2,2,1],
  [1,2,2,1]
]

Компоновка блоков в реальной игре кажется более сложной.

Я хочу знать, как судить о том, что является самым большим закрытым прямоугольником на карте.

Youtube: видео для этой игры

1 Ответ

0 голосов
/ 17 марта 2019

стереть целевое изображение
нашел решение для этого вопроса на себе.
используйте картинку выше, например.
присвойте каждому блоку идентификатор ,, тогда карта может быть выражена в виде массива ниже

[
  [a,a,a,a,a,b,b,b,0,0,0,0]
  [d,d,a,c,c,c,c,b,0,i,i,i]
  [d,0,0,0,0,0,0,b,h,h,h,i]
  [d,0,0,0,0,0,0,g,g,g,h,i]
  [d,0,0,0,0,f,f,f,f,g,h,0]
  [d,e,e,e,e,0,0,0,0,g,0,0]
]

попробуйте заполнить блок "f"

[
  [a,a,a,a,a,b,b,b,0,0,0,0]
  [d,d,a,c,c,c,c,b,0,i,i,i]
  [d,0,0,0,0,0,0,b,h,h,h,i]
  [d,0,0,0,0,0,0,g,g,g,h,i]
  [d,0,0,0,0,f,f,f,f,g,h,0]
  [d,e,e,e,e,f,f,f,0,g,0,0]
]

переместить курсор в 4 направления, если найти 0, уменьшить высоту или ширину прямоугольника
получить прямоугольник ниже, я назвал его «связанный ходок»

[
  [a,a,a,a,a,b,b,b]
  [d,d,a,c,c,c,c,b]
  [d,0,0,0,0,0,0,b]
  [d,0,0,0,0,0,0,g]
  [d,0,0,0,0,f,f,f]
  [d,e,e,e,e,f,f,f]
]

но части "блока i" все еще находятся снаружи большого прямоугольника
мы можем удалить область прямоугольника в массиве карты,
и найти там есть блок частей осталось

если не осталось частей, мы можем стереть большой прямоугольник

продолжить заполнять "блок f" «связанный ходок» может легко найти его в виде заполненного прямоугольника и стереть его

затем попробуйте заполнить "блок g"
мы получим прямоугольник как это

[
    [b,h,h]
    [g,g,g]
    [g,g,g]
    [g,g,g]
]

прямоугольник включает прямоугольник, который необходимо стереть
поэтому нам нужно удалить лишние части, а затем стереть нужную область

шагов, чтобы судить:
1. снимать блоки, блок станет частью набора блоков
2. запустить "связанный ходок"
3.Если прямоугольник результата имеет только один столбец или строку, это не допустимый прямоугольник (конечный судья)
4. найти дополнительные части в прямоугольнике
5. если нет, стереть прямоугольник (конечный судья)
6.Если да, удалите лишние детали, найдите прямоугольник слева, снова бегите бегом (конечный судья)

я думаю, что это не лучший способ решить этот вопрос.
это может быть очень медленно, у кого-нибудь есть идея?

...