RU

Грабли: обсуждение

Nex Moderator 31.08.2010 17:55 29 comments 18979 views

Эта тема создана для обсуждения “Граблей” - самых распространенных ошибок начинающих авторов. Здесь можно задавать любые вопросы по граблям, а также предлагать свои грабли, самые распространенные из которых будут перенесены в соответствующую тему - “Грабли”.

Edited at 31.08.2010 18:25 (15 years ago)
Aleks Versus Moderator 08.09.2010 10:54 (15 years ago)

многострочные формы операторов должны завершаться словом [end]

Хе-хе. Через каждый второй if у меня такая байда.=)

Dark[Ol(U23)leneri] #34 08.09.2010 13:13 (15 years ago)

Предпочитаю однострочный иф. хД

Dark,
Это плохая практика.
С многострочными IF’ами код нагляднее, нужно только не забывать его форматировать.

Dark[Ol(U23)leneri] #34 08.09.2010 16:02 (15 years ago)

Nex, а я никому и не говорю, что однострочный - это хорошо. Просто предпочитаю=)

Aleks Versus Moderator 10.09.2010 10:12 (15 years ago)

Грабля: Ошибка с кучей одинаковых предметов
Выражается в добавлении одинаковых предметов в рюкзак десятки раз. Код выглядит примерно так:

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.

Грабля сформулирована невнятно. Здесь не ошибка описана, а вариант реализации, т.е. просто рецепт “как сделать”.

Для тех, кто хочет использовать предметы с подсчетом количества, написана специальная библиотечка - Продвинутый инвентарь. Описание, правда, слишком сложное.

Aleks Versus Moderator 11.09.2010 08:53 (15 years ago)

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] - операция объединения строковых выражений.

Цитаты из текущего хелпа…

эта проблема не настолько ничтожна, чтобы о ней умалчивать.

Кто умалчивает-то? Я просто не собираюсь добавлять это в список “граблей”, по уже упомянутым причинам.

Цитаты из текущего хелпа…

Хм, действительно. Что ж, жаль, что Байт так сделал. Будет больше путаницы.

Log in or Register to post comments.