Как сделать?
…
Здравствуйте. Подскажите, что я делаю не так?
Spoiler
*nl
! ГГ заходит в транспорт
*nl “Ты зашел в автобус.”
! Задаю переменные, что пока нет оплаты за проезд и ГГ не выбрал в какой части транспорта ему ехать
проезд_оплачен=0
место_занято=0
! Предоставляется выбор действий ГГ
act “Подойти к кондуктору”:
*nl
*nl “Ты подошел к кондуктору и оплатил проезд.”
проезд_оплачен=1
место_занято=0
delact “Подойти к кондуктору”
end
! После оплаты ГГ выбирает место в какой части транспорта он поедет, при выборе одного действия, остальные должны быть убраны.
! Тестирование правильности кода происходит пока только на этом действии
act “Встать в середине автобуса”:
! Здесь дается псевдовыбор ГГ не платить за проезд, отсюда задается такая переменная, то есть ГГ может проигнорировать действие подойди к кондуктору и попробовать проехать зайцем.
место_занято=1
*clr
*nl
*nl “Ты занял место стоя у окна в середине салона автобуса, облокотившись на поручень.”
! Тут указываю, что остальные действия убираются и становятся недоступные
delact “Встать в середине автобуса”
delact “Подойти к кондуктору”
delact “Занять место в конце автобуса”
delact “Занять место в начале автобуса”
delact “Занять любое сидячее место”
delact “Занять любое стоячее место”
! Но кондуктор сам стремится хорошо выполнить свою работу и идет “обилечивать” ГГ
if место_занято=1:
if проезд_оплачен=0:
*nl
*nl “К тебе подошла кондуктор.”
*nl
*nl “-Здесь что за проезд?!”
act “Оплатить проезд”:
*nl
*nl “Ты оплачиваешь проезд.”
delact “Оплатить проезд”
проезд_оплачен=1
! Здесь задаю другие переменные, так как хочу, чтобы до поры действие было скрыто и не хочу, чтобы игрок мог воспользоваться отсутствие логики и выйти на остановке игнорируя оплату, а только после выполнения этих условий…
if место_занято=1:
if проезд_оплачен=1:
! становится доступно это действие. Проблема возникает в том, что в одном случае действие выхода на остановке доступно, когда кондуктор сама подходит, все появляется так как и задумано, а в случае самостоятельной оплаты проезда, этого действия нет вообще. Что я делаю не так?
act ‘Выйти на остановке “Коммунистическая площадь”’:
time+=20
gs “Календарь”
*nl
*nl “Ты выходишь на остановку”
goto “Площадь”
end
end
end
end
end
end
end
Остальной кусок кода не стал приводить, я и в первом действии заплюхался, а неудачи сильно настрой портят. :( Мысли посещают, а может просто тебе не дано это освоить.
Нубай,
Просто играй с условиями
Spoiler
if проезд_оплачен=0 and место_занято=0:
*nl
*nl "Ты зашел в автобус."
act "Подойти к кондуктору":
*nl
*nl "Ты подошел к кондуктору и оплатил проезд."
проезд_оплачен=1
место_занято=0
gt curloc
end
end
if место_занято=0:
act "Встать в середине автобуса":
место_занято=1
*clr
*nl
*nl "Ты занял место стоя у окна в середине салона автобуса, облокотившись на поручень."
gt curloc
end
end
if проезд_оплачен=0 and место_занято=1:
*nl
*nl "К тебе подошла кондуктор."
*nl
*nl "-Здесь что за проезд?!"
act "Оплатить проезд":
проезд_оплачен=1
*nl
*nl "Ты оплачиваешь проезд."
gt curloc
end
end
if проезд_оплачен=1 and место_занято=1:
act 'Выйти на остановке "Коммунистическая площадь"':
time+=20
проезд_оплачен=0
место_занято=0
gs "Календарь"
*nl
*nl "Ты выходишь на остановку"
goto "Площадь"
end
end
Наверняка, это можно еще оптимизировать через else.
Я для переменных маркеров использую одно наименование и разные индексы, например: проверка[место_занято], проверка[проез_оплачен].
PS Акты я сделал, а тексты нет, т.е. они не все будут выводиться, сорян, нет времени. Их тоже нужно расставить по условиям.
Спасибо, я попробую, просто по видеоурокам Алекса продвигаюсь медленно, тоже времени не особо, пробую в свободное время, радует, что хоть что-то получается у меня, хотя в программировании вообще никакой я. Через else пробовал, Qgen ругается, что не хватает где-то end, пока понять не могу, где именно. Буду пробовать.
Нубай,
нет такого знания доступного одному человеку, которое другой, при должном упорстве, не смог бы усвоить.
Практика-практика-практика.
Учиться-учиться-учиться.
Исправлять-улучшать-совершенствовать.
Записал короткое видео. Надеюсь будет понятно.
Spoiler
Просто огромнейшее спасибо. Так все подробно, спасибо. Надо форсировать просмотр ваших видеоуроков, там смотрю много нового появилось. Еще раз, спасибо.
Aleks Versus все работает. Насколько я понял из записанного примера, лучше так раскладывать код (не знаю как точно более выразиться) , как-бы на составляющие? У меня вопрос возник. Я тестирую локации, самым простым способом через gt “имя локации”. Когда первый раз проверяю код, все нормально, как и должно быть, когда во второй раз, то все действия исчезают, остается только действие выйти на остановке. Помогает только при повторном запуске плеера. Так и должно быть, или где-то есть ошибка, не заглючит потом в игре в будущем. Еще вопрос, как можно проверить ход времени суток на одной локации? Вручную через переменную time задавать время или есть способ попроще?
Нубай,
да, проще всего “раскладывать” код на составляющие, на блоки. Собственно, ты уже это делаешь. Локации — это просто большие блоки кода, и в них ты “раскладываешь” весь код своей игры. А уже чтобы организовать на локации какое-то поведение, используешь блоки поменьше. И т.д.
Второй вопрос. Если ты перешёл на локацию, провёл персонажа по сценарию, то всем переменным выставились значения. Поэтому при повторном входе на локацию, код выполняется уже с учётом значений, которые выставились этим переменным. Собственно благодаря этому принципу и работает схема “действие по условию”, когда при нажатии действия мы заставляем плеер повторно зайти на локацию и выполнить весь код (команда goto $curloc).
Если тебе нужно зайти потестить локацию, потом выйти из неё, но ты хочешь, чтобы дальше она работала, как будто ты на неё впервые зашёл, нужно переменным проезд_оплачен,место_занято и другим присвоить первоначальные значения либо в самом начале игры, если ты возвращаешься туда, либо в действии, которое тебя с локации выводит.
В третьем вопросе не совсем понял. Ты хочешь потестировать, как будет выглядеть локация в разное время суток? Можно написать действие, которое будет менять время суток и возвращать тебя на текущую локацию. Тогда, если вывод описания у тебя уже прописан через условия, типа:
if hour=0 or (hour>0 and hour<6):
*pl "Ночь"
! и т.д.
то ты и увидишь изменение описания при изменении времени суток:
act "Прибавить час":
time+=60
gosub 'calendar'
goto $curloc
end
Я может глупость скажу, но правильно понимаю, что нужно сделать что-то вроде служебной локации, где будут обнуляться переменные при выходе из транспорта? Вообще, радует, что благодаря урокам, подсказкам, чтению форума, что-то получается, может и корявенько в плане стройности кода, но получается.
Нубай,
Обнулять можно хоть в самом действии “Выйти из транспорта”.
Тут уже зависит как удобнее и будет читабельнее, практичнее. А это каждый автор/программист решает сам.
И все таки сложно для моего понимания многое. Еще хотелось бы помощи попросить, но с другой стороны, если так спрашивать, то ничему не научишься, а, если опять же с другой стороны, не понимаешь никак, то тоже прогресс на месте стоит. У меня вопрос по коду опять возник, но пока хочу спросить, увидел тут в одной игре решения авторы интересны, хотелось глянуть код через Qgen, но автор поставил пароль на файл. На форуме где-то видел, говорили, что пароль обходится на раз, можете научить?
И вопрос по коду опять, все внутри, если не затруднит помочь, ну, или сам буду биться головой о стену, пока либо голову не сломаю, либо стену не пробью :=D
Spoiler
*nl
*nl “Ты пришел на автобусную остановку.”
! Здесь хотел отразить работу транспорта, когда он работает, а когда нет.
if hour=6 and hour<23:
автобус_работает=1
end
! Здесь хотел отразить работу транспорта, когда он работает, а когда нет. По задумке, если ГГ приходит позже 23, то пропадает действие ждать автобус, но пока не доделал тут.
До этого пробовал, не работало как надо. То есть действие ждать автобус пропадало, но даже после 23 продолжала работать команда rand и выдавать результаты приезда автобуса во время тестирования локации.
if hour=23 and hour<6:
автобус_работает=0
end
! тут все работает, но, если поставить условие IF то перестает работать команда RAND, то есть время при нажатии действия работает как надо, но не работают условия ниже.
act “Ждать автобус”:
автобус=rand (1,3)
time+=10
gs “Календарь”
gt $curloc
end
! здесь я попытался имитировать ожидание транспорта на остановке, никогда не нравилось в играх, когда ГГ подходит, а его уже ожидает “карета”. Эти условия работают, но, если в действии ждать автобус, поставить хотя бы IF, то перестают работать, почему так? Из-за $curloc?
if автобус=1:
*clr
*nl
*nl “К остановке подъезжает автобус, но он идет не в ту сторону, куда тебе нужно.”
end
if автобус=2:
*clr
*nl
*nl “К остановке подъезжает автобус, но он идет не в ту сторону, куда тебе нужно.”
end
if автобус=3:
*clr
*nl
*nl “К остановке подъезжает нужный тебе автобус.”
delact “Ждать автобус”
end
if автобус=3:
act “Войти в автобус”:
time+=1
gs “Календарь”
goto “Автобус до площади”
end
end
Проблема возникает, что переменные на локации запоминаются на if автобус=3: и во время тестирования, локация больше не обновляется, сразу же выдает if автобус=3: Я пробовал переменную killvar, но она, портит календарное время, там начинает отображаться бессмысленный набор цифр. Вопрос, как грамотно обнулять переменные. Склоняюсь к мысли, чтобы создать отдельную локацию и обращаться к ней, через GS, вот только не совсем понятно, как лучше сделать.
Есть passvord dekoder. Он должен тебе помочь.
На форуме ссылку уже давно потерял, но он еще остался у меня.
Оставлю ссылку на скачивание из google drive.
Svartberg,
Вашпе-то, на форуме ее потерли не спроста). Раньшешние обитатели не одобряли.
Нубай,
Условие if hour=6 and hour<23: эээ, как бы это сказать, херовое! Оно будет выполняться только в 6 часов.
if hour=23 and hour<6: - это невыполнимое условие, т.к. противоречат друг другу.
if автобус=1:
*clr
*nl
*nl “К остановке подъезжает автобус, но он идет не в ту сторону, куда тебе нужно.”
endif автобус=2:
*clr
*nl
*nl “К остановке подъезжает автобус, но он идет не в ту сторону, куда тебе нужно.”
endif автобус=3:
*clr
*nl
*nl “К остановке подъезжает нужный тебе автобус.”
delact “Ждать автобус”
end
Это излишне. Напиши просто
if автобус!0:
if автобус=3:
else
end
end
if автобус=3:
act “Войти в автобус”:
time+=1
gs “Календарь”
goto “Автобус до площади”
end
end
Тут надо воткнуть автобус=0. Тебе уже говорили про обнуление переменных.
Алекс придет, распишет все подробно), а пока так как есть.
Svartberg:
Есть passvord dekoder.
Спасибо большое, попробую вскрыть файл, уж больно мне понравилось, как там реализовано движение транспорта.
dmvikar:
Условие if hour=6 and hour<23: эээ, как бы это сказать, херовое! Оно будет выполняться только в 6 часов.
if hour=23 and hour<6: - это невыполнимое условие, т.к. противоречат друг другу.
Я так понимаю, нарушен синтаксис кода (если я правильно выражаюсь). Надо использовать >= и <= так? Я пробовал, но почему-то выдает разом две строки, видимо все равно не догоняю.
dmvikar:
Это излишне. Напиши просто
if автобус!0:
if автобус=3:
else
end
end
Извиняюсь, но мне эта конструкция кода немного не понятна. Что означает восклицательный знак?
dmvikar:
Тут надо воткнуть автобус=0. Тебе уже говорили про обнуление переменных.
Да, я помню, как раз туда втыкал, и начинались глюки. У меня написание очень медленно идет, так как напишу, и сразу тестирую, и весь процесс идет примерно так. Написал, давай проверим. Что за блин, почему не работает? А если так? Опять не работает. А так? И так не работает. Посмотрю справку? Не нашел ответа. Посмотрю FAQ от Алекса, вроде есть решение. Пробую. Нет, не работает. Еще смотрю, не находится ничего. А может на форуме что есть? Смотрю, ищу, не то, не то, нет моего случая. Блин, спрашивать на форуме придется. Нет, я лучше сам, а то так понимание не придет. Опять все по кругу, пробую, тестирую, не работает, да что же так сложно все. Все же придется просить помощи. И вот я тут. :rolleyes:
Нубай,
Условия работают так:
если истина:
Выполнить
иначе (то бишь, неистина)
Выполнить
end
У тебя же что было:
Допустим время у нас 10
Если время равно 6 И время меньше 23, то выполнить указанное.
А теперь давайте подумаем, что же тут не так собственно?
if 10 = 6 and 10 < 23: Дарова
10 равно 6? Не думаю. 10 меньше 23? Определённо так. НО!! Большое такое, но. Здесь истина - только одна часть условия. А именно - вторая. Но у нас же стоит И, а И хочет чтобы у тебя оба условия были истиной. Смекаешь?)
Поэтому, учим как работают логические операторы:
if true and true: "Я выведусь"
if false or true: "Я тоже!"
if 0 <> 1: "И я!" & !//-- эквивалетно 0!1 - то бишь неравно
А логика такова - И ожидает собственно, чтобы все условия которые он соединяет были истиной. ИЛИ ждёт чтобы одно из условий было истиной, а вот НЕРАВНО - требует дабы одно не совпадало с другим.
Есть ещё NO, но я его практически не использовал.