Грабли: обсуждение
Эта тема создана для обсуждения “Граблей” - самых распространенных ошибок начинающих авторов. Здесь можно задавать любые вопросы по граблям, а также предлагать свои грабли, самые распространенные из которых будут перенесены в соответствующую тему - “Грабли”.
многострочные формы операторов должны завершаться словом [end]
Хе-хе. Через каждый второй if у меня такая байда.=)
Предпочитаю однострочный иф. хД
Dark,
Это плохая практика.
С многострочными IF’ами код нагляднее, нужно только не забывать его форматировать.
Nex, а я никому и не говорю, что однострочный - это хорошо. Просто предпочитаю=)
Грабля: Ошибка с кучей одинаковых предметов
Выражается в добавлении одинаковых предметов в рюкзак десятки раз. Код выглядит примерно так:
act 'поднять меч-кладенец':
add obj 'меч-кладенец'
delact $selact
end
Если подобное действие повторяется на нескольких локациях, или выполняется вновь при повторном посещении одной и той же, каждый раз в рюкзак будут добавляться одинаковые предметы.
То есть, скажем, нашел Иванушка-Дурачок Меч-кладенец, кинул в рюкзак. Нашел еще один, снова - в рюкзак. И вот уже в рюкзаке два предмета с одинаковым именем. Нашел денюжку - бросил в рюкзак, нашел еще одну и снова в рюкзак. И в рюкзаке уже четыре предмета. Если так он будет находить и находить, в итоге рюкзак будет загроможден одинаковыми предметами по самое нихочу. Самое простое решение я нашел в справке:
для использования одинаковых предметов инвентаря, например денег, патронов и т.п., лучше использовать дополнительную переменную, обозначающую количество этих предметов, чтобы не загромождать инвентарь списком из 137 предметов Рубль / Патрон. Для хранения числа предметов можно использовать массивы, индексируемые через строки:
OBJECTS[’деньги’] = 12
OBJECTS[’патроны’] = 137
Таким образом, чтобы не случалось оказий, количество найденных однотипных предметов надо подсчитывать в какой-нибудь переменной. А в действии ‘поднять предмет’ прописывать код, проверяющий, есть ли предмет, по величине данной переменной.
Пример:
Мечи-кладенцы подсчитываем в переменной objects[’меч-кладенец’]
act 'Поднять меч-кладенец':
if objects['меч-кладенец']<1: add obj 'меч-кладенец'
objects['меч-кладенец']=objects['меч-кладенец']+1
end
Из этого примера видно, что если количество предметов равно нулю, объект добавляется, и количество предметов увеличивается на один. Если предметов больше, чем ноль, предмет не добавляется, но количество предметов увеличивается.
Если нам ни к чему считать количество мечей (для сражения хватит и одного), то можно обойтись без переменной, подсчитывающей количество, но код будет немного сложнее.
act 'поднять меч-кладенец':
i = 1
меч_есть=0
:loop
IF i > COUNTOBJ:JUMP 'end'
if $GETOBJ(i)!'меч-кладенец':
i = i + 1
JUMP 'loop'
else
меч_есть=1
end
:end
if меч_есть!1: add obj 'меч-кладенец'
end
Этот код хорош тем, что позволяет проверить наличие предмета в рюкзаке и избавляет от необходимости вводить переменные подсчета количества предметов (если они ни к чему), а так же позволяет проверять на наличие предметы, названия которых генерируются в процессе игры.
Есть ещё конструкция, которую я пропустил. Она намного проще предыдущего кода, но работает почти так же. Её я нашёл здесь. Выглядит это примерно так:
act 'поднять меч-кладенец':
if no obj 'меч-кладенец': add obj 'меч-кладенец'
delact $selact
end
Впрочем, гибкости она лишена.
Думаю, этого пока достаточно, или надо ещё что-нибудь внести?
Непонятно, к чему такой кошмарный велосипед в куске кода #2, если можно обойтись кодом #3.
Грабля сформулирована невнятно. Здесь не ошибка описана, а вариант реализации, т.е. просто рецепт “как сделать”.
Для тех, кто хочет использовать предметы с подсчетом количества, написана специальная библиотечка - Продвинутый инвентарь. Описание, правда, слишком сложное.
Nex:
Непонятно, к чему такой кошмарный велосипед в куске кода #2, если можно обойтись кодом #3
Такой велосипед удобен, когда требуется поиск не по названию предмета, а по части его названия.
Nex:
Для тех, кто хочет использовать предметы с подсчетом количества, написана специальная библиотечка - Продвинутый инвентарь
Великолепная вещь!:)
Nex:
Здесь не ошибка описана, а вариант реализации
Говорили мне, не берись, если не умеешь. Думал, что написал всё. Поправлю.
aleksversus:
Nex:
Непонятно, к чему такой кошмарный велосипед в куске кода #2, если можно обойтись кодом #3
Такой велосипед удобен, когда требуется поиск не по названию предмета, а по части его названия.
А здесь-то он тогда зачем?
Нечем забитть гвоздь? Не покупайте молоток, вот купите микроскоп, он конечно не для этого предназначен, но и гвозди им можно забивать. Двойная выгода!
Пожалуй, для сбора готовых “рецептов” стоит создать отдельную тему :)
Самые полезные будут отправляться в раздел “примеры кода”, на странице “Разработчикам”.
Для такой темы этот код как раз подойдет, как пример реализации конктреной задачи.
Следует описать граблю с JUMP в действии.
Описал граблю про JUMP в действии.
Грабля у совсем начинающих: путаница между & и AND и сцепление строк через + и .
Также их сбивает с толку многообразие видов использования & - это и сцепка операторов, и склейка частей строк, и что-то еще?
путаница между & и AND и сцепление строк через + и .
Воден,
это не у всех начинающих, а только у тех, кто тащит за собой свои привычки из других языков программирования.
С синтаксической проверкой в QGen эта проблема отпадет сама собой. По “& вместо AND” нужно будет сделать подсказку.
& - это и сцепка операторов, и склейка частей строк, и что-то еще?
Впервые слышу.
Nex:
это не у всех начинающих, а только у тех, кто тащит за собой свои привычки из других языков программирования.
С синтаксической проверкой в QGen эта проблема отпадет сама собой. По “& вместо AND” нужно будет сделать подсказку.
Не уверен я, что пищущих на QSP программистов - исчезающе малый процент. Так что эта проблема не настолько ничтожна, чтобы о ней умалчивать.
По крайней мере наличие документации - желательно.
Что же касается второй проблемы:
IF [#выражение]:[оператор1] & [оператор2] & … ELSE [оператор3] & [оператор4] & …
[$выражение 1] & [$выражение 2] - операция объединения строковых выражений.
Цитаты из текущего хелпа…
эта проблема не настолько ничтожна, чтобы о ней умалчивать.
Кто умалчивает-то? Я просто не собираюсь добавлять это в список “граблей”, по уже упомянутым причинам.
Цитаты из текущего хелпа…
Хм, действительно. Что ж, жаль, что Байт так сделал. Будет больше путаницы.