Форум » » портирование книги "космический коммандос" » Ответить

портирование книги "космический коммандос"

123th: вопрос: проигрыватель утверждает что в данной конструкции ошибка - не хватает слова end завершающего многострочную форму оператора... что не так? [pre2]if #спротивника>0 and #стойкость > #корректировка: if #laz=1: act 'Выстрелить из лазера': *pl'Вы стреляете в робота из лазера.' if rand(1,6)+rand(1,6)>#мастерство: *pl'Вы промахнулись.' else #спротивника=#спротивника-2 end if #спротивника>0: if rand(1,6)+rand(1,6)>#мпротивника: *pl'Противник промахнулся.' else if #защита > 0: if rand(1,6)+rand(1,6)>#защита: #корректировка=#корректировка+rand(1,6) end #защита=#защита-1 else #корректировка=#корректировка+rand(1,6) end end end end if #blast=1: act 'Выстрелить из бластера': *pl'Вы стреляете в робота из бластера.' if rand(1,6)+rand(1,6)>#мастерство: *pl'Вы промахнулись.' else #спротивника=#спротивника-rand(1,6) end if #спротивника>0: if rand(1,6)+rand(1,6)>#мпротивника: *pl'Противник промахнулся.' else if #защита > 0: if rand(1,6)+rand(1,6)>#защита: #корректировка=#корректировка+rand(1,6) end #защита=#защита-1 else #корректировка=#корректировка+rand(1,6) end end end end if #laz=1 and #blast=0: if rand(1,6)+rand(1,6)>#мастерство: *pl'Вы промахнулись.' else #спротивника=#спротивника-1 end if #спротивника>0: if rand(1,6)+rand(1,6)>#мпротивника: *pl'Противник промахнулся.' else if #защита > 0: if rand(1,6)+rand(1,6)>#защита: #корректировка=#корректировка+rand(1,6) end #защита=#защита-1 else #корректировка=#корректировка+rand(1,6) end end end end if #стойкость <= #корректировка: *pl'Вы были убиты.' end end[/pre2]

Ответов - 39, стр: 1 2 All

123th: яшко, а ты говориш .... 123th, зачем вот это выкладывать было? Это НИЧЕГО. Вообще. Доделай чуть-чуть, чтобы было хоть чтото а не просто тупые клики. Тогда выкладывай. ИМХО. за тупыми кликами прячутся логические циклы... я это всё за неделю наваял изредко поглядывая в справку и это мой первый вопрос на форуме относительно кода...

Nex: Я отформатировал код. Итого у тебя 2 отсутствующих END'а, о чем тебе и сообщил ранее интерпретатор. Советую форматировать свой код впредь самостоятельно, используя табуляцию, разделяя большие участки кода пустой строкой. [pre] if #спротивника>0 and #стойкость > #корректировка: if #laz=1: act 'Выстрелить из лазера': *pl'Вы стреляете в робота из лазера.' if rand(1,6)+rand(1,6)>#мастерство: *pl'Вы промахнулись.' else #спротивника=#спротивника-2 end if #спротивника>0: if rand(1,6)+rand(1,6)>#мпротивника: *pl'Противник промахнулся.' else if #защита > 0: if rand(1,6)+rand(1,6)>#защита: #корректировка=#корректировка+rand(1,6) end #защита=#защита-1 else #корректировка=#корректировка+rand(1,6) end end end end if #blast=1: act 'Выстрелить из бластера': *pl'Вы стреляете в робота из бластера.' if rand(1,6)+rand(1,6)>#мастерство: *pl'Вы промахнулись.' else #спротивника=#спротивника-rand(1,6) end if #спротивника>0: if rand(1,6)+rand(1,6)>#мпротивника: *pl'Противник промахнулся.' else if #защита > 0: if rand(1,6)+rand(1,6)>#защита: #корректировка=#корректировка+rand(1,6) end #защита=#защита-1 else #корректировка=#корректировка+rand(1,6) end end end end if #laz=1 and #blast=0: if rand(1,6)+rand(1,6)>#мастерство: *pl'Вы промахнулись.' else #спротивника=#спротивника-1 end if #спротивника>0: if rand(1,6)+rand(1,6)>#мпротивника: *pl'Противник промахнулся.' else if #защита > 0: if rand(1,6)+rand(1,6)>#защита: #корректировка=#корректировка+rand(1,6) end #защита=#защита-1 else #корректировка=#корректировка+rand(1,6) end end end end if #стойкость <= #корректировка: *pl'Вы были убиты.' end end [/pre]

Nex: Конкретно этот участок кода стоит переписать набело, убрав повторяющиеся участки.


123th: спасибо за абсолютно неинформативный ответ - сразу видно программиста...

Nex: 123th чем тебя не устраивает ответ? Ты спросил - "в чем проблема с кодом". Я ответил, что действительно в твоем коде два END'а пропущены, еще и отформатировал текст, чтоб ты наглядно смог увидеть, в каком месте нарушается задуманный тобой уровень вложенности IF. Какой еще информации тебе нехватает?

