LINUX.ORG.RU

color lines. помогите с алгоритмом


0

0

for(int x=0; x<NUMCELLSW; x++) {
  for(int y=0; y<NUMCELLSH; y++){
    color = getBall(x,y);
      if ( color != NOBALL) {
      bit_erase[y][x] = true;
      }
   }
}

x и y - координаты шарика на доске. getBall - получить цветовой код
шарика. bit_erase - массив. если елемент массива равен true,
то соответствующий шарик убирается. 

как запрограммировать поиск и удаление фигуры, состоящей из >=7
шариков одного цвета, в произвольном порядке соприкасающихся
друг с другом? типа

xxx    x
 x     xx 
  xxx    x
          xx
          x

дописывается игрушка klines из kdegames по просьбе кореша. сиплюсы почти не знаю - добавил квадрат, а как эту штуку сделать знаний не хватает.
☆☆

Пусть есть 2-х мерный массив M - игровое поле, размером SxS. Каждая ячейка массива хранит значение из множества {Пусто,Красный шарик, Синий шарик, ... }.

Функция которая считает число соприкасающихся шариков будет иметь вид:

СколькоШариков (x,y,цвет) = if M[x,y] = цвет then 1 + (if x>1 then СколькоШариков(x-1,y,цвет) + ( if y >1 then СколькоШариков (x-1,y-1,цвет)) + (if y<S then СколькоШариков (x-1,y+1,цвет))) + (if x=<S then СколькоШариков(x+1,y,цвет) + ( if y >1 then СколькоШариков (x+1,y-1,цвет)) + (if y<S then СколькоШариков (x+1,y+1,цвет))) + (... проверка остальных клеток ...) else 0;

Можешь эту же бодягу представить в виде итеративного алгоритма

anonymous
()

Пусть есть 2-х мерный массив M - игровое поле, размером SxS. 
Каждая ячейка массива хранит значение из множества {Пусто,Красный шарик, Синий шарик, ... }.

Функция которая считает число соприкасающихся шариков будет иметь вид:

СколькоШариков (x,y,цвет) = 
if M[x,y] = цвет  then 
      1 + (if x>1 then СколькоШариков(x-1,y,цвет) + 
                   ( if y >1 then СколькоШариков (x-1,y-1,цвет)) +
                   (if  y<S then СколькоШариков (x-1,y+1,цвет))) +
           (if x=<S then СколькоШариков(x+1,y,цвет) + 
                   ( if y >1 then СколькоШариков (x+1,y-1,цвет)) +
                   (if  y<S then СколькоШариков (x+1,y+1,цвет))) +
           (... проверка остальных клеток ...)
     else
           0;

Можешь эту же бодягу представить в виде итеративного алгоритма


          

anonymous
()
Ответ на: комментарий от anonymous

Нашел ошибку. Надо еще запоминать из какой клетки перешел в текущую, чтобы ее не считать при переходе и не вызывать для нее СколькоШариков иначе все зациклится нах

anonymous
()
Ответ на: комментарий от anonymous

>Пусть есть 2-х мерный массив M - игровое поле, размером SxS. 
Каждая ячейка массива хранит значение из множества {Пусто,Красный шарик, Синий шарик, ...

там по-деревянному getBall(x,y) - получить числовой код цвета шарика из этой ячейки. хотя роли это не играет

>Функция которая считает число

не... нужны координаты всех клеток

с проверкой полей мне всё ясно, но куда запоминать проверенные ячейки? типа 

eraseList.append( [ x, y] )

чтобы потом 

for place in eraceList:
  bit_erase[place[1]][place[0]]=True
  # place[1] и place[0] - y и x соответственно

и if [ x, y ] not in checkedList ( не проверять два раза одну и ту же
ячейку. сразу менять значение в массиве bit_erase низя, потому что
не факт что наберется 7 штук

Muromec ☆☆
() автор топика
Ответ на: комментарий от Muromec

и эта... если делать рекурсивную, то как вернуть из функции два значения? типа return [ x, y ] в питоне

Muromec ☆☆
() автор топика
Ответ на: комментарий от drF_ckoff

>эй. зачем klines, а? допиши gtkballs? =)

затем, что когда я в Games спрашивал какие есть игрухи кроме glines и klnes мне нифига не ответили

Muromec ☆☆
() автор топика
Ответ на: комментарий от Muromec

Да ты не делай рекурсивно, делай итеративно. На самом деле это идея из волнового алгоритма поиска пути в графе. Или, как уже говорили, из алгоритма заливки. Все просто.

1. Когда шарик перескочил в точку с координатами х,y ты смотришь, есть ли в единичной окрестности этой точки шарики такого же цвета.

2.Если есть, то помечаешь их и запоминаешь буфере (выгодно реализовать буфер через список).

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

4. Берешь следующий шарик из буфера... и т.д. пока не дойдешь до последнего шарика.

5. Все нужные тебе шарики лежат в буфере. Все!

6. Снимаешь пометки с шариков.

Bob1
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.