RU 📌 Pinned

Как сделать?

Dark[Ol(U23)leneri] #34 18.04.2010 22:57 6408 comments 2437796 views

тогда вопрос еще такой, как узнать четное ли число ?

чет - пять костей с четным количеством точек 2, 2, 4, 4, 6 или 2, 2, 2, 4, 6
нечет - пять костей с нечетным количеством точек 1, 3, 3, 5, 5 или 1, 1, 1, 1, 5

Aleks Versus Moderator 05.05.2017 07:40 (8 years ago)

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
Aleks Versus Moderator 05.05.2017 15:18 (8 years ago)

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
Aleks Versus Moderator 05.05.2017 17:24 (8 years ago)

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

Или лучше в другую тему с такими вопросами?

Aleks Versus Moderator 05.05.2017 18:35 (8 years ago)

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
Edited at 05.05.2017 18:54 (8 years ago)

И у меня тоже снова проблема. Самое страшное в том, что я не знаю, что это за проблема.

Пишу игру, уже там много всего есть, уже такая махина - однако я с самого начала постарался заложить вот эдакую стабильную основу, на которой уже все сюжетные линии строить, чтобы негде было багам случаться. Они, конечно, случались, но именно только в новых “пристраиваемых” линиях, а не в “основе” - и я их успешно ловил либо сам, либо с помощью анализатора. Легко выявлял прямо во время теста что не так, с помощью динамика-командной строки.. а вот теперь совсем плохо.
Вылет, именно вылет, случился там, где всё всегда было гладко. Во время боя - а боевая система, это “первый кирпичик основы” и тестировался уже сотни раз, там всё работало отменно. Я смоделировал ту же игровую ситуацию и того же противника, проиграл ее снова - вылета больше не было. Видимо, что “случайно промелькнувшее” - но что? И там очень много кода и искать вот такую ошибку - как иголку в стоге сена. И печальнее всего то, что анализатор не помогает здесь - этот вылет похож на такой, когда код бесконечно зацикливает перемещение между двумя локациями и не может остановиться. Анализатор такие ошибки, видимо, просто не может просчитать. И, конечно, при вылете программы - она просто вылетела и не указала строчку, на которой произошла ошибка.

И вот как, как вычислить и уничтожить такую ошибку?

UPD.. оу, я зажмурился и случайно ткнул наобум в огромное полотно кода… и нашел эту иголку. Проблема в одной строчке, как и предполагалось. Однако мой вопрос остается. В такой ситуации есть какие-то приемы, помогающие быстрее найти баг, или уже надо надеяться только на себя?

Aleks Versus Moderator 05.05.2017 19:53 (8 years ago)

mkir,
есть вариант. Перед каждым переходом ставить задержку и выводить информацию в дополнительное описание, например:

wait 1000
pl 'Переход на локацию такую-то по GS'
gosub 'такая-то локация'

задержка не даст вылететь игре, а информация поможет отыскать ошибку.
Так же неплохо выводить по ходу значения важных переменных, от которых зависят переходы.

Спасибо. Я так иногда делаю, но здесь бы если бы и помогло, пришлось бы день возиться, а то и больше. В ситуации, когда “Непонятно что” легче найти, если баг вылетает постоянно, а вот когда в одном случае из ста, это ж надо еще и этот “случай” смоделировать. А иголка моя была вот в чем: 1. для боя есть три отдельных окна - для боевых действий, магических и для специальных+перемещения. 2. отдельная переменная “привязка” запоминает, на каком окне игрок был в последний раз и перекидывает в него после других локаций, например, после локации “ход врага”. 3. Если враг “бесплотен” (например, призрак), то бить его физическим оружием можно только при наличии маны. 4. Если игрок находится в “боевом” окне, враг “бесплотен”, а маны нет - то его сразу перекидывает в “окно перемещений” - мол, пока не будет маны, боевое окно недоступно. 5. И вот при этом-то перекидывании я забыл изменить привязку. Игрок попадает в “спец.окно”, привязка возвращает его в “боевое окно” и далее все повторяется. 6. при повторных тестированиях ошибки не было, потому что мана была и я же не знал, что только в этом дело) да и ситуация редкая, т.к. и бесплотных врагов в игре мало.

Log in or Register to post comments.