123th: нет-нет, всё правильно. именно так программисты и отвечают.

Nex: 123th я сдаюсь. Какой ответ тебе был нужен? Какой ответ ты бы счел информативным?

123th: ммм... «оператор act в данном случае должен заканчиваться словом end»

Nex: 123th многострочные формы операторов ACT и IF всегда должны закрываться END'ом, это ты и без меня должен знать. Тем более, что в справку заглядываешь регулярно. "Править баги" в этом куске ужаса я предоставляю автору. Я лучше подскажу в каком направлении двигаться, чтобы ты смог самостоятельно решить проблему, чем сделаю всё за тебя. P.S. Может, и ты когда-нибудь поймёшь, почему я поступаю так, а не иначе, и даже когда-нибудь избавишься от стереотипов "о программистах".

123th: ... теперь у меня не работает оператор перехода по метке (jump) мне заявляют что метка не найдена. делал копипаст из примера в справке - работает, в чём дело не пойму. [pre2]cls *pl'Гравитационная бомба уничтожает дверь; теперь через возникшее круглое отверстие Вы можете попасть в какую-то комнату.' *pl'Вы не успеваете толком осмотреть комнату через дыру, потому что первое, что Вы видите - это металлический человекоподобный робот с бластером в руках.' *pl'Обнаружив беспорядок, робот поднимает оружие и цилится в Вас.' *pl'Вы должны сражаться.' if #laz=0 and #blast=0: *pl'Вы вступаете в неравный бой используя подвернувшиеся под руку предметы.' end #мпротивника=5 #спротивника=5 :loop cla KILLOBJ add obj "Стойкость = " + str (#стойкость-#корректировка) + " из " + str (#стойкость) add obj "Мастерство = " + str (#мастерство) add obj "Везение = " + str (#везение) add obj "Защита = " + str (#защита) add obj "***оружие***" if #laz=1: add obj "Лазер" end if #blast=1: add obj "Бластер" end if #gren>0: add obj "Граната (" + str (#gren) + " шт)" end if #bomb>0: add obj "Грав. бомба (" + str (#bomb) + " шт)" end add obj "***вещи***" add obj "пиллюли-витализаторы: " + str (#пиллюли) if #спротивника>0 and #стойкость > #корректировка: if #laz=1: act 'Выстрелить из лазера': *pl'Вы стреляете в робота из лазера.' if rand(1,6)+rand(1,6)>#мастерство: *pl'Вы промахнулись.' else #спротивника=#спротивника-2 end if #спротивника>0: if rand(1,6)+rand(1,6)>#мпротивника: *pl'Противник промахнулся.' else if #защита > 0: if rand(1,6)+rand(1,6)>#защита: #корректировка=#корректировка+rand(1,6) end #защита=#защита-1 else #корректировка=#корректировка+rand(1,6) end end end jump 'LOOP' end end end[/pre2] он что - в пределах сложной конструкции не видит внешних меток?

Nex: Распространенная ошибка. Код действия (Между ACT и соотв. END) обладает своей областью видимости, которая не пересекается с кодом локации. Проще говоря, из ACT нельзя делать просто jump на метку в коде локации, следует использовать GOTO либо GOSUB.

123th: ну я так и предположил, но в справке я упоминания об этом не нашёл, так что теоретически я всё правильно написал. и вообще это странно - зачем тогда нужны метки, если они не работают по прямому назначению. последние два оператора менее гибкий инструмент в данном случае.

Byte: В справке это есть, правда не указано явно. Нужно будет добавить.. Код действий - отдельный блок кода - например, как отдельная локация.

Nex: 123th метки необходимы для переходов в пределах видимости участка кода. Они работают по прямому назначению.

WladySpb: Переходы лучше организовывать по gt,xgt,gs с аргументами, в начале локации обработчик, который проверяет, передан ли аргумент, и какой. если передан - jump к нужной точке. Примерно так это выглядит: if args[0]!0:jump '<<args[0]>>' (много кода) :1 (код) if int<35: gt $curloc,1 else gt $curloc,3 end :2 (код) :3 (код) if int2>60:gt $curloc,2

Yashko: 123th, хочешь я немного облегчу написание кода? =) В цифровых переменных (#), вовсе не обязательно ставить знак "#"- просто название переменной и операции с ней. Гораздо удобней - меньше над переключатца по языкам

WladySpb: Yashko На самом деле, таких нюансов очень много. Это не единственный пример, когда можно подсократить код

123th: если честно - мне просто лень... ну вобщем доделал я эту страницу. теперь в игре можно провести первый бой, правда самый первый противник как то слабоват - я ему за все тестовые отыгрыши ни разу не проиграл... куда бы ещё файл по человечески выложить, чтоб было понятно что это даже не демка а вообще что то мелкое, но чтоб желающие могли поиграться...?

Byte: 123th, лучше доделай до какого-либо законченного состояния и выложим на qsp.su

Yashko: сюда по частям кидай - мож баги найдем...



полная версия страницы