Вот набросал распознавалку чисел. В основном для использования в играх, т.к. есть ограничения...
Старался сделать универсальным и настраиваемым. Не важно выравнивание идёт по первому или последнему разряду.
Старая версия, ещё под 4.7
[spoiler]Вариант скрипта с последовательным перебором разрядов.
Хотел обойтись без текстовых файлов, только переменные. Использование текстовых файлов уменьшило бы размер скрипта, но я думаю сказалось бы незначительно на скорости работы и удобстве настройки.
Скрипт при внедрении лучше организовать как подпрограмму.
О ограничениях.- Только целые положительные числа. Думаю для игр этого хватит, здоровье там всякое, сила и т.п.
- Максимум 10 разрядов. Если кровь из носа - можно переписать скрипт на другое кол-во
- Расположение цифр равномерное. Что это значит: разряды должны идти через равный промежуток
299000, а не 299 000 и т.п. - Определение конца числа по маркеру (картинке) либо по отсутствию найденных цифр. Файл *11.bmp должен быть всё равно, например мой digit_11.bmp
Настройка.Не пугаться! Письменно выглядит много, но всё на самом деле просто.
- Необходимо заготовить картинки с цифрами 1,2,3,4,5,6,7,8,9,0 дать им соответствующие имена digit_1.bmp-digit_0.bmp
Можно заготовить маркер окончания digit_11.bmp - Замерить шаг разрядов - расстояние в пикселах от начала одной цифры до начала следующей и присвоить переменной $sdvig значение чуть меньше (можно на 1-2 пиксела, для больших шрифтов можно и больше).
- Если в пределах вашего скрипта буде распознаваться несколько шрифтов, при вызове подпрограммы нужно каждый раз задавать $sdvig и префикс имён файлов $pref. Если шрифт один - только один раз.
- При вызове задаём координаты поля в котором будет искаться число
$field_x1, $field_y1, $field_x2=, $field_y2 - Результат возвращается в переменную $res, если не найдено $res=-1.
Сам скрипт.#name "Распознавание чисел"
// Author: Vint
// Version: 1.1 (30.01.2013)
// Результат возвращается в $res если не найдено $res=-1
// Только целые числа. Максимум 10 разрядов. Расположение цифр равномерное.
// Вариант скрипта с последовательным перебором разрядов
// Хотел обойтись без текстовых файлов, только переменные
//====== переменные которые задаются 1 раз если всего один шрифт ====
//если в скрипте будет искаться несколько наборов шрифтов, то задавать каждый раз при вызове
$sdvig=6 // сдвиг, чуть меньше чем ширина 1 цифры с отступом
$pref="textures\digit_" // префикс имён файлов с цифрами
//====== переменные которые задаются при вызове поиска ====
//если место поиска всего одно, задавать только один раз
$field_x1=0 // поле под число, координата X1
$field_y1=0 // поле под число, координата y1
$field_x2=0 // поле под число, координата X2
$field_y2=0 // поле под число, координата y2
//====== внутренние переменные ====
$razr_max=0 // максимальная разрядность числа
$xmin=5000
$res=-1 // очищаем результат
$i=0 // очищаем результат
//================== начало ====================================================
FOR ($obhod, $obhod<10) // очищаем результат
GOSUB(sdvig_razryada)
END_CYC
GETSCREEN
FOR ($i, $i<10) // ищем самую левую цифру
IF_PICTURE_IN ($field_x1,$field_y1,$field_x2,$field_y2, STRCONCAT($pref,$i,".bmp"))
IF($_return1<$xmin)
$xmin=$_return1
INC($razr_max)
$res1=$i
IF($res1=10) // учитываем что 10-я картинка это 0
$res1=0
END_IF
END_IF
END_IF
END_CYC
IF($xmin=5000)
LOGWRITE ("число не найдено")
GOTO(endfindnumber)
END_IF
$field_x1=$xmin+$sdvig
$perebor=1
WHILE($perebor>0)
$razr_temp=$razr_max
FOR ($i,$i<11)
IF_PICTURE_IN ($field_x1,$field_y1,$field_x1+INT($sdvig*1.3),$field_y2, STRCONCAT($pref,$i,".bmp"))
$field_x1=$_return1+$sdvig
IF($i<11)
INC($razr_max)
GOSUB(sdvig_razryada)
IF($res1=10) // учитываем что 10-я картинка это 0
$res1=0
END_IF
END_IF
IF($i=11) // проверка если нашли маркер конца ...11.bmp, то конец
$perebor=0
END_IF
$i=11 // выходим из цикла
END_IF
END_CYC
IF(($razr_temp=$razr_max) | ($razr_max=10)) // проверка если не нашли или уже 10 разрядов, то конец
$perebor=0
END_IF
END_CYC
// подсчитываем
$res=$res1+$res2*10+$res3*100+$res4*1000+$res5*10000+$res6*100000+$res7*1000000+$res8*10000000+$res9*100000000+$res10*1000000000
endfindnumber:
LOGWRITE ("Найдено число: ",$res)
HINTPOPUP("Найдено число: ",$res)
HALT
//==============================================================================
SUB(sdvig_razryada)
$res10=$res9
$res9=$res8
$res8=$res7
$res7=$res6
$res6=$res5
$res5=$res4
$res4=$res3
$res3=$res2
$res2=$res1
$res1=$i
END_SUB
//==============================================================================
Во вложении Сам скрипт "
Распознавание чисел 1.1.cms"+ скрипт для демонстрации и проверки "Распознавание чисел 1.1 пример Clickermann.cms" полностью настроенный с картинками.
Запускаем "Распознавание чисел 1.1 пример Clickermann.cms"
Открываем редактор кликера на полный экран. Распознаётся число в поле редактора "Цвет:".
Можно наводить мышь на любой цвет и горячими клавишами запускать скрипт. Результат в трее и в логе.
P. S. Жаль на форуме затишье. Становится скучно.[/spoiler]
Обновил под Clickermann 4.11Версия 1.3
Точнее полностью переписал. Раньше так не хватало массивов и scanpicture.
Заодно избавился от ограничений в 10 разрядов и обязательного отсутствия разделения разрядов
Теперь хоть 100000999, хоть 100 000 999
Файл скрипта во вложении "
Распознавание чисел 1.3.cms"
Оформлено в подпрограмму.
Код
[spoiler]
#name "Распознавание чисел"
// Author: Vint
// Version: 1.3 (01.04.2015)
// Скрипт для Clickermann v4.11 002
// подключение number_read
// #include "Распознавание чисел 1.3.cms"
//==============================================================================
SUB(LOG_ARR)
//LOGWRITE ("Размер массива: ",ARRSIZE($num))
LOGWRITE (" ")
LOGWRITE (" 0 1 2 3 4 5 6 7 8 9")
LOGWRITE (" ")
$maxn = 0
FOR ($i=0, $i < 10)
IF($num[$i] > $maxn)
$maxn = $num[$i]
END_IF
END_CYC
FOR($row=0, $row < 2)
$text = ""
FOR ($i=0, $i < 10)
$l = $num[10*$row + $i]
FOR ($j=0, $j < (5 - STRLEN($l)))
$text = STRCONCAT($text, " ")
END_CYC
$text = STRCONCAT($text, $l)
END_CYC
LOGWRITE ($text)
END_CYC
LOGWRITE (" ")
FOR($row=2,$row < $maxn + 2)
$text = ""
FOR ($i=0, $i < 10)
IF($num[$i] > ($row - 2))
$l = $num[10*$row + $i]
ELSE
$l = "X"
END_IF
FOR ($j=0, $j < (5 - STRLEN($l)))
$text = STRCONCAT($text, " ")
END_CYC
$text = STRCONCAT($text, $l)
END_CYC
LOGWRITE ($text)
END_CYC
LOGWRITE (" ")
END_SUB
//==============================================================================
SUB(number_read, $f_x1,$f_y1,$f_x2,$f_y2, $pref)
// $f_x1, $f_y1 область ЛевоВерх
// $f_x2, $f_y2 область ПравоНиз
// $pref = "textures\digit_" префикс имён файлов с цифрами (для разных шрифтов)
// Результат возвращается в $res если не найдено $res=-1
// Только целые числа.
// $pref зависит от шрифта поиска
$res = -1 // очищаем ответ
UNDEFINE($num) // главный массив данных
UNDEFINE($n_temp) // временный массив для SCANPICTURE
GETSCREEN
FOR ($i=0, $i < 10)
SCANPICTURE($n_temp, $f_x1,$f_y1,$f_x2,$f_y2, STRCONCAT($pref,$i,".bmp"))
$a_size = ARRSIZE($n_temp)
$num[$i] = $a_size / 2 // заносим количество элементов в этом разряде
$num[$i+10] = 0 // счётчик разрядов, пока 0
IF($a_size > 0)
FOR($j=0, $j < $a_size, 2)
$num[10*($j/2 + 2)+ $i] = $n_temp[$j] // заносим коорд X в массив
END_CYC
UNDEFINE($n_temp)
END_IF
END_CYC
IF(ARRSIZE($num) > 0)
IF($log = 1)
LOG_ARR()
END_IF
$repeat = 1
WHILE($repeat = 1)
$empty = 0
$xmin = 5000
$pos_min = 0
FOR ($i=0, $i < 10)
IF($num[$i] > ($num[10 + $i]))
$empty = 1
$l = $num[10 * ($num[10+$i]+2) + $i]
IF($l < $xmin)
$xmin = $l
$pos_min = $i
END_IF
END_IF
END_CYC
IF($empty = 0)
$repeat = 0
ELSE
IF($res = -1)
$res = STRCONCAT("", $pos_min) // если первыё символ
ELSE
$res = STRCONCAT($res, $pos_min) // последующие символы
END_IF
$num[10 + $pos_min] = ($num[10 + $pos_min]) + 1 // INC счётчик для разряда
END_IF
END_CYC
$res = INT($res)
ELSE
LOGWRITE ("число не найдено")
END_IF
END_SUB
//LOGCLEAR
//$log = 1
//number_read(271,385,335,401, "textures\digit_")
//LOGWRITE ("Найдено число: ",$res)
//HINTPOPUP("Найдено число: ",$res)
//HALT
[/spoiler]
Тест в редакторе кликера и пример использования файл: "
Тестирование распознавалки 1.3 XP.cms"
Видео теста:
http://youtu.be/d55wq7cbVe8.
Add версия 1.4Поддерживает числа с запятой.
Запятую/точку заготавливаем как digit_10.bmp (или свой префикс)
Возвращает результат как строку! Для перевода в число нужно учесть диапазон.
[spoiler]Для перевода в число нужно пробовать... там все сложно с диапазонами
Если число 0 целых...
0.0001234545
то перевести можно до 13 знака
$res = ROUND($res, -13)
если до
21.46999999
то до 8-го знака после запятой
$res = ROUND($res, -8)
для бОльших нужно пробовать
для целых всё сохраняется от старой версии, применяем только сами
$res =INT($res)
[/spoiler]
Код:
[spoiler]
#name "Распознавание чисел"
// Author: Vint
// Version: 1.4 (14.04.2015)
// Скрипт для Clickermann v4.11 002
// подключение number_read
// #include "Распознавание чисел 1.4.cms"
//==============================================================================
SUB(LOG_ARR)
//LOGWRITE ("Размер массива: ",ARRSIZE($num))
LOGWRITE (" ")
LOGWRITE (" 0 1 2 3 4 5 6 7 8 9 .")
LOGWRITE (" ")
$maxn = 0
FOR ($i=0, $i < 11)
IF($num[$i] > $maxn)
$maxn = $num[$i]
END_IF
END_CYC
FOR($row=0, $row < 2)
$text = ""
FOR ($i=0, $i < 10)
$l = $num[11*$row + $i]
FOR ($j=0, $j < (5 - STRLEN($l)))
$text = STRCONCAT($text, " ")
END_CYC
$text = STRCONCAT($text, $l)
END_CYC
LOGWRITE ($text)
END_CYC
LOGWRITE (" ")
FOR($row=2,$row < $maxn + 2)
$text = ""
FOR ($i=0, $i < 11)
IF($num[$i] > ($row - 2))
$l = $num[11*$row + $i]
ELSE
$l = "X"
END_IF
FOR ($j=0, $j < (5 - STRLEN($l)))
$text = STRCONCAT($text, " ")
END_CYC
$text = STRCONCAT($text, $l)
END_CYC
LOGWRITE ($text)
END_CYC
LOGWRITE (" ")
END_SUB
//==============================================================================
SUB(number_read, $f_x1,$f_y1,$f_x2,$f_y2, $pref)
// $f_x1, $f_y1 область ЛевоВерх
// $f_x2, $f_y2 область ПравоНиз
// $pref = "textures\digit_" префикс имён файлов с цифрами (для разных шрифтов)
// Результат возвращается в $res если не найдено $res=-1
// Только целые числа.
// $pref зависит от шрифта поиска
$res = -1 // очищаем ответ
UNDEFINE($num) // главный массив данных
UNDEFINE($n_temp) // временный массив для SCANPICTURE
GETSCREEN
FOR ($i=0, $i < 11)
SCANPICTURE($n_temp, $f_x1,$f_y1,$f_x2,$f_y2, STRCONCAT($pref,$i,".bmp"))
$a_size = ARRSIZE($n_temp)
$num[$i] = $a_size / 2 // заносим количество элементов в этом разряде
$num[$i+11] = 0 // счётчик разрядов, пока 0
IF($a_size > 0)
FOR($j=0, $j < $a_size, 2)
$num[11*($j/2 + 2)+ $i] = $n_temp[$j] // заносим коорд X в массив
END_CYC
UNDEFINE($n_temp)
END_IF
END_CYC
IF(ARRSIZE($num) > 0)
IF($log = 1)
LOG_ARR()
END_IF
$repeat = 1
WHILE($repeat = 1)
$empty = 0
$xmin = 5000
$pos_min = 0
FOR ($i=0, $i < 11)
IF($num[$i] > ($num[11 + $i]))
$empty = 1
$l = $num[11 * ($num[11+$i]+2) + $i]
IF($l < $xmin)
$xmin = $l
$pos_min = $i
END_IF
END_IF
END_CYC
IF($empty = 0)
$repeat = 0
ELSE
IF($res = -1)
$res = STRCONCAT("", $pos_min) // если первыё символ
ELSE
IF($pos_min < 10)
$res = STRCONCAT($res, $pos_min) // последующие символы цифры
ELSE
$res = STRCONCAT($res, ".") // последующие символы зпт
END_IF
END_IF
$num[11 + $pos_min] = ($num[11 + $pos_min]) + 1 // INC счётчик для разряда
END_IF
END_CYC
//$res = ROUND($res, -8)
ELSE
LOGWRITE ("число не найдено")
END_IF
END_SUB
//LOGCLEAR
//$log = 1
//number_read(271,385,335,401, "textures\digit_")
//LOGWRITE ("Найдено число: ",$res)
//HINTPOPUP("Найдено число: ",$res)
//HALT
[/spoiler]
Add версия 1.5Версия 1.4 с поддержкой поиска с COLORMODE. Для каждой цифры можно задать индивидуальный %