RU

Одно действие

7mer4 #847 02.05.2013 10:09 21 comments 14556 views

Делою игру, почти сделал но возникла проблемка. К примеру
ПОМОЧЬ ВЛАДУ
ПОМОЧЬ КОЛЕ
Ну нажал я помочь Владу, помог, сделал локацию и помогаю Коле и выиграл. Но когда сразу нажимаю помочь Коле, то я не могу помочь владу. Как исправит? Нодеюсь вы меня поняли)) так как я начинающий)) и пока немного понимаю что и как

Aleks Versus Moderator 02.05.2013 12:15 (12 years ago)

7mer4,
может покажешь код, или заготовку игры? Очень сложно определить, в чём проблема, не видя конкретно, что у тебя там происходит. Возможно ты в действии “помочь Коле” делаешь переход через goto и действия очищаются? Может быть ты очищаешь их принудительно через cla? Может быть у тебя происходит вообще что-то из ряда вон выходящее.

В локации “Продолжение”(на которую переходим после починки окна) нет ссылок - ясно-понятно у тебя на ней игра и стопорится. По логике туда идут ссылки на дверь и/или дальнейший сюжет.

Бесплатный совет (не, я передумал - с тебя 5$ =) ) - подучи хоть чуток возможности программирования на QSP. Во всяком случае то, что касается условий “IF” - пригодится, чтобы не плодить столько локаций и нормально работали разветвления сюжета.

Aleks Versus Moderator 02.05.2013 16:48 (12 years ago)

Ну в общем-то, как и сказал EL_RIO, всё дело в том, что происходит переход на локацию “Продолжение” с помощью GOTO. Естественно действия затираются, описание локации обновляется. Тебе действительно следует продумать логику игры. Но не переживай, все мы учились на таких ошибках. Набьёшь руку, и всё пойдёт как по маслу.
К примеру. Ни одно из действий на самом деле не требует перехода. Скажем, действие “Взять доски и заколотить дверь” могло бы выглядеть так:

act 'Взять доски и заколотить дверь':
    *PL 'Дверь усрешно заколочена, осталось разобраться с окном.
    -Передвиним шкаф!'
    ! дверь_заколочена = 1
    delact $selact
end

Спасибо)

У меня запара со всеми act end и так далее, не розбираюсь в этом

Да там не сложно. Че непонятно - пиши - объясним.

7mer4,
выполни уроки из учебника, тогда будет проще.

Из учебника я всё сделал, но как сделать действие без гото? К примеру встал с кровати и надо умыться…

Aleks Versus Moderator 04.05.2013 21:32 (12 years ago)

7mer4,
Необходимость использования goto определяется тем, чего ты от действия требуешь. Зачем тебе использовать goto, если действие просто выводит на экран надпись, или присваивает значение переменной? Если ты хочешь, чтобы по действию игрок переходил в другую локацию, тогда конечно, goto необходимо.

Все как и сказал Алекс - goto(или, для краткости, gt) наиболее рационально использовать для перехода на другие локации или обновления текущей, а так в одну локацию можно впихнуть очень и очень много. Для этого в правом окне редактора просто пишешь что-то вроде:

act'Встать с кровати':
    !Выводим текст
    'Вы встали с кровати'
    delact $selact
    !или, если проще для понимания: delact'Встать с кровати' - чтобы удалить нажатую кнопку
          act'Умыться':
          !Эта кнопка появится только при условии нажатия первой т.к. она находится внутри 
          !неё или, если проще - в списке исполняемых ей действий
          'Вы умываетесь'
          delact $selact
          !А вот сюда уже можно вставлять дальнейшую логику действий. Хоть переход на другую 
          !локацию, хоть дальнейшие кнопки, хоть присвоить переменной, например, 
          !"встал_и_умылся" какое-то значение, если это критично и т.п.
          end
end

Просто вставь в редактор и посмотри как оно работает. Поковыряйся, поэкспериментируй и работа пойдет)

Использование DELACT - плохая привычка. Лучше сразу приучиться использовать GOTO $CURLOC и “действие по условию”.

Плохая не плохая, а это самый простой способ избавиться от определенного действия. Особенно удобно в ветвящихся диалогах, когда лишние переменные и условия нафиг не нужны, а имеющиеся в наличии “развилки” просто вкладываешь одна в другую. Хотя, конечно, можно и с обновлением странички сделать этот код как-то так:

if Встали=0:act'Встать':'Вы встали с кровати'&Встали=1&xgt $curloc
if Встали=1 and Умылись=0:act'Умыться':'Вы умылись'&Умылись=1&xgt $curloc

Это был укороченный вариант для лентяев. А вообще, чтобы было чуточку понятнее, правильно оформленное это смотрится примерно так:

if Встали=0:
     act'Встать':
           'Вы встали с кровати'
           Встали=1
           xgt $curloc
     end
end

if Встали=1 and Умылись=0:
     act'Умыться':
           'Вы умылись'
           Умылись=1
           xgt $curloc
     end
end

Ничего сложного вроде как. GT заменяем на XGT, чтобы сохранить надписи (не, ну че, зря мы их чтоль делали?=) ). Т.к. по умолчанию любая переменная равна нулю (если нигде не говорилось обратного), то и вылезает изначально только первое действие. Во время его выполнения значение переменной меняется на 1. И, при обновлении страницы (xgt $curloc), по условию, получается что первое действие не выводится (т.к. значение уже не 0, а 1), а второе появляется. При нажатии же на него происходит аналогичная с первым ситуация, только т.к. на подобный случай ничего не прописано, мы не видим более никаких кнопок. Зато остались надписи - во, не зря мы их делали=)

EL_RIO,
в том-то и дело, что использование DELACT выглядит естественным и удобным. Потом автор привыкает, использует везде, и в итоге мучается с багами. То есть, эта привычка неминуемо приводит к багам в долгосрочной перспективе, а поэтому я расцениваю её как плохую.

можно и с обновлением странички сделать этот код как-то так… Ничего сложного вроде как

А теперь добавьте сюда описание, которое выводится при входе на локацию…

Эмм… ну ок:

if Встали=0: 
'Вы находитесь в убогой лачуге, где кровать, сортир и умывальник, сделанный из пластиковой бутылки, покоятся на 4 квадратных метрах пространства =) Сами же вы лежите на кровати.'
     act'Встать': 
           'Вы встали с кровати' 
           Встали=1 
           xgt $curloc 
     end 
end 

if Встали=1 and Умылись=0: 
     act'Умыться': 
           'Вы умылись' 
           Умылись=1 
           xgt $curloc 
     end 
end

З.ы. а какие, например, баги могут быть? А то что-то с ходу толкового примера придумать не могу - у меня обычно баги как раз из-за отсутствия delact =)

Log in or Register to post comments.