Автокликер Clickermann :: Форум
Основной раздел => Общие вопросы => Topic started by: quant13 on November 08, 2016, 07:09:19 PM
-
(Можно на кликере, думаю смогу перевести, математические операции ведь везде одинаковы).
Дано:
Переменная PSD (в начале может иметь любое значение)
Переменная BU (в начале цикла может принимать значения 0, 1 или 2)
Переменная BL (в начале цикла может принимать значения 0, 1 или 2)
Инструменты:
стандартные операторы сравнения
IncVal(PSD, X) - увеличивает PSD на Х (если Х отрицательное, то уменьшает естественно).
Можно добавлять другие переменные, и производить с ними любые математические операции, PSD менять можно только через IncVal(PSD, X)
Задача:
Если BU равно 2, ModVal(PSD, BUX), где BUX=15
Если BU равно 1, ModVal(PSD, BUX), где BUX=10
Если BU равно 0, ModVal(PSD, BUX) где BUX -10 или -15 ... вобщем отменить прибавку к PSD
Если BL равно 2, ModVal(PSD, BLX), где BLX=25
Если BL равно 1, ModVal(PSD, BLX), где BLX=20
Если BL равно 0, ModVal(PSD, BLX) где BLX -20 или -25 ... вобщем отменить прибавку к PSD
Например:
цикл 1
оригинальное PSD = 50
BU = 2
BL = 2
( PSD должно быть 90 -(50+15+25))
цикл 2
оригинальное PSD = 10 (с нашей прибавкой от пред цикла PSD = 50)
BU = 0
BL = 1
( PSD должно быть 20 -(10+10, прибавку от BU отменяем))
цикл 3
оригинальное PSD = 20 (с нашей прибавкой от пред цикла PSD =30)
BU = 0
BL = 0
( PSD должно быть 20 - отменяем все свои прибавки)
Сложность у меня в том, что PSD не должно меняться моей процедурой если BU/BL не менялись от предыдущего цикла, при этом PSD не статично, его может изменить другая процедура в начале цикла, и нужно работать с новым уже (устанавливать/отменять свои прибавки). По сути мы не знаем значения PSD в начале цикла, надо добавить/отнять прибавку для PSD в зависимости изменилась ли переменная BU или BL
-
Я вот по весне, в теме ОБЩИЕ ВОПРОСЫ
коноплю картошку посажу!
А что, прикручу счётчик семян картошин на кликере и прокатит! ВСЁ ПОЛЯНА ЗАНЯТА!
-
В задании ничего не напутал?
цикл 1 - здесь понятно.
цикл 2
BU = 0
BL = 1
( PSD должно быть 20 -(10+10, прибавку от BU отменяем))
Почему -10? (почему не -15?)
Почему +10? (здесь совсем непонятно... почему не +20)
В условиях вверху так не задано.
-
Может и напутал чуть, писал поздно вечером, но уже неважно, можно закрыть тему, я нашел решение (которого не хотел сначала), оказалось без глобальной(внешней) переменной не обойтись, т.к BU/BL/PSD переменные получаются "извне" скрипта, то чтобы небыло накладок (чтоб скрипт не отнимал чего не положено и не добавлял лишнего), нужна переменная вне скрипта, хранить условия окончания предыдущего цикла работы
-
Чет я поторопился, не сработала моя идея
$GPSD = INIREAD("zzz.ini", "GPSD")
$GBU=RNDFROM(0,1,2)
$GBL=RNDFROM(0,1,2)
//Переменные, начинающиеся на $G внешние(глобальные), их изменения сохраняются постоянно, и их могут менять другие скрипты не зависимо работает этот скрипт или нет. В рамках языка кликера можно сказать что они находятся во внешнего файле. C GBU / GBL я не стал заморачиваться чтоб не писать руками в файл каждый раз новые данные, будем считать, что они получены из файла..
//zzz.ini
//[default]
//GPSD=50
//Проверки $GBU/$GBL на содержимое выполняются разными операторами, потому в кликере это можно описать только как двойная проверка.
IF($GBU ! 0) //Если не 0, то что-то другое
IF($GBU ! 1) //Если не 1, то 2 видимо
$BUX=10 //если 2
END_IF
$BUX=(0-$BUX) //если 1
ELSE
$BUX=20 //если 0
END_IF
IF($GBL ! 0) //Если не 0, то что-то другое
IF($GBL ! 1) //Если не 1, то 2 видимо
$BLX=1 //если 2
END_IF
$BLX=(0-$BLX) //если 1
ELSE
$BLX=2 //если 0
END_IF
//$BLX/$BUX бонусы я поставил такие только для наглядности в логе чтоб удобней проверять. Числа не важны в примере, суть чтоб отличались при значениях 0 и 2, а при значении 1 бонус убирался
//ModVal PSD
$PSD=$PSD+$BUX
$PSD=$PSD+$BLX
$GPSD = $PSD
INIWRITE("zzz.ini", "GPSD", $PSD)
LogWrite ("$GBU= ",$GBU, " $GBL= ",$GBL)
LogWrite ("$GPSD= ",$GPSD, " $BLX= ",$BLX," $BUX= ",$BUX)
Wait(3)
//HALT
GPSD не должна наращиваться после каждого цикла, только изменятся на количество бонуса в зависимости от GBU / GBL
если GBU / GBL равно 0 или 2 добавляется бонус, если 1 - то отнимается ранее добавленный
Например если у нас постоянно GBU = 2, то в каждом цикле GPSD будет 60 (при начальном GPSD=50)
если GBU становится = 0, GPSD должно стать 70
если GBU становится = 2, GPSD должно стать 60
если GBU становится = 1, GPSD должно стать 50 (точнее минус 10, на случай если GPSD была изменена другим скриптом, т.к предыдущей прибавкой был 10)
В работе можно добавлять локальные и глобальные ($G - в рамках кликера должны записываться в файл) переменные
GBU / GBL можно один раз принудительно сбросить в 0, для инициализации например.
-
Утром делал так. По первоначальному условию из первого поста при 0 - отмена.
SUB(iter) //====================================================================
IF($BU ! $BU_old)
SWITCH($BU)
CASE(0)
$BUX = -(5 + $BU_old*5)
CASE(1)
$BUX = 10
CASE(2)
$BUX = 15
END_SWITCH
INC($PSD, $BUX)
$BU_old = $BU
LOGWRITE("$PSD = ", $PSD, " $BUX = ", $BUX)
END_IF
IF($BL ! $BL_old)
SWITCH($BL)
CASE(0)
$BLX = -(15 + $BL_old*5)
CASE(1)
$BLX = 20
CASE(2)
$BLX = 25
END_SWITCH
INC($PSD, $BLX)
$BL_old = $BL
LOGWRITE("$PSD = ", $PSD, " $BLX = ", $BLX)
END_IF
LOGWRITE("-----$PSD = ", $PSD)
END_SUB
//==============================================================================
$BU_old = -1
$BL_old = -1
$PSD = 50 // оригинальное
$BU = 2
$BL = 2
iter()
$PSD = 10
$BU = 0
$BL = 1
iter()
$PSD = 20
$BU = 0
$BL = 0
iter()
HALT
Но до конца не понятно было. Наверно неправильно.
Думаю почти то же самое, только сначала отнимать старое значение восстанавливая "безбонусность" и зачислять заново. Не?
SUB(iter) //====================================================================
IF($BU ! $BU_old)
SWITCH($BU)
CASE(0)
$BUX = 0
CASE(1)
$BUX = 10
CASE(2)
$BUX = 15
END_SWITCH
IF($BU_old = -1)
$BUR = 0
ELSE
$BUR = -(5 + $BU_old*5)
END_IF
$PSD = $PSD + $BUR + $BUX
$BU_old = $BU
LOGWRITE("$PSD = ", $PSD, " $BUX = ", $BUX)
END_IF
IF($BL ! $BL_old)
SWITCH($BL)
CASE(0)
$BLX = 0
CASE(1)
$BLX = 20
CASE(2)
$BLX = 25
END_SWITCH
IF($BL_old = -1)
$BLR = 0
ELSE
$BLR = -(15 + $BL_old*5)
END_IF
$PSD = $PSD + $BLR + $BLX
$BL_old = $BL
LOGWRITE("$PSD = ", $PSD, " $BLX = ", $BLX)
END_IF
LOGWRITE("-----$PSD = ", $PSD)
END_SUB
//==============================================================================
$BU_old = -1
$BL_old = -1
$PSD = 50 // оригинальное
$BU = 2
$BL = 0
iter()
$BU = 2
$BL = 0
iter()
$BU = 2
$BL = 0
iter()
HALT
Или совсем просто, хранить общую старую прибавку и учитывать её при прибавлении новой
SUB(iter) //====================================================================
SWITCH($BU)
CASE(0)
$BUX = 0
CASE(1)
$BUX = 10
CASE(2)
$BUX = 15
END_SWITCH
SWITCH($BL)
CASE(0)
$BLX = 0
CASE(1)
$BLX = 20
CASE(2)
$BLX = 25
END_SWITCH
$BX = $BUX + $BLX
$PSD = $PSD - $BX_old + $BX
$BX_old = $BX
LOGWRITE("$PSD = ", $PSD, " $BX = +", $BX)
END_SUB
//==============================================================================
$BX_old = 0
$PSD = 50 // оригинальное
$BU = 2
$BL = 2
iter()
$PSD = 50 // оригинальное 10
$BU = 0
$BL = 1
iter()
// или
//$PSD = 50 // оригинальное
//$BU = 2
//$BL = 0
//iter()
//$BU = 2
//$BL = 0
//iter()
//$BU = 2
//$BL = 0
//iter()
HALT
-
SUB, SWITCH и прочее использовать нельзя. в том языке нет такого.
из кликера можно только арифметику и IF
RNDFROM и INIREAD/INIWRITE я тут использую только для удобства работы с получением данных
из-а особенности получения содержимого GBU / GBL, просто описать все 9 вариантов бонуса еще и с проверками изменялся/не изменялся сложно, код станет нереально большим
-
Это всё тонкости. Ну замени подобный свитч
SWITCH($BU)
CASE(0)
$BUX = 0
CASE(1)
$BUX = 10
CASE(2)
$BUX = 15
END_SWITCH
таким ифом
$BUX = 0
IF($BU > 0)
$BUX = 5 + $BU*5
END_IF
А SUB так совсем легко избавится. Вставляй код напрямую.
В итоге
$PSD = 50 // оригинальное
$BU = 2
$BL = 2
// расчёт
$BUX = 0
IF($BU > 0)
$BUX = 5 + $BU*5
END_IF
$BLX = 0
IF($BL > 0)
$BLX = 15 + $BL*5
END_IF
$BX = $BUX + $BLX
$PSD = $PSD - $BX_old + $BX
$BX_old = $BX
LOGWRITE("$PSD = ", $PSD, " $BX = +", $BX)
$PSD = 50 // оригинальное 10
$BU = 0
$BL = 1
// расчёт
$BUX = 0
IF($BU > 0)
$BUX = 5 + $BU*5
END_IF
$BLX = 0
IF($BL > 0)
$BLX = 15 + $BL*5
END_IF
$BX = $BUX + $BLX
$PSD = $PSD - $BX_old + $BX
$BX_old = $BX
LOGWRITE("$PSD = ", $PSD, " $BX = +", $BX)
-
//
$GPSD = INIREAD("zzz.ini", "GPSD")
$GBU=RNDFROM(0,1,2)
$GBL=RNDFROM(0,1,2)
//$GBU = INIREAD("zzz1.ini", "GBU")
//$GBL = INIREAD("zzz1.ini", "GBL")
$GBUX_OLD = INIREAD("zzz.ini", "GBUX_OLD")
$GBLX_OLD = INIREAD("zzz.ini", "GBLX_OLD")
$PSD = $GPSD
//Переменные, начинающиеся на $G внешние(глобальные), их изменения сохраняются постоянно, и их могут менять другие скрипты не зависимо работает этот скрипт или нет. В рамках языка кликера можно сказать что они находятся во внешнего файле. C GBU / GBL я не стал заморачиваться чтоб не писать руками в файл каждый раз новые данные, будем считать, что они получены из файла..
//zzz.ini
//[default]
//GPSD=50
//GBUX_OLD=0
//GBLX_OLD=0
//Проверки $GBU/$GBL на содержимое выполняются разными операторами, потому в кликере это можно описать только как двойная проверка.
IF($GBU ! 0) //Если не 0, то что-то другое
IF($GBU ! 1) //Если не 1, то 2 видимо
$BUX=10 //если 2
END_IF
$BUX=0 //(0-$BUX) //если 1
ELSE
$BUX=20 //если 0
END_IF
IF($GBL ! 0) //Если не 0, то что-то другое
IF($GBL ! 1) //Если не 1, то 2 видимо
$BLX=1 //если 2
END_IF
$BLX=0 //(0-$BLX) //если 1
ELSE
$BLX=2 //если 0
END_IF
//$BLX/$BUX бонусы я поставил такие только для наглядности в логе чтоб удобней проверять. Числа не важны в примере, суть чтоб отличались при значениях 0 и 2, а при значении 1 бонус убирался
//ModVal PSD
$PSD=$PSD-$GBUX_OLD+$BUX
$PSD=$PSD-$GBLX_OLD+$BLX
$GPSD = $PSD
INIWRITE("zzz.ini", "GPSD", $PSD)
INIWRITE("zzz.ini", "GBUX_OLD", $BUX)
INIWRITE("zzz.ini", "GBLX_OLD", $BLX)
//LogWrite (" $GBU= ",$GBU, " $GBL= ",$GBL )
LogWrite ("$GPSD= ",$GPSD," $BLX= ",$BLX," $BUX= ",$BUX)
Wait(3)
//HALT
Разобрался, Так заработало
теперь даже если скрипт остановлен, при новом запуске все продолжается как должно - GPSD=50 без бонусов