16
Ошибки / Сломались спойлеры
« on: April 23, 2018, 06:05:40 PM »
На сайте. Кнопка пропала. Видать вместе с капчей.
Добавлена тема оформления "Clickermann" для кода с подсветкой синтаксиса. Выбирается из выпадающего списка "Код" (рядом с "цвет", "размер" и "шрифт") в режиме редактирования поста. Либо просто BB-тегом "code=clickermann"
This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.
IF((11.2 - 11) = 0.2)
LOGWRITE("равно")
ELSE
LOGWRITE("НЕ равно")
END_IF
HALT
15:07:33 НЕ равно
4561 2612 1234 5467 - проверить, нет ли в номере ошибок
4561 2612 1234 546 - найти контрольную цифру, в данном случае «7»
LOGWRITE(10 - 2*2 - 3)
LOGWRITE(10 - (2*2) - 3)
LOGWRITE(10 - (2*2 + 3))
16:15:23 9
16:15:23 3
16:15:23 3
LOGWRITE(100 - 20*1 - 30*1 - 50)
илиLOGWRITE(100 - 20 - 30*1 - 50)
вместо нуля получаем 60 и 100$Slovo = TFREAD("текст.txt", 3)
print ($Slovo)
$L = strlen($Slovo)
print($L)
HALT
$Slovo = "5-/-Акрилонитрилбутадиенстирол (ABS)"
print($Slovo)
$L = strlen($Slovo)
print($L)
HALT
если в (ABS) убрать хоть одну скобку или букву, то всё нормально.
#name "Алгоритм A*"
// Author: Vint
// Version: 0.0.4 (08.05.2015)
// Скрипт для Clickermann v4.11 003
#logfile
//===== ОПЦИИ ==========================//
//////////////////////////////////////////
// вывод лога
$log0 = 1
// вывод отладочного лога
$log = 0
// вывод отладочного лога 2 уровня
$log2 = 0
// имя файла карты
$map_name = "map.txt"
// Обходить углы 0 - нет, 1 - да
$bypass_angle = 1
// Старт (маркер)
$start = 4
// Финиш (маркер)
$ending = 5
//////////////////////////////////////////
//==============================================================================
//=== Расчёт H для клетки ====================================================
SUB(calc_H, $th_X, $th_Y)
$H = (ABS($endY - $th_Y) + ABS($endX - $th_X)) * 10
END_SUB
//==============================================================================
//=== Добавляем в открытый список ============================================
SUB(add_open, $tt_X, $tt_Y, $tt_P, $tt_G)
IF(($tt_X = $endX) & ($tt_Y = $endY))
$check_end = 1
END_IF
calc_H($tt_X, $tt_Y)
ARRPUSH($open, $tt_X)
ARRPUSH($open, $tt_Y)
ARRPUSH($open, $tt_P)
ARRPUSH($open, $tt_G + $H)
IF($log = 1)
LOGWRITE ("Add open: ", $tt_X, ":", $tt_Y, ":", $tt_P, ":", $tt_G + $H, " G:", $tt_G, " $H:", $H)
END_IF
END_SUB
//==============================================================================
//=== Добавляем в закрытый список ============================================
SUB(add_close, $tt_X, $tt_Y, $tt_P)
ARRPUSH($close, STRCONCAT($tt_X, ":", $tt_Y, "P", $tt_P))
IF($log = 1)
LOGWRITE ("Add close: ", $tt_X, ":", $tt_Y, "P", $tt_P)
END_IF
END_SUB
//==============================================================================
//=== Удаляем из открытого списока ===========================================
SUB(del_open, $best)
IF($log=1)
LOGWRITE ("del open ", $best, " ", $open[$best-3], ":", $open[$best-2], ":", $open[$best-1], ":", $open[$best])
END_IF
$size_open = ARRSIZE($open)
IF($size_open > 4)
FOR($i=$best-3, $i < ($size_open - 4))
$open[$i] = $open[$i+4]
END_CYC
END_IF
$nul = ARRPOP($open)
$nul = ARRPOP($open)
$nul = ARRPOP($open)
$nul = ARRPOP($open)
END_SUB
//==============================================================================
//=== Проверка на вхождение в $close =========================================
SUB(check_closed, $tc_X, $tc_Y)
$closed_on = 0
$sample = STRCONCAT($tc_X, ":", $tc_Y)
$size_close = ARRSIZE($close)
FOR($i=0, $i < $size_close)
$cut_close = STRCUT2($close[$i], 1, STRPOS($close[$i], "P") - 1)
//LOGWRITE ("close[$i] ", $close[$i], " cut_close ", $cut_close, " sample ", $sample)
IF($cut_close = $sample)
$closed_on = 1
$P_res = STRCUT2($close[$i], STRPOS($close[$i], "P") + 1, 30)
$i = $size_close + 1
IF($log = 1)
LOGWRITE ($tc_X, "/", $tc_Y, " входит в $close")
END_IF
END_IF
END_CYC
END_SUB
//==============================================================================
//=== Проверка на вхождение в $open ==========================================
SUB(check_open, $to_X, $to_Y)
IF($log = 1)
LOGWRITE ("проверяем ", $to_X, "/", $to_Y)
END_IF
IF(($to_X > -1) & ($to_Y > -1) & ($to_X < ($width)) & ($to_Y < ($height)))
$no_filed = 0
check_closed($to_X, $to_Y)
IF($closed_on = 0)
$opened_on = 0
$size_open = ARRSIZE($open)
FOR($i=0, $i < $size_open, 4)
IF(($open[$i] = $to_X) & ($open[$i+1] = $to_Y))
$opened_on = 1
$ind_open = $i
calc_H($to_X, $to_Y)
$H_old = $H
$G_old = $open[$i+3] - $H_old
$P_res = $open[$i+2]
$i = $size_open + 1
IF($log = 1)
LOGWRITE ($to_X, "/", $to_Y, " входит в $open")
END_IF
END_IF
END_CYC
END_IF
ELSE
$no_filed = 1
IF($log = 1)
LOGWRITE ($to_X, "/", $to_Y, " за пределами поля")
END_IF
END_IF
END_SUB
//==============================================================================
//=== Чтение состояния клетки ================================================
SUB(read, $tt_X, $tt_Y)
//check_closed($tt_X, $tt_Y)
IF(($closed_on = 1) | ($tt_X < 0) | ($tt_Y < 0) | ($tt_X = $width) | ($tt_Y = $height))
$state = 1
ELSE
$state = INT(STRCUT($map[$tt_Y], $tt_X + 1, 1))
//IF($state = $ending)
// $check_end = 1
//END_IF
END_IF
IF($log2 = 1)
LOGWRITE ("$state=", $state, " ",$tt_X, "/", $tt_Y)
END_IF
END_SUB
//==============================================================================
//=== Если уже входит в $open ================================================
SUB(already_open, $ta_P, $ta_G)
IF($ta_G < $G_old)
$open[$ind_open+2] = $ta_P
$ta_X = $open[$ind_open]
$ta_Y = $open[$ind_open+1]
calc_H($ta_X, $ta_Y)
$open[$ind_open+3] = $ta_G + $H
IF($log = 1)
LOGWRITE ("Update open: ", $ta_X, ":", $ta_Y, ":", $ta_P, ":", $ta_G + $H)
END_IF
ELSE
IF($log = 1)
LOGWRITE ("не обновляем в $open")
END_IF
END_IF
END_SUB
//==============================================================================
//=== Вывод в лог $open ======================================================
SUB(log_open)
IF($log = 1)
$size_open = ARRSIZE($open)
LOGWRITE ("$open:")
FOR($i=0, $i < $size_open, 4)
LOGWRITE ($open[$i], ":", $open[$i+1], ":", $open[$i+2], ":", $open[$i+3])
END_CYC
END_IF
END_SUB
//==============================================================================
//=== Вывод результата =======================================================
SUB(result)
$r_X = $endX
$r_Y = $endY
$temp = $log
$log = 0
LOGWRITE ("result:")
check_open($r_X, $r_Y) // $closed_on = 1 $opened_on = 1
WHILE($P_res > 0)
SWITCH($P_res)
CASE(1)
$direction = "вверх"
INC($r_Y)
CASE(2)
$direction = "вверх-вправо"
INC($r_Y)
INC($r_X, -1)
CASE(3)
$direction = "вправо"
INC($r_X, -1)
CASE(4)
$direction = "вних-вправо"
INC($r_Y, -1)
INC($r_X, -1)
CASE(5)
$direction = "вниз"
INC($r_Y, -1)
CASE(6)
$direction = "вниз-влево"
INC($r_Y, -1)
INC($r_X)
CASE(7)
$direction = "влево"
INC($r_X)
CASE(8)
$direction = "вверх-влево"
INC($r_Y)
INC($r_X)
END_SWITCH
ARRPUSH($preresult, $r_X)
ARRPUSH($preresult, $r_Y)
ARRPUSH($preresult, $P_res)
ARRPUSH($preresult, $direction)
ARRPUSH($preresult, STRCONCAT($r_X, "/", $r_Y, " ", $P_res, " - ",$direction))
check_open($r_X, $r_Y)
END_CYC
$log = $temp
UNDEFINE($result)
// переворачиваем ответ, делаем от старт к финиш
WHILE(ARRSIZE($preresult) > 0)
$text = ARRPOP($preresult)
$direction = ARRPOP($preresult)
$P_res = ARRPOP($preresult)
$r_Y = ARRPOP($preresult)
$r_X = ARRPOP($preresult)
ARRPUSH($result, $r_X)
ARRPUSH($result, $r_Y)
ARRPUSH($result, $P_res)
ARRPUSH($result, $direction)
ARRPUSH($result, $text)
END_CYC
// вывод ответа в лог
IF(ARRSIZE($result) > 0)
$asize = ARRSIZE($result)
FOR($i=4, $i < $asize, 5)
LOGWRITE ($result[$i])
END_CYC
END_IF
END_SUB
//==============================================================================
//=== Добавление соседей в открытый ==========================================
SUB(vicinage, $t_X, $t_Y, $t_Fprev)
calc_H($t_X, $t_Y)
$H_cur = $H
$G_cur = $t_Fprev - $H_cur
// вверх, 1
check_open($t_X, $t_Y-1)
IF($no_filed = 0)
IF(($opened_on = 0) & ($closed_on = 0))
read($t_X, $t_Y-1)
IF($state ! 1)
add_open($t_X, $t_Y-1, 1, $G_cur + 10)
END_IF
ELSE
IF($closed_on ! 1)
already_open(1, $G_cur + 10)
END_IF
END_IF
END_IF
// вверх-вправо, 2
IF($check_end = 0)
check_open($t_X+1, $t_Y-1)
IF($no_filed = 0)
IF(($opened_on = 0) & ($closed_on = 0))
read($t_X+1, $t_Y-1)
IF($state ! 1)
read($t_X, $t_Y-1)
$state1 = $state
read($t_X+1, $t_Y)
IF(($state = 1) & ($state1 = 1))
ELSE
IF(($bypass_angle = 1) & (($state = 1) | ($state1 = 1)))
ELSE
add_open($t_X+1, $t_Y-1, 2, $G_cur + 14)
END_IF
END_IF
END_IF
ELSE
IF($closed_on ! 1)
already_open(2, $G_cur + 14)
END_IF
END_IF
END_IF
END_IF
// вправо, 3
IF($check_end = 0)
check_open($t_X+1, $t_Y)
IF($no_filed = 0)
IF(($opened_on = 0) & ($closed_on = 0))
read($t_X+1, $t_Y)
IF($state ! 1)
add_open($t_X+1, $t_Y, 3, $G_cur + 10)
END_IF
ELSE
IF($closed_on ! 1)
already_open(3, $G_cur + 10)
END_IF
END_IF
END_IF
END_IF
// вниз-вправо, 4
IF($check_end = 0)
check_open($t_X+1, $t_Y+1)
IF($no_filed = 0)
IF(($opened_on = 0) & ($closed_on = 0))
read($t_X+1, $t_Y+1)
IF($state ! 1)
read($t_X+1, $t_Y)
$state1 = $state
read($t_X, $t_Y+1)
IF(($state = 1) & ($state1 = 1))
ELSE
IF(($bypass_angle = 1) & (($state = 1) | ($state1 = 1)))
ELSE
add_open($t_X+1, $t_Y+1, 4, $G_cur + 14)
END_IF
END_IF
END_IF
ELSE
IF($closed_on ! 1)
already_open(4, $G_cur + 14)
END_IF
END_IF
END_IF
END_IF
// вниз, 5
IF($check_end = 0)
check_open($t_X, $t_Y+1)
IF($no_filed = 0)
IF(($opened_on = 0) & ($closed_on = 0))
read($t_X, $t_Y+1)
IF($state ! 1)
add_open($t_X, $t_Y+1, 5, $G_cur + 10)
END_IF
ELSE
IF($closed_on ! 1)
already_open(5, $G_cur + 10)
END_IF
END_IF
END_IF
END_IF
// вниз-влево, 6
IF($check_end = 0)
check_open($t_X-1, $t_Y+1)
IF($no_filed = 0)
IF(($opened_on = 0) & ($closed_on = 0))
read($t_X-1, $t_Y+1)
IF($state ! 1)
read($t_X, $t_Y+1)
$state1 = $state
read($t_X-1, $t_Y)
IF(($state = 1) & ($state1 = 1))
ELSE
IF(($bypass_angle = 1) & (($state = 1) | ($state1 = 1)))
ELSE
add_open($t_X-1, $t_Y+1, 6, $G_cur + 14)
END_IF
END_IF
END_IF
ELSE
IF($closed_on ! 1)
already_open(6, $G_cur + 14)
END_IF
END_IF
END_IF
END_IF
// влево, 7
IF($check_end = 0)
check_open($t_X-1, $t_Y)
IF($no_filed = 0)
IF(($opened_on = 0) & ($closed_on = 0))
read($t_X-1, $t_Y)
IF($state ! 1)
add_open($t_X-1, $t_Y, 7, $G_cur + 10)
END_IF
ELSE
IF($closed_on ! 1)
already_open(7, $G_cur + 10)
END_IF
END_IF
END_IF
END_IF
// вверх-влево, 8
IF($check_end = 0)
check_open($t_X-1, $t_Y-1)
IF($no_filed = 0)
IF(($opened_on = 0) & ($closed_on = 0))
read($t_X-1, $t_Y-1)
IF($state ! 1)
read($t_X-1, $t_Y)
$state1 = $state
read($t_X, $t_Y-1)
IF(($state = 1) & ($state1 = 1))
ELSE
IF(($bypass_angle = 1) & (($state = 1) | ($state1 = 1)))
ELSE
add_open($t_X-1, $t_Y-1, 8, $G_cur + 14)
END_IF
END_IF
END_IF
ELSE
IF($closed_on ! 1)
already_open(8, $G_cur + 14)
END_IF
END_IF
END_IF
END_IF
END_SUB
//==============================================================================
//=== Поиск индекса в open с наилучшим F =====================================
SUB(find_best)
$min = 100000
$size_open = ARRSIZE($open)
FOR($i=$size_open-1, $i > 0, -4)
IF($open[$i] < $min)
$min = $open[$i]
$best = $i
END_IF
END_CYC
IF($log = 1)
LOGWRITE ("best: ", $open[$best-3], "/", $open[$best-2], " значение: ", $min, " поз. ", $best)
END_IF
END_SUB
//==============================================================================
//=== Чтение карты ===========================================================
SUB(read_map)
IF($log0 = 1)
LOGWRITE("--- читаем карту ---")
END_IF
TFREADARR ($map_name, $map)
$size_arrmap = ARRSIZE($map)
FOR($i=0, $i < ($size_arrmap - 1))
$map[$i] = $map[$i+1]
END_CYC
$nul = ARRPOP($map)
// $i = 1
// $count_line = TFCOUNT($map_name)
// WHILE($i < ($count_line + 1))
// ARRPUSH($map, TFREAD($map_name, $i))
// INC($i)
// END_CYC
// находим стартовую и конечную позиции
$exit = 0
$size_arrmap = ARRSIZE($map)
IF($log0 = 1)
//LOGWRITE ("$size_arrmap: ", $size_arrmap)
FOR($i=0, $i < $size_arrmap)
LOGWRITE($map[$i])
END_CYC
END_IF
FOR($i=0, $i < $size_arrmap)
$str = $map[$i]
$pos_start = STRPOS($str, $start)
IF($pos_start > 0)
$start_X = $pos_start - 1
$start_Y = $i
IF($endX > -1)
$exit = 1
END_IF
END_IF
$pos_end = STRPOS($str, $ending)
IF($pos_end > 0)
$endX = $pos_end - 1
$endY = $i
IF($start_X > -1)
$exit = 1
END_IF
END_IF
IF($exit = 1)
$i = $size_arrmap + 1
END_IF
END_CYC
// ширина карты
$width = STRLEN($map[0])
// высота карты
$height = ARRSIZE($map)
IF($log0 = 1)
LOGWRITE ("start: ", $start_X, "/", $start_Y)
LOGWRITE ("end: ", $endX, "/", $endY)
LOGWRITE ("width/height ", $width, "/", $height)
LOGWRITE (" ")
END_IF
END_SUB
//==============================================================================
//=== Включение окна лога ====================================================
SUB(initial)
LOGCLEAR
WAITMS(500)
MOVE($_xmax,0)
WAITMS(50)
IF($log=1)
LOGSHOW (1,$_xmax-335,28) // отображение окна лога
WNDSIZE(WNDFIND("Clickermann - Лог"),336,560) // изменения размеров окна лога 260
END_IF
END_SUB
//==============================================================================
initial()
// карта
$map = 0
// флаг завершения
$check_end = 0
// индекс в open клетки с лучшим F
$best = -1
// Старт
$start_X = -1
$start_Y = -1
// Финиш
$endX = -1
$endY = -1
// открытый список
//$open = 0
// закрытый список
//$close = 0
read_map()
// Добавляем стартовую в открытый список
add_open($start_X, $start_Y, 0, 0)
WHILE((ARRSIZE($open) > 3) & ($check_end = 0))
log_open()
find_best()
// Текущая обрабатываемая
$cur_F = $open[$best] // стоимость F текущей
$cur_parent = $open[$best-1] // направление на родителя
$cur_Y = $open[$best-2] // позиция Y
$cur_X = $open[$best-3] // позиция X
del_open($best)
add_close($cur_X, $cur_Y, $cur_parent)
vicinage($cur_X, $cur_Y, $cur_F)
IF($log=1)
LOGWRITE (" ")
END_IF
END_CYC
IF($check_end = 0)
LOGWRITE ("Решения нет")
HALT
END_IF
result()
LOGWRITE ("=============== финита ля комедия ===============")
LOGWRITE (" ")
HALT
[/spoiler]GETSCREEN
COLORMODE(7)
SCREENSHOT
GETSCREEN(-100,0, 100,250)
COLORMODE(7)
SCREENSHOT
GETSCREEN(-100,0, 100,250)
COLORMODE(7, -100,0, 100,250)
SCREENSHOT
HALT
GETSCREEN
COLORMODE(7)
IF_PICTURE_IN (0,0,$_xmax,$_ymax, "hero.bmp", 65280, 90)
$vX1 = $_return1 - 350
$vY1 = $_return2 - 200 + 64
$vX2 = $_return1 + 350
$vY2 = $_return2 + 200 + 64
IF($vX1 < 0)
$vX1 = 0
END_IF
IF($vY1 < 0)
$vX1 = 0
END_IF
IF($vX2 > $_xmax)
$vX2 = $_xmax
END_IF
IF($vY2 > $_ymax)
$vX2 = $_ymax
END_IF
END_IF
// ну и дальше шла куча поисков типа
GETSCREEN($vX1,$vY1,$vX2,$vY2)
COLORMODE(6,$vX1,$vY1,$vX2,$vY2)
SCANPICTURE($arr, $vX1,$vY1,$vX2,$vY2, STRCONCAT($mob, $n, "_", $i, ".bmp"), -1, 90)
...
...