Как сделать?
…
Тогда нафига тебе JUMP?
Я хотел попробовать. Меня документация qsp в интернете подучила, что так можно. Я его убрал, проблема с динамиком не исчезла.
Вполне себе:
И сформируй строку для Динамика отдельно!
Код вынести в отдельную текстовую переменную? Я так делал, когда самостоятельно искал решение проблемы . Проблема не решилась:(
Вот как сделал бы я:
if arrsize('npconloc') >0:
g=arrsize('npconloc')
loop i= 0 while i<g step i+=1:
npc=npconloc[i]
$DinStr="" &! Очищаем строку
$DinStr+="act 'Поговорить с <<$name[npc]>> <<$surname[npc]>>':
if race[npc]=0:
cla
'<center><img src =""new/orcface.jpg"" ></center>'
if agro[npc]=1:
'Дерёмся'
act 'Погнали': gt 'orcfight'
else
act 'уйти': gt '<<$loc>>'
end
else
cla
'<center> <img src =""new/202.jpg"" ></center>'
if agro[npc]=1:
'Дерёмся'
act 'Погнали': gt 'humanfight'
else
act 'уйти': gt '<<$loc>>'
end
end
end"
Dinamic('<<$DinStr>>')
end
end
Из твоего кода следует смотреть формирование массива agro[n]
А вот этот динамик вообще лишний:
$gend = {
npc=i
gs 'namegen'
gs 'surnamegen'
agro[npc] = rand(0,1)
race[npc] =rand(0,1)
n=rand(1,7)
locx[npc]=n
}
loop i=1 while i<=10 step i+=1:
dynamic $gend
end
Упрости. Внеси все в цикл и не делай себе голову беременной!
Да, и потом мне кажется, что тебе надо формировать массив с “0”-го индекса
loop i=0 while i<=9 step i+=1:
gs 'namegen'
gs 'surnamegen'
agro[i] = rand(0,1)
race[i] = rand(0,1)
locx[i] = rand(1,7)
end
Вполне себе:
Из твоего кода следует смотреть формирование массива agro[n]
.Я попробовал сделать со строкой. Проблема осталась :( Я также попробовал сделать без killvar ‘npconloc’. Нпс начинают таскаться из локации в локацию, их имена остаются привязанными к ним, а вот всё остальное меняется. Например в одной локации все орки и все готовы к драке, но при переходе на другую локацию они тут-же становятся такими как местные. Мой код каким-то образом раздаёт всем имена, но все остальные параметры генерируются 1 раз на всю локацию и раздаются всем как методичка. Я плохо организовал вот эту проверку индекса для race и agro. Она видимо проверяется у кого-то одного или что-такое.
Вполне себе:
Упрости. Внеси все в цикл и не делай себе голову беременной!
Да, и потом мне кажется, что тебе надо формировать массив с “0”-го индекса
Наверное, можно и без динамика, я не до конца понимаю, что я делаю. Я как обезъяна с гранатой.
Индекс 0 я думал зарезервировать под главного героя и вводить вручную. Мне казалось удобным хранить его параметры в тех же массивах. Это как-то ломает генерацию?
У тебя ломается не генерация, а логика. Ты генеришь с 1-ого индекса, а читаешь с 0-го. Не забивай себе сейчас этим голову. Делай все максимально просто. Чем гуще дебри, тем меньше видно леса! Я упростил твой код (до известной степени) и все (как мне кажется), встало на место.
!Формирование массива из 10 персон. Распределение по случайно локации (от 1 до 7)
loop i=0 while i<10 step i+=1:
gs 'namegen' & ! Генератор Имени
gs 'surnamegen' & ! Генератор Фамилии
agro[npc] = rand(0,1) & ! Готовность
race[npc] = rand(0,1) & ! Раса
locx[npc] = rand(1,7) & ! Случайная локация
end
Код локации для проверки присутствия Непися
g=arrsize ('locx')
loop i=0 while i<g
j = arrpos('locx',x,i) & ! Где "Х" - номер локации Непися
if j>=0 :
npconloc[]=j & ! Если Непись в локации, то в список заходит его номер (Номер Непися), т.е. запросто может быть и "0"
i=j+1 & ! Смещаем поиск на следующую позицию
else
i=g & ! Больше местов нет. Завершаем цикл.
end
end
g=arrsize('npconloc')
if g >0:
loop i= 0 while i<g step i+=1:
npc=npconloc[i]
act 'Поговорить с <<$name[npc]>> <<$surname[npc]>>':
if race[npc]=0:
CLA
'<center><img src =""new/orcface.jpg"" ></center>'
if agro[npc] =1:
'Дерёмся'
act 'Погнали': gt 'orcfight'
else
act 'Уйти': gt '<<$loc>>'
end
else
CLA
'<center> <img src =""new/202.jpg"" ></center>'
if agro[npc] =1:
'Дерёмся'
act 'Погнали': gt 'humanfight'
else
act 'Уйти': gt '<<$loc>>'
end
end
end
end
end
killvar 'npconloc'
И вот теперь самое важное и нужное: Это переходы на локацию <<$loc>> и на файтинг. Нет возврата в меню на шаг выше. Если $loc это таже локация, то рекурсивный вызов может нарушать счетчики. Для этого надо передавать в локацию параметр “шага”. Я, например, делаю это так: gt ($Loc, $Param1, $Param2, $Param3…) А уже в теле обрабатываю этот параметр как $Args[n]
Кроме того у тебя killvar ‘npconloc’ может вообще не работать, так как “Нет возврата в меню на шаг выше. “. Поэтому цикл npconloc[]=j может повторяться до бесконечности. Попробуй киллварить массив перед его новым формированием.
g=arrsize ('locx')
killvar 'npconloc' !!!!!
loop i=0 while i<g
j = arrpos('locx',x,i) & ! Где "Х" - номер локации Непися
if j>=0 :
npconloc[]=j & ! Если Непись в локации, то в список заходит его номер (Номер Непися), т.е. запросто может быть и "0"
i=j+1 & ! Смещаем поиск на следующую позицию
else
i=g & ! Больше местов нет. Завершаем цикл.
end
end
PS. В данном, конкретном случае тебе даже Динамик не нужен. Вот пример формирования ступенчатого меню действий c обязательным возвратом на уровень выше. Так можно формировать меню Действий любой сложности и вложенности. А можно разбить на отдельные локации:
#Меню боя
If $Args[0]='Главное' :
CLA
!Проверка на Призыв Волка
If @Возможно_Призвать=On :
Act '<font color=<<$Colors[ФЛТ]>>>Амулет Призыва Волка |►</font>' :
CLA
If @GetPercent(Fighter_1['РеалВНС'],Fighter_1['Выносливость'])>=20 And @GetPercent(Fighter_1['РеалМан'],Fighter_1['Мана'])>=20 :
Act 'Призыв Волка. На минималках |<b><font color=<<$Colors[ВНС]>>>ВНС-20%</font></b> | <b><font color=<<$Colors[МАН]>>>МАН-20%</font></b>|' : $ArrWar[]=@Призыв_Волка('Fighter_1',20) & @Бой('Враг')
End
If @GetPercent(Fighter_1['РеалВНС'],Fighter_1['Выносливость'])>=30 And @GetPercent(Fighter_1['РеалМан'],Fighter_1['Мана'])>=30 :
Act 'Призыв Волка. По-простому |<b><font color=<<$Colors[ВНС]>>>ВНС-30%</font></b> | <b><font color=<<$Colors[МАН]>>>МАН-30%</font></b>|' : $ArrWar[]=@Призыв_Волка('Fighter_1',30) & @Бой('Враг')
End
If @GetPercent(Fighter_1['РеалВНС'],Fighter_1['Выносливость'])>=40 And @GetPercent(Fighter_1['РеалМан'],Fighter_1['Мана'])>=40 :
Act 'Призыв Волка. Пацанский подгон |<b><font color=<<$Colors[ВНС]>>>ВНС-40%</font></b> | <b><font color=<<$Colors[МАН]>>>МАН-40%</font></b>|' : $ArrWar[]=@Призыв_Волка('Fighter_1',40) & @Бой('Враг')
End
If @GetPercent(Fighter_1['РеалВНС'],Fighter_1['Выносливость'])>=50 And @GetPercent(Fighter_1['РеалМан'],Fighter_1['Мана'])>=50 :
Act 'Призыв Волка. Все по-взросломцу |<b><font color=<<$Colors[ВНС]>>>ВНС-50%</font></b> | <b><font color=<<$Colors[МАН]>>>МАН-50%</font></b>|' : $ArrWar[]=@Призыв_Волка('Fighter_1',50) & @Бой('Враг')
End
Act '<font color=<<$Colors[ФЛТ]>>>Назад ◄|</font>' : @Меню_Боя('Главное')
End
End
If Волк['Призыв']=On :
Act '<font color=<<$Colors[ФЛТ]>>>Умения призванного волка |►</font>' :
CLA
Act '<font color=<<$Colors[ФЛТ]>>>Назад ◄|</font>' : @Меню_Боя('Главное')
End
End
If @Атака('Разрешить','Fighter_1','Fighter_2')=On : Act '<<@Атака(''Меню'',''Fighter_1'')>>' : @Атака('Удар','Fighter_1','Fighter_2') & @Бой('Враг')
If @Искры('Разрешить','Fighter_1','Fighter_2')=On : Act '<<@Искры(''Меню'',''Fighter_1'')>>' : @Искры('Удар','Fighter_1','Fighter_2') & @Бой('Враг')
If @Сильный('Разрешить','Fighter_1','Fighter_2')=On : Act '<<@Сильный(''Меню'',''Fighter_1'')>>' : @Сильный('Удар','Fighter_1','Fighter_2') & @Бой('Враг')
If @Подсечка('Разрешить','Fighter_1','Fighter_2')=On : Act '<<@Подсечка(''Меню'',''Fighter_1'')>>' : @Подсечка('Удар','Fighter_1','Fighter_2') & @Бой('Враг')
If Fighter_1['СилаДуха']>0 :
Act '<font color=<<$Colors[ТСР]>>>Умения Силы Духа |►</font>' : @Меню_Боя('МенюДуха')
End
If On=On :
Act '<font color=<<$Colors[ФЛТ]>>>Предметы |►</font>' : @Меню_Боя('МенюПредметы')
End
If On=On :
Act '<font color=<<$Colors[ГЛД]>>>Умения 1-ого Уровня |►</font>' : @Меню_Боя('МенюУмения1')
End
Act '<b><font color=<<$Colors[ЗДР]>>>Сдаться (-20% ЗДР)</font></b>' :
CLA
Act '<b><font color=<<$Colors[ЗЕЛ]>>>Я уверен и хочу сдаться!</font></b>' : @Сдаться('Fighter_1') & @Бой('Конец')
Act '<b><font color=<<$Colors[КРС]>>>Я передумал</font></b>' : @Меню_Боя('Главное')
End
End
If $Args[0]='МенюДуха' :
CLA
Act '<font color=<<$Colors[ТСР]>>>Назад ◄|</font>' : @Меню_Боя('Главное')
End
If $Args[0]='МенюПредметы' :
CLA
Act '<font color=<<$Colors[ФЛТ]>>>Назад ◄|</font>' : @Меню_Боя('Главное')
End
If $Args[0]='МенюУмения1' :
CLA
Act '<font color=<<$Colors[ГЛД]>>>Назад ◄|</font>' : @Меню_Боя('Главное')
End
If $Args[0]='МенюКонец' :
CLA
Act '<font color=<<$Colors[ГЛД]>>>Завершить</font>' : Gt 'Город','Второй'
End
По сути, ты каждый раз формируешь одну и туже последовательность. Вынеси, как в примере, это меню в отдельную локацию и запускай его как gs ‘Меню’.
Тогда твой код будет выглядеть примерно так:
#Меню
If $Args[0]='Заново'
g=arrsize('npconloc')
CLA & ! Очищаем меню Действий
*CLR & ! Очищаем Картинку (поле вывода)
Loop i= 0 while i<g step i+=1:
npc=npconloc[i]
Act 'Поговорить с <<$name[npc]>> <<$surname[npc]>>':
If race[npc]=0:
CLA & ! Очищаем меню Действий
*CLR & ! Очищаем Картинку (поле вывода)
'<center><img src =""new/orcface.jpg"" ></center>'
If agro[npc] =1:
'Дерёмся'
Act 'Погнали': gt 'orcfight' & ! А что происходит в эйтой локации с массивами? Эта локация без возврата!
End
Act 'Назад': Gs ('Меню','Заново') & ! Возврат формируешь в безусловном порядке. Это закон вежливости игры. Принудительно можешь потом его обрубить при необходимости
Else
CLA & ! Очищаем меню Действий
*CLR & ! Очищаем Картинку (поле вывода)
'<center> <img src =""new/202.jpg"" ></center>'
If agro[npc] =1:
'Дерёмся'
Act 'Погнали': gt 'humanfight' & ! А что происходит в эйтой локации с массивами? Эта локация без возврата!
End
Act 'Назад': Gs ('Меню','Заново') & ! Возврат формируешь в безусловном порядке. Это закон вежливости игры. Принудительно можешь потом его обрубить при необходимости
End
End
End
End
Act 'Уйти' : Gt '<<$loc>>'
--- Меню ---
Вполне себе:
По сути, ты каждый раз формируешь одну и туже последовательность. Вынеси, как в примере, это меню в отдельную локацию и запускай его как gs
Да, я делаю это на отдельной локации. Вылечило проблему добавление npc =<<npc>> в тело act. Видимо при клике на ссылку он вызывал последнее из значений npc, а не все.
Вполне себе:
Возврат формируешь в безусловном порядке. Это закон вежливости игры
По поводу читаемости и вежливости кода, тут я вообще плох. Никогда до этого не программировал и не знаю как всё опрятно делать. Это наверное придёт с опытом
provincial:
Да, я делаю это на отдельной локации. Вылечило проблему добавление npc =<<npc>> в тело act. Видимо при клике на ссылку он вызывал последнее из значений npc, а не все.
По сути я тебе это и сказал - формирование одной и той же последовательности. Но твое решение - это костыль! На нем далеко не ухромаешь. Надо смотреть что возвращает NPC и <<NPC>>
У тебя еще многое впереди, особенно если ты никогда раньше не программировал.
Логика программирования - та еще фенечка. От нее многое зависит. Если не всё, то почти всё. Так как QSP это не компилятор (тот что проверяет код на исполняемость, а затем формирует исполняемый файл), а интерпретатор - тот кто выполняет каждую операцию последовательно, то ошибки кода неизбежны, а значит надо всегда создавать возможность возврата из “пустого экрана”. Для этого, если мне надо что-то рассчитать или вывести - прежде любой операции создаю Действие возврата. А затем, когда все рассчитал и получил результат - удаляю его и публикую нужные действия. Пример я тебе уже показал. Динамиком я пользуюсь только тогда, когда нельзя его заменить на простой код. В примере это тоже хорошо указано.
provincial:
Здравствуйте. Мой программистский опыт равен нулю. Но я пытаюсь разобраться в плеере и не смог осилить динамик(возможно что-то другое). Я нагенерил нпс и там вроде динамик работалет, как я думал. Но когда я проверяю присутсвие нпс на локации, он работает только наполовину и я не понимаю почему.
if arrsize('npconloc') <>0: loop i= 0 & g=arrsize('npconloc') while i<g step i+=1: npc=npconloc[i] dynamic " act 'Поговорить с <<$name[npc]>> <<$surname[npc]>>': if race[npc]=0: cla ' <center><img src =""new/orcface.jpg"" ></center>' if agro[npc] =1: ' Дерёмся' act 'Погнали': gt 'orcfight' else act 'уйти': gt '<<$loc>>' end else cla '<center> <img src =""new/202.jpg"" ></center>' if agro[npc] =1: 'Дерёмся' act 'Погнали': gt 'humanfight' else act 'уйти': gt '<<$loc>>' end end end" end end killvar 'npconloc'Код действительно проверяет присутствие и прекрасно справляется с выводом имён и фамилий. Но дальше не работает. Если на локации несколько нпс, они все братья-близнецы под разными именами. То есть на одной локации стоят только люди готовые подраться, на другой только неготовые орки. Видимо где-то по ходу теряется динамичность индекса npc, но я понять не могу где. В текстовую переменную с фигурными скобками выносить пробовал - ничего не меняется. На отдельную локацию тоже
Подскажите пожалуйста, где моя логическая ошибка. Update: ещё и как нормально выглядещее сообщение разместить не разобрался;(
Всё не просто, а очень просто. act все выводятся сразу, при каждом изменении переменной i. А вот динамик будет выполняться уже потом! Т.е. вы прочитаете список act, выберете с кем ваш прсонаж хочет пообщаться и начнется действие. Проблема в том, что внутри динамика значение переменной ’npc’ будет последнее в цикле! Поэтому имена разные а вот все остальные характеристики одинаковые и все они равны последнему персонажу в цикле. Это старая и известная проблема динамика в цикле. Т.е. в тело динамика необходимо передать аргумент соответствующий необходимому персонажу. По вашему алгоритму лучше всего подойдет номер ’act’. Т.е. надо связать номер ’act’ и номер конкретного персонажа. Ну или каким то другим образом сохранить номер необходимого персонажа и его потом передать в динамик. Тогда получится сделать всех персонажей разными. На локации смогут присутствовать и люди и орки, агрессивные и мирные.
provincial:
По поводу читаемости и вежливости кода, тут я вообще плох. Никогда до этого не программировал и не знаю как всё опрятно делать. Это наверное придёт с опытом
Для начала по возможности избегайте повторяемости кода. Иначе вы очень скоро утонете в своём же коде. Он станет не читаемым из-за размера. И ставьте, для себя, комментарии в коде, в значимых местах, чтобы не забывать что там происходит.
Простое правило: ОБщее выносим за скобки! Поясню на простом примере: 2x + 2y = 2(x + y)
А теперь пример на основе вашего динамика:
> if arrsize('npconloc') <>0:
> loop i= 0 & g=arrsize('npconloc') while i<g step i+=1:
> npc=npconloc[i]
> dynamic "
> act 'Поговорить с <<$name[npc]>> <<$surname[npc]>>':
> if race[npc]=0:
> $raceFace = 'orc'
> else
> $raceFace = 'human'
> end
>
> cla
> '
> <center><img src =""new/<<$raceFace>>face.jpg"" ></center>'
> if agro[npc] =1:
> '
> Дерёмся'
> act 'Погнали': gt '<<$raceFace>>fight'
> else
> act 'уйти': gt '<<$loc>>'
> end
> end
> end"
> end
> end
>
> killvar 'npconloc'
Обратите внимание, что название картинки - это тоже часть вашего алгоритма! Не надо картинки называть ‘как бог на душу положит’ и код станет проще!
Spacum:
Для начала по возможности избегайте повторяемости кода. Иначе вы очень скоро утонете в своём же коде. Он станет не читаемым из-за размера. И ставьте, для себя, комментарии в коде, в значимых местах, чтобы не забывать что там происходит.
Простое правило: ОБщее выносим за скобки! Поясню на простом примере: 2x + 2y = 2(x + y)
Обратите внимание, что название картинки - это тоже часть вашего алгоритма! Не надо картинки называть ‘как бог на душу положит’ и код станет проще!
Если человек никогда не программировал, то это сложно объяснить сразу. Тут нужен опыт проб и ошибок. Я, к примеру, привык к структурированному коду. Линейный код вызывает у меня несварение. И не потому, что он линейный, а потому, что он нечитабельный. Словно жуёшь траву. Поэтому я все действия, если они повторяются два раза и более сразу выношу в отдельную Процедуру-Функцию. Все “внутренние” переменные должны рождаться внутри, оставаться внутри и умирать внутри. Поэтому, когда алгоритм “вычищен”, то Всё, что было обозначено как Local в конце (в итоговом коде), как правило, получает KillVar. Исключение - Args. И даже с мои опытом программирования (ASM, TASM, BASIC, Fortran, Pascal, TurboPascal, C, C++, Borlad C, Delphi, Perl, Piton, PHP и вот теперь QSP) не всегда сразу могу найти правильный алгоритм или выделить блок. Поэтому сначала рисую структуру и только потом кодирую. Пусть немного “затратно” по времени, зато сильно сокращает не только сам код, но и его отладку.
а как работает delact? Сколько ни пробовал, он у меня вообще не удаляет действий никаких. Вроде бы нужно ввести название действия? Типа
act ‘Взять яблоко’: яблоко+=1 delact’Взять яблоко’ gt $curloc end
Не работает Или можно сделать delact $selact вместо названия действия? Тоже не работает. Но это два типа записи этой команды на которые движок НЕ ругается, но на которые всё равно не реагирует.
Хотелось бы освоить, чтобы не плодить кучу лишних переменных для взятия всяких вещей. и можно ли удалять гипер-строчки по типу <a href=“EXEC:код кнопки”>текст кнопки</a> ?
Блин, и как делать на новом форуме абзацы нормальные?)) ну нет таких кнопок в окне редактора? Что за новомодный прикол
Можно делать и delact ’Взять яблоко’ и delact $selact (последнее удобнее для удаления выбранного действия). DELACT удаляет действие сразу же - дальнейшего перехода на локацию не требуется. С “GT” действие удаляется, происходит переход на локацию и все действия добавляются заново. Если нужен GT, то проще просто не добавлять ACT по какому-то условию.