То, что требуется система координат - достаточно естественно. Однако каким более конкретным образом она пилиться? Я вот думал как-нибудь через массивы, но чего-то ни к чему толковому не пришел...
Неактивен
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 $адрес = $адрес + "">>
Таким приемом мы преобразуем число в строку.
Неактивен
Подскажите пожайлуста, можно ли в книгу-игру вставлять видео ролики. Без участия интернета, тоесть можно ли вставлять ролики кроме ютуба. Если ролик будет лежать в папке с игрой например. Как это сделать?
Неактивен
Нет, нельзя. Дело в том, что в этом случае размер файлов становится слишком большим для публикации в библиотеке.
Неактивен