То, что требуется система координат - достаточно естественно. Однако каким более конкретным образом она пилиться? Я вот думал как-нибудь через массивы, но чего-то ни к чему толковому не пришел...
Неактивен
NeoMatrix777 написал:
Господа, а есть ли возможность на этом движке запилить рогалик? Я в программирование не силен, поэтому у меня даже нет особых идей по алгоритму передвижения героя-символа по пустому полю.
Подводных камней слишком много, если делать это на АСМе.
Max написал:
Morych написал:
Попробуй просто перед матчем рассчитывать общую "силу" команды. А вот сила в данном случае уже зависит от атаки, защиты, и морали (дома играем или в гостях).
тогда каждый раз выбирая команду, нужно в ручную прописывать влияние Ат, Защ, Мор на СИЛУ???
Нет, если я правильно понял вопрос.
Неактивен
Там может быть только текст. Вставляйте в параграф Start.
Неактивен
Max написал:
тогда каждый раз выбирая команду, нужно в ручную прописывать влияние Ат, Защ, Мор на СИЛУ???
Морыч категорически одобряет параметр "Мор"
Вручную не надо, формула же будет. Только нужно определиться с диапазоном изменения Атк, Защ и Мор. Например, от 1 до 10.
Тогда можно, к примеру, так:
<<if команда1_играет_дома>> <<set $K = 1>> (коэф. влияния морали) <<else>> <<set $K = 0.5>> <<endif>> <<set $Сила1 = Math.round(Math.max(1, $Атк1 - $Защ2 + $Мор1 * $К))>> (при помощи max ограничиваем силу, чтобы не получилась меньше 1, round - округление до целого) <<set $Сила2 = Math.round(Math.max(1, $Атк2 - $Защ1 + $Мор2 * (1.5 - $К)))>> (если первая команда играет у себя, то вторая в гостях, и наоборот)
Получается, Сила может принимать значения от 1 до 19, а разница сил от -18 до 18. Значит условие для определения победителя немного изменится:
<<random $rnd = 99>>
<<if $rnd lt 50 + ($Сила1 - $Сила2) * 2.6>>
Т.о. при самом лучшем раскладе шанс победы 96.8%, оставшиеся проценты - шанс критической неудачи. То же самое и с критическим успехом при наихудшем раскладе.
Неактивен
NeoMatrix777 написал:
То, что требуется система координат - достаточно естественно. Однако каким более конкретным образом она пилиться? Я вот думал как-нибудь через массивы, но чего-то ни к чему толковому не пришел...
Через массивы, всё верно, массивы строк. Например, в цикле вывести все строки массива карты до координаты Y гг. Затем выводим часть строки до координаты X, рисуем @ (гг), выводим оставшуюся часть строки, затем выводим оставшиеся строки карты.
Неактивен
Фух, загрузил свою первую интерактивную книгу в библиотеку. Правда, почему-то, при загрузке ругалось на музыкальный файл формата OGG. Пришлось музыку исключить из книги
Неактивен
Надо было и ogg и mp3 - оба файла сделать.
А так - поздравляю с успешным дебютом!
Неактивен
DoubleDragon написал:
Надо было и ogg и mp3 - оба файла сделать.
А так - поздравляю с успешным дебютом!
Спасибо! А насколько он успешный - покажет время и участие в конкурсе 31
Неактивен
Просьба помочь разобраться в ошибке кода:
<<set $жизнь = $жизнь>> <<set $жизнь1 = $жизнь1>> Мое здоровье - ''<<print $жизнь>>'' Здоровье вора - ''<<print $жизнь1>>'' Вор поворачивается ко мне. Его лицо скрывает балахон. Не говоря ни слова, гость направляется на меня... <<if $успех eq 1>> [b]----------------------------------------возврат сюда[/b] [[Ударить в лицо|БойВорНеус {$успех = 2}]] [[Ударить в живот|БойВорНеус {$успех = 3}]] [[Кинуть в вора стул|БойВорНеус {$успех = 4}]] <<endif>> <<if $успех eq 2>> <<clrscr>> <<random $кубик = 6>> <<if $кубик gte 5>> Я ударяю вора в голову. Великолепный удар! <<set $жизнь1 = $жизнь1 - 3>> Мое здоровье - ''<<print $жизнь>>'' Здоровье вора - ''<<print $жизнь1>>'' <<else>> Вор ставит блок и проводит ответный удар! <<set $жизнь = $жизнь - 1>> Мое здоровье - ''<<print $жизнь>>'' Здоровье вора - ''<<print $жизнь1>>'' <<endif>> <<if $жизнь1 lte 0>> <<goto 'ОсмотретьсяЖив'>> <<else>> <<goto 'БойВорНеус' {$успех = 1}>> <<elseif $жизнь lte 0>> <<goto 'Конец1'>> <<else>> <<goto 'БойВорНеус' {$успех = 1}>> <<endif>> <<endif>>
Почему-то у меня назад не возвращает. Как можно сделать так, чтобы если жизни остаются, параграф продолжался заново с начала?
Неактивен
alfa10 написал:
Просьба помочь разобраться в ошибке кода:
Почему-то у меня назад не возвращает. Как можно сделать так, чтобы если жизни остаются, параграф продолжался заново с начала?
Давай попробуем разобраться, но сначала небольшая работа над ошибками Читай закомментированные строки (после символа #)
<<set $жизнь = $жизнь>> <<set $жизнь1 = $жизнь1>> # Две верхние строчки не нужны Мое здоровье - ''<<print $жизнь>>'' Здоровье вора - ''<<print $жизнь1>>'' Вор поворачивается ко мне. Его лицо скрывает балахон. Не говоря ни слова, гость направляется на меня... <<if $успех eq 1>> [[Ударить в лицо|БойВорНеус {$успех = 2}]] [[Ударить в живот|БойВорНеус {$успех = 3}]] [[Кинуть в вора стул|БойВорНеус {$успех = 4}]] <<endif>> # Советую выделять внутренности блока if-endif # при помощи табуляции, код будет легче читать <<if $успех eq 2>> <<clrscr>> <<random $кубик = 6>> <<if $кубик gte 5>> Я ударяю вора в голову. Великолепный удар! <<set $жизнь1 = $жизнь1 - 3>> Мое здоровье - ''<<print $жизнь>>'' Здоровье вора - ''<<print $жизнь1>>'' <<else>> Вор ставит блок и проводит ответный удар! <<set $жизнь = $жизнь - 1>> Мое здоровье - ''<<print $жизнь>>'' Здоровье вора - ''<<print $жизнь1>>'' <<endif>> # Выше дважды написано одно и то же (про жизни гг и противника) # такого быть не должно. Лучше вынести эти две строки за endif, # вот прям сюда <<if $жизнь1 lte 0>> <<goto 'ОсмотретьсяЖив'>> <<else>> <<goto 'БойВорНеус' {$успех = 1}>> <<elseif $жизнь lte 0>> <<goto 'Конец1'>> <<else>> <<goto 'БойВорНеус' {$успех = 1}>> <<endif>> # Программа никогда не дойдёт до двух нижних goto, # поскольку при истинности первого условия выполнится первый goto, # а второй goto выполнится во всех остальных случаях. # В блоке if-endif внутри может быть сколько угодно elseif, # но всегда только один else, причём стоять он должен самым последним! <<endif>>
Неактивен
Вот есть код:
:: Пещера <<display 'Инвентарь0'>> Здоровье охотника - <<print $жизнь1>> Здоровье охотницы - <<print $жизнь2>> # Начало цикла <<if $жизнь lte 0>> <<goto 'Конец'>> <<elseif $жизнь1 lte 0>> <<display 'Пещера'>> <<elseif $жизнь2 lte 0>> <<display 'Пещера'>> <<elseif $жизнь1 + $жизнь2 lte 0>> <<goto 'пещера2'>> <<else>> ''Выберите действие против охотника:'' # Магия огня <<if $мана gte 3>> [[Огонь I (шанс 50%, урон 20, мана - 3)|Пещера1 {$действие = 2}]] <<endif>> # Магия огня [[Бросить камень (шанс 20%, урон - 30)|Пещера1 {$действие = 3}]] [[Ударить рукой (шанс 50%, урон - 10)|Пещера1 {$действие = 4}]] [[Бросить ногой (шанс 50%, урон - 10)|Пещера1 {$действие = 5}]] <<endif>> # Начало цикла
Получается так: мой герой бьется против двух врагов. Хочу, чтобы при гибели первого врага шло сражение с другим врагом. Но при гибели одного из врагов игра виснет. Полагаю, что из-за:
вот этой записи в коде
<<if $жизнь lte 0>> <<goto 'Конец'>> <<elseif $жизнь1 lte 0>> <<display 'Пещера'>> <<elseif $жизнь2 lte 0>> <<display 'Пещера'>> <<elseif $жизнь1 + $жизнь2 lte 0>> <<goto 'пещера2'>> <<else>>
Я вижу ее так: если моя жизнь меньше или равна 0, то идем в параграф "Конец". Если жизнь противника1 меньше или равна 0, то продолжаем бой. Если жизнь противника2 меньше или равно 0, то продолжаем бой. Если жизни соперников 1 и 2 вместе меньше или равны 0 (т.е. обо уничтожены), то переходим в параграф "Пещера 2"
Неактивен
Есть ли параграф "Пещера"? Если есть, то, скорее всего, в нем и содержится ошибка. А тут две ошибки:
<<if $жизнь lte 0>> <<goto 'Конец'>> <<elseif $жизнь1 lte 0>> <<display 'Пещера'>> <<elseif $жизнь2 lte 0>> <<display 'Пещера'>> <<elseif $жизнь1 + $жизнь2 lte 0>> (1) <<goto 'пещера2'>> (2) <<else>>
(2) никогда не выполнится, ибо до него тупо никогда не доберется очередь.
(1) неправильно производится проверка. Если значение одной из переменных будет отрицательным, а другой положительным, то их сумма может оказаться равной либо меньше нуля. Правильно будет:
<<if $жизнь lte 0>> <<goto 'Конец'>> <<elseif ($жизнь1 lte 0) and ($жизнь2 lte 0)>> <<goto 'пещера2'>> <<elseif $жизнь1 lte 0>> <<display 'Пещера'>> <<elseif $жизнь2 lte 0>> <<display 'Пещера'>> <<else>>
Неактивен
Не, чет не то... если прописываю так:
<<if $жизнь lte 0>> <<goto 'Конец'>> <<elseif ($жизнь1 lte 0) and ($жизнь2 lte 0)>> <<goto 'пещера2'>> <<elseif $жизнь1 lte 0>> <<display 'Пещера'>> <<elseif $жизнь2 lte 0>> <<display 'Пещера'>> <<else>>
то игра виснет... Да и получается, если убивают врага (жизнь1, например), а второй жив, то получается первый опять ходит, даже если он мертв уже
P.S. Все, разобрался в коде... Пришлось упростить боевку (хотел, чтобы по очереди атаковался сперва первый враг, затем второй). Сделал, что сам выбираю кого атаковать
Отредактировано alfa10 (08.11.2013 22:42)
Неактивен
Хочу сделать программу, где при вводе улицы и номера дома выдается наименование района. Получается, в одном параграфе нужно ввести нечто типа:
<<input '0' $адрес>>
В параграфе 0 нужно прописать некий код:
<<if $адрес eq '12марта130'>> <<set $адрес = 1>> <<elseif $адрес eq 'калинина215'>> <<set $адрес = 2>> <<endif>> <<goto '2'>>
где на выводе (параграф 2) уже есть код:
<<if $адрес eq 1>> Черемушки <<elseif $адрес eq 2>> Вокзал <<else>> Район не определен! <<endif>>
Так все работает! А как сделать, чтобы не прописывать каждый номер дома на улице, а сделать например, чтобы улица Калинина от 1 до 50 автоматически попадала под район Возкал?
Отредактировано alfa10 (13.11.2013 12:28)
Неактивен
:: vvod Введите адрес: <<input '0' $адрес>> Пример: Калинина, 155 :: 0 <<set $адрес = $адрес.replace(/ /g,"").toLowerCase()>> <<set $улица = "">> <<set $дом = "">> <<set $зап = 0>> <<set $i = -1>> <<loop $адрес.length>> <<set $i++>> <<if $адрес[$i] eq ",">> <<set $зап = 1>> <<continue>> <<endif>> <<if $зап eq 0>> <<set $улица = $улица + $адрес[$i]>> <<else>> <<set $дом = $дом + $адрес[$i]>> <<endif>> <<endloop>> <<if $улица eq "калинина" and $дом gte 1 and $дом lte 50>> Вокзал <<elseif $улица eq "калинина" and $дом gte 51 and $дом lte 200>> Черемушки <<elseif $улица eq "красныхпартизан" and $дом gte 1 and $дом lte 100>> Центральный район <<else>> Район не определен! <<endif>>
Неактивен
alfa10 написал:
Спасибо! Еще б расшифровал бы код - вообще круто было бы
Этот код разбивает введённую строку $адрес на две строки: $улица и $дом. Разделение строк происходит в цикле посимвольно: до запятой - собирается название улицы, после запятой - номер дома.
Есть другой способ сделать то же самое:
:: vvod Введите адрес: <<input '0' $адрес>> :: 0 <<set $адрес = $адрес.replace(/ /g,"").toLowerCase()>> ---- удалить все пробелы из строки $адрес, преобразовать в нижний регистр <<set $улица = "">> <<set $дом = "">> <<set $i = $адрес.indexOf(",")>> ---- индекс первой запятой в строке $адрес <<if $i gt -1>> ---- если есть запятая <<set $улица = $адрес.substr(0, $i)>> ---- название улицы - это часть строки до запятой <<set $дом = $адрес.substr($i + 1)>> ---- номер дома - часть строки после запятой <<endif>> Улица: <<print $улица>>; Дом: <<print $дом>>;
Неактивен
Поясню тогда из своего примера, чего нет в примере Морыча:
<<set $зап = 0>> ---- переменная дающая понять попалась уже запятая в цикле или нет. 0 - не попадалась, 1 - попадалась <<set $i = -1>> ---- эта переменная будет обозначать индекс символа в строке $адрес <<loop $адрес.length>> ---- объявление цикла, цикл будет выполняться столько раз, сколько символов в строке $адрес <<set $i++>> ---- увеличиваем $i, таким образом в первый раз $i будет равен 0, а индекс в строке как раз и начинается с нуля <<if $адрес[$i] eq ",">> ---- проверяем не является ли символ в строке $адрес с индексом $i запятой и если да, то <<set $зап = 1>> ---- устанавливаем значение переменной $зап = 1 <<continue>> ---- не выполняем все что ниже идет по циклу, а снова возвращаемся на его начало. Еще существует полезная штукенция как <<break>>, которая вообще полностью прекращает цикл. О ней и вообще о всем остальном можно прочитать в справке <<endif>> <<if $зап eq 0>> ---- если $зап равен 0, то <<set $улица = $улица + $адрес[$i]>> ---- прибавляем к строке $улица символ с индексом $i из строки $адрес <<else>> ---- иначе <<set $дом = $дом + $адрес[$i]>> ---- прибавляем к строке $дом символ с индексом $i из строки $адрес <<endif>> <<endloop>> ---- конец цикла
Изменение регистра нужно по причине того, что, например, строка "Каланина" не равна строке "каланина", а пробелы я удалил для удобства. Кстати, также тут
<<if $улица eq "калинина" and $дом gte 1 and $дом lte 50>> Вокзал <<elseif $улица eq "калинина" and $дом gte 51 and $дом lte 200>> Черемушки <<elseif $улица eq "красныхпартизан" and $дом gte 1 and $дом lte 100>> Центральный район <<else>> Район не определен! <<endif>>
можно увидеть что переменная $дом, где хранится номер дома в виде строки, сравнивается с числами. Так можно делать далеко не во всех языках программирования, но тут так делать можно.
Отредактировано Flash (14.11.2013 20:24)
Неактивен
Flash, ты уже достиг достаточного уровня просветления
Когда же, наконец, мы увидим твою работу в библиотеке?
Неактивен
Кстати, в примере выше есть баг: если ввести в поле ввода число и нажать enter, то произойдет вылет на стартовый параграф. Это можно вылечить, если перед
<<set $адрес = $адрес.replace(/ /g,"").toLowerCase()>>
добавить строку
<<set $адрес = $адрес + "">>
Таким приемом мы преобразуем число в строку.
Неактивен
Подскажите пожайлуста, можно ли в книгу-игру вставлять видео ролики. Без участия интернета, тоесть можно ли вставлять ролики кроме ютуба. Если ролик будет лежать в папке с игрой например. Как это сделать?
Неактивен
Нет, нельзя. Дело в том, что в этом случае размер файлов становится слишком большим для публикации в библиотеке.
Неактивен