Как сделать?
…
тогда вопрос еще такой, как узнать четное ли число ?
чет - пять костей с четным количеством точек 2, 2, 4, 4, 6 или 2, 2, 2, 4, 6
нечет - пять костей с нечетным количеством точек 1, 3, 3, 5, 5 или 1, 1, 1, 1, 5
Lv2013,
чётность можно проверить с помощью операции MOD — она вычисляет остаток от деления. Делим число на 2 и, если остаток есть, число нечётное, остатка нет — число чётное:
if ROL1 mod 2 = 0: 'ROL1 - чётное' else 'ROL1 - нечётное'
Тут бы я посоветовал сделать так:
! считаем чётные в ROLchet
ROLchet=0 & ! обнуляем переменную-счётчик
! далее, если число проходит проверку на чётность, увеличиваем значение счётчика
if ROL1 mod 2 = 0: ROLchet=ROLchet+1
if ROL2 mod 2 = 0: ROLchet=ROLchet+1
if ROL3 mod 2 = 0: ROLchet=ROLchet+1
if ROL4 mod 2 = 0: ROLchet=ROLchet+1
if ROL5 mod 2 = 0: ROLchet=ROLchet+1
! теперь чёт:
if ROLchet=5: $ROLREZ = 'чёт!!!'
! теперь нечёт:
if ROLchet=0: $ROLREZ = 'нечёт!!!'
ну как у вас такой маленький код выходит ?))
у меня в голове крутились махинации с делением на 2 и проверкой хз что )
Как проверить: если хоть одна переменная из массива является 1 - то присвоить новой переменной 1??
Хотелось бы покороче, возможно есть вариант..
IF Пример['Сложный']=1: Пример['Задания']=1
IF Телефон['Крутой']=1 or Телефон['Фантастика']=1: Телефон['Наличие']=1
Приветствую! Нуждаюсь в помощи.
3 локации. Перехожу из 1й во 2ю присваивается атрибут А=1.
Во 2й локации отображаются все действия с атрибутом А=1. на выходе из 2й есть действия с условием А=1 или В=1 с привязками к расстоянию.
на 2й при достижении расстояние=0 появляется действие для перехода в 3ю и присваивается атрибут А=0 .
Перехожу из 3й во 2ю(возвращаюсь обратно) даю В=1. на 2й локации(расстояние=0) видны действия как будто бы А=1 и В=1(вывел в описание <<А>><<В>>. в описании показывается А=0 В=1)
Заранее прошу прощение за корявость описания =) Спасибо!
1я локация
act 'Отправиться в путь':
A=1
dist=350
gt '2я локация'
end
2я локация
aldist=dist
if hour>=23:act 'Разбить лагерь':gt 'лагерь'
if aldist>=0 and aldist<=345 and hour>=5 and hour<=22:
if B=0:
act 'Идти на север(1час)':
dist+=5
gt $curloc
end
end
end
if aldist>=5 and aldist<=350 and hour>=5 and hour<=22:
if A=1:
act 'Идти на юг':
dist-=5
gt $curloc
end
end
end
if aldist>=350 and B=1:
act 'Зайти в локация 1':
B=0
gt '1я_локация'
end
end
if aldist>=350 and A=1:
act 'Вернуться в локацию 1':
A=0
gt '1я_локация'
end
end
if aldist=0 and aldist<5 and B=1:
act 'Вернуться в локацию 3':
B=0
gt '3я_локация'
end
end
if aldist<=0 and aldist<5 and A=1:
act'Идти дальше':
gt '4я_локация'
end
end
if aldist<=0 and aldist<5 and A=1:
act 'Зайти в локацию 3':
A=0
gt '3я_локация'
end
end
3я локация
act 'Отправиться обратно':
B=1
dist=0
gt '2я_локация'
end
Lv2013,
всё приходит с опытом. Набьёшь руку, тоже будет ловко выходить.))
jeesson,
есть функция ARRPOS, которая ищет в массиве определённые значения и в результат выдаёт позицию найденного элемента, а если элемент не найден, результат равен -1:
if arrpos('Телефон',1)<>-1: Телефон['Наличие']=1
DaininD,
Это точный код из игры, или переписанный кусками? Меня смущает условие
aldist<=0 and aldist<5
Если aldist меньше нуля, то оно так и так будет меньше пяти.
Скорее всего ты где-то что-то невнимательно написал. Проверь нет ли вместо латинской A кириллической А. И другие переменные. По этим отрывкам сложно смоделировать ситуацию, в которую ты попадаешь при тесте. Я скопировал твой код и запустил в плеере, но могу перемещаться только между первой и второй локациями. Не хватает вводных.
Добрый вечер!
У меня появился вопрос насчет плавного изменения цвета фона, пытался разобраться в специальном уроке qsp.su/index.php?option=com_content&view=article&id=112:2011-05-20-06-23-02&catid=36:2009-02-19-06-11-21&Itemid=76 но только запутался(( подскажите пожалуйста код, чтобы переходя на определённую локацию, фон игры с серого плавно менялся на белый, а выходя из этой локации обратно, вновь сменялся на серый.
Aleks Versus,
То был переписанный код, старался сохранить все важные моменты вырезав ненужные, могу скинуть в оригинале.
насчет aldist<=0 and aldist<5 . =) несколько раз переписывал, не обратил внимания на изменения.
Хочу сделать улучшенную торговлю в игре Rubedo и не уверен , что разработчик будет непротив. Еще немного опасаюсь критики =)4 дня только знаком(или 5) с qsp и 2й день пытаюсь исправить проблему.
оригинал
1я локация monScladMY
act 'Отправиться в путь с караваном.':
karavanMond=1
karavanAli=0
dist=350
minut=minut+30
gs'stat'
gt 'Evedon-Mond'
end
2я локация Evedon-Mond
*clr
cla
$metka = $ARGS[0]
$loc = $CURLOC
$metkaFight = $ARGS[0]
$locFight = $CURLOC
$metkaP = $ARGS[0]
$locP = $CURLOC
$metkaBed = $ARGS[0]
$locBed = $CURLOC
gs'stat'
aldist=dist
'<center><H4>Дорога Эведон-Мондюваль</H4></center>'
'Мондюваль расположен в горной местности. Некоторые участки проходят через редкие леса.'
'Подходы к Эведону занимает лес. Непосредственно возле города в основном луга и поля.'
'qwerty Нужно придумать как подмечать опасные места\засады!'
'qwerty <<aldist>>=(<<dist>>-<<Mondist>>)+<<Alidist>>'
'qwerty переменные караванов Алибад - <<karavanAli>>. Мондюваль - <<karavanMond>>'
if hour>=23:act 'Разбить лагерь на ночь(6 часов)':gt 'karavanREST'
if (aldist>=0 and aldist<=345) and (hour>=5 and hour<=22):
if karavanAli=1:
act 'Идти на север(1час)':
dist+=5
minut=minut+60
gt $curloc
end
end
end
if (aldist>=5 and aldist<=350) and (hour>=5 and hour<=22):
if karavanMond=1:
act 'Идти на юг(1час)':
dist-=5
minut=minut+60
gt $curloc
end
end
end
if aldist=350:
if karavanAli=1:
act 'Зайти в город Мондюваль':
cla
'Вы наконец то добрались до точки назначения.Осталось продать товар.'
karavanAli=0
minut=minut+30
act'Продолжить':gt 'monScladMY'
end
end
end
if aldist=350:
if karavanMond=1:
act 'Вернуться в город(Мондюваль)':
karavanMond=0
minut=minut+60
gt 'monScladMY'
end
end
end
if aldist=0:
if karavanAli=1:
act 'Вернуться в город(Эведон)':
karavanAli=0
minut=minut+60
gt 'evedScladMY'
end
end
end
if aldist=0:
if karavanMond=1:'Город Эведон'
act'Продолжить путь (в Каер Дун)':
cla
'Вы прошли мимо Эведона.На пути в Каер Дун вас ждут леса и болота.'
karavanMond=1
minut=minut+60
gt 'KaerD-Eved'
end
end
end
if aldist=0:
if karavanMond=1:
act 'Зайти в город Эведон':
cla
'Вы наконец то добрались до точки назначения.Осталось продать товар.'
karavanMond=0
minut=minut+30
act'Продолжить':gt 'evedScladMY'
end
end
end
3я локация evedScladMY
act 'Отправиться в Мондюваль.':
cla
karavanMond=0
karavanAli=1
dist=0
minut=minut+30
gt 'Evedon-Mond'
end
DaininD,
вот эта строка точно кривая
if karavanMond=1:'Город Эведон'
должно быть так
if aldist=0:
if karavanMond=1:
'Город Эведон'
act'Продолжить путь (в Каер Дун)':
Вот эта строка, хотя и рабочая
if hour>=23:act 'Разбить лагерь на ночь(6 часов)':gt 'karavanREST'
лучше тоже разбить на две
if hour>=23:
act 'Разбить лагерь на ночь(6 часов)':gt 'karavanREST'
end
а так нелогичностей не вижу. Действия Зайти в город Эведон, Продолжить путь (в Каер Дун), Вернуться в город(Мондюваль), Идти на юг (1час) появляться не должны.
Aleks Versus,
Спасибо за помощь.Но из ненужных появляется только Продолжить путь (в Каер Дун).
Придется сделать вход в город обязательным.
2 вопроса=) -
!) чем отличается GOTO от gt, есть ли приоритеты?
2) есть ли ограничение на количество
$metka = $ARGS[0]
$loc = $CURLOC
$metkaFight = $ARGS[0]
$locFight = $CURLOC
$metkaP = $ARGS[0]
$locP = $CURLOC
$metkaBed = $ARGS[0]
$locBed = $CURLOC
Или лучше в другую тему с такими вопросами?
DaininD,
ты поправил так как я написал, и он всё равно появляется?
GOTO от GT ничем не отличается. Это одна и та же команда
Об ограничениях можно почитать в теме “Ограничения QSP”
Larson,
держи рабочий код – flowing_back.qsp. Хочешь разбирайся, хочешь так применяй. В отличие от кода, данного Антиподом, здесь не используется wait, а значит игра не блокируется для игрока.
Aleks Versus,
Спасибо за ссылку =) я там бывал и понял, что на примерах я лучше учусь(пока учусь и чтото понимаю благодаря коду rubedo)
поправил это
act ’Разбить лагерь на ночь(6 часов)’:gt ‘karavanREST’
и удалил это ‘Город Эведон’
А насчет Продолжить путь (в Каер Дун) в нем изначально и была проблема(при выходе из Эведон)
Переодически правлю все починил так.
if aldist=0:
if karavanMond=1 and karavanAli=0:
act 'Зайти в город Эведон':
cla
'Вы наконец то добрались до точки назначения.Осталось продать товар.'
karavanMond=0
minut=minut+30
act'Продолжить':gt 'evedScladMY'
end
end
end
if aldist=0:
if karavanMond=1 and karavanAli=0:
act'Продолжить путь (в Каер Дун)':
cla
'Вы прошли мимо Эведона.На пути в Каер Дун вас ждут леса и болота.'
karavanMond=1
minut=minut+60
gt 'KaerD-Eved'
end
end
end
И у меня тоже снова проблема. Самое страшное в том, что я не знаю, что это за проблема.
Пишу игру, уже там много всего есть, уже такая махина - однако я с самого начала постарался заложить вот эдакую стабильную основу, на которой уже все сюжетные линии строить, чтобы негде было багам случаться. Они, конечно, случались, но именно только в новых “пристраиваемых” линиях, а не в “основе” - и я их успешно ловил либо сам, либо с помощью анализатора. Легко выявлял прямо во время теста что не так, с помощью динамика-командной строки.. а вот теперь совсем плохо.
Вылет, именно вылет, случился там, где всё всегда было гладко. Во время боя - а боевая система, это “первый кирпичик основы” и тестировался уже сотни раз, там всё работало отменно. Я смоделировал ту же игровую ситуацию и того же противника, проиграл ее снова - вылета больше не было. Видимо, что “случайно промелькнувшее” - но что? И там очень много кода и искать вот такую ошибку - как иголку в стоге сена. И печальнее всего то, что анализатор не помогает здесь - этот вылет похож на такой, когда код бесконечно зацикливает перемещение между двумя локациями и не может остановиться. Анализатор такие ошибки, видимо, просто не может просчитать. И, конечно, при вылете программы - она просто вылетела и не указала строчку, на которой произошла ошибка.
И вот как, как вычислить и уничтожить такую ошибку?
UPD.. оу, я зажмурился и случайно ткнул наобум в огромное полотно кода… и нашел эту иголку. Проблема в одной строчке, как и предполагалось. Однако мой вопрос остается. В такой ситуации есть какие-то приемы, помогающие быстрее найти баг, или уже надо надеяться только на себя?
mkir,
есть вариант. Перед каждым переходом ставить задержку и выводить информацию в дополнительное описание, например:
wait 1000
pl 'Переход на локацию такую-то по GS'
gosub 'такая-то локация'
задержка не даст вылететь игре, а информация поможет отыскать ошибку.
Так же неплохо выводить по ходу значения важных переменных, от которых зависят переходы.
Спасибо. Я так иногда делаю, но здесь бы если бы и помогло, пришлось бы день возиться, а то и больше. В ситуации, когда “Непонятно что” легче найти, если баг вылетает постоянно, а вот когда в одном случае из ста, это ж надо еще и этот “случай” смоделировать. А иголка моя была вот в чем: 1. для боя есть три отдельных окна - для боевых действий, магических и для специальных+перемещения. 2. отдельная переменная “привязка” запоминает, на каком окне игрок был в последний раз и перекидывает в него после других локаций, например, после локации “ход врага”. 3. Если враг “бесплотен” (например, призрак), то бить его физическим оружием можно только при наличии маны. 4. Если игрок находится в “боевом” окне, враг “бесплотен”, а маны нет - то его сразу перекидывает в “окно перемещений” - мол, пока не будет маны, боевое окно недоступно. 5. И вот при этом-то перекидывании я забыл изменить привязку. Игрок попадает в “спец.окно”, привязка возвращает его в “боевое окно” и далее все повторяется. 6. при повторных тестированиях ошибки не было, потому что мана была и я же не знал, что только в этом дело) да и ситуация редкая, т.к. и бесплотных врагов в игре мало.