Вроде чтото получилось, немного замороченно, но работает
,
через графический буфер . Написал именно алгорит подсчета скоплений.
Для примера взял подсчет зеленых камушков из примера выше, но можно подсунуть любую комбинацию.
Поиск этих камушков по очереди и подставку под мой скрипт не писал, там должно быть все просто.
PXLREPLACE (-1, -1, 6, 7, -1, 0) //красим верхний левый участок в черный
//наша матрица найденных элементов одного цвета (зеленые камни)
//для наглядности и тестов так проще
STRSEPARATE ("1 1 0 0 0 0"," ", $arr1)
STRSEPARATE ("1 0 0 1 1 0"," ", $arr2)
STRSEPARATE ("0 0 0 0 0 0"," ", $arr3)
STRSEPARATE ("0 0 0 0 1 1"," ", $arr4)
STRSEPARATE ("0 1 1 1 1 0"," ", $arr5)
//пишем в графический буфер
ARRCONCAT ($arr, $arr1, $arr2, $arr3, $arr4, $arr5)
FOR($y=0,$y<5)
FOR($x=0,$x<6)
PXLREPLACE ($x, $y, $x, $y, -1, $arr[$i])
inc($i)
END_CYC
END_CYC
//смотрим начальные данные
print("начальные данные:")
FOR($y1=0,$y1<5)
print(pxl(0,$y1), " ", pxl(1,$y1), " ", pxl(2,$y1), " ", pxl(3,$y1), " ", pxl(4,$y1), " ", pxl(5,$y1))
END_CYC
print(" ")
FOR($a=0,$a<15) // максимальное количество скоплений - 15
//ищем в поле единицу
FOR($y=0,$y<5)
FOR($x=0,$x<6)
IF(pxl($x, $y) = 1)
//как только нашли, пишем в массив
//заодно меняем на порядковый номер, начиная с 2
$arrs[$a] = 1
PXLREPLACE ($x, $y, $x, $y, -1, $a+2)
$y = 5 //после найденной первой единицы, выходим из цикла
END_IF
END_CYC
END_CYC
IF($y ! 5) // если единицы не закончились
FOR($w=0,$w<5) //повторяем 5 раз, чтобы засчитать единицы с права на лево
FOR($y=0,$y<5)
FOR($x=0,$x<6)
IF(pxl($x, $y) = $a+2)
IF(pxl($x+1, $y) = 1)
PXLREPLACE ($x+1, $y, $x+1, $y, -1, $a+2)
$arrs[$a] = $arrs[$a]+1
END_IF
IF(pxl($x, $y+1) = 1)
PXLREPLACE ($x, $y+1, $x, $y+1, -1, $a+2)
$arrs[$a] = $arrs[$a]+1
END_IF
IF(pxl($x-1, $y) = 1)
PXLREPLACE ($x-1, $y, $x-1, $y, -1, $a+2)
$arrs[$a] = $arrs[$a]+1
END_IF
IF(pxl($x, $y-1) = 1)
PXLREPLACE ($x, $y-1, $x, $y-1, -1, $a+2)
$arrs[$a] = $arrs[$a]+1
END_IF
END_IF
END_CYC
END_CYC
END_CYC
else
$a = 15 // ЗАКОНЧИЛИ , единиц нету в поле
END_IF
END_CYC
//смотрим результат
print("результат:")
FOR($y1=0,$y1<5)
print(pxl(0,$y1), " ", pxl(1,$y1), " ", pxl(2,$y1), " ", pxl(3,$y1), " ", pxl(4,$y1), " ", pxl(5,$y1))
END_CYC
FOR($a=0,$a<arrsize($arrs))
print("Скопление под номером ",$a+2," - ",$arrs[$a]," элементов")
END_CYC
print(" ")
halt
Лог:
22:34:25 начальные данные:
22:34:25 1 1 0 0 0 0
22:34:25 1 0 0 1 1 0
22:34:25 0 0 0 0 0 0
22:34:25 0 0 0 0 1 1
22:34:25 0 1 1 1 1 0
22:34:26
22:34:26 результат:
22:34:26 2 2 0 0 0 0
22:34:26 2 0 0 3 3 0
22:34:26 0 0 0 0 0 0
22:34:26 0 0 0 0 4 4
22:34:26 0 4 4 4 4 0
22:34:26 Скопление под номером 2 - 3 элементов
22:34:26 Скопление под номером 3 - 2 элементов
22:34:26 Скопление под номером 4 - 6 элементов
22:34:26
Наверно можно это все переделать на работу через массив, но у меня идея в голове именно так изначально появилась.
Можно изначальные данные вручную менять как угодно, для теста.
Немного упростил код.