RU 📌 Pinned

Как сделать?

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

Однострочные IF - основной источник проблем и багов )

Aleks Versus Moderator 15.12.2016 07:39 (9 years ago)

skov,
ты, как я вижу, не понимаешь, зачем нужны end’ы. А ведь всего пару страниц назад разбирали похожий случай. end даёт программе понять, где кончается код действия или код, выполняемый по условию:

! открываем действие
act 'название действия':
	!код действия
	! код действия
	! код действия
! закрываем действие
end
...
!открываем условие (если выполняется это)
if УСЛОВИЕ:
	! код, если условие выполнено
	! код, если условие выполнено
! вторая часть условия (если условие не выполняется)
else
	! код, если условие не выполнено
	! код, если условие не выполнено
! окончание проверки условия и выполнения соответствующих блоков кода
end

Плеер игнорирует отступы перед строками в коде и определяет окончание того или иного многострочного оператора по наличию end. Преформатирование делается только для удобства чтения кода.
Вот так должен выглядеть твой код:

Spoiler
! открываем действие "спать"
ACT 'спать': 
    time+=340 
    Cla 
    *CLR
    ! открываем условие
	if mama_kux_zav = 2: 
		'<center><img src="pict\mom\1сны.gif" ></center>' 
		'<center>Тут текст бла-бла-бла-бла</center>'
		! открываем действие "встать"
		ACT 'Встать': 
			GT 'Комната ГГ'
		! закрываем действие "встать" потому что код, который описывает это действие кончился
		end
	! вторая часть условия
	else 
		$image[0]= '<center><img src="pict\gg\1спитГГ.jpg"></center> 
		<center>Тут текст бла-бла-бла-бла</center>' 
		$image[1]= '<center><img src="pict\gg\2спитГГ.jpg"></center> 
		<center>Тут текст бла-бла-бла-бла</center>' 
		$image[2]= '<center><img src="pict\gg\3спитГГ.jpg"></center> 
		<center>Тут текст бла-бла-бла-бла</center>' 
		$image[3]= '<center><img src="pict\gg\4спитГГ.jpg"></center> 
		<center>Тут текст бла-бла-бла-бла</center>' 
		$image[4]= '<center><img src="pict\gg\1гифсон.gif"></center> 
		<center>Тут текст бла-бла-бла-бла</center>' 
		$image[5]= '<center><img src="pict\gg\2cон.jpg"></center> 
		<center>Тут текст бла-бла-бла-бла</center>' 
		$image[6]= '<center><img src="pict\gg\2гифсон.gif"></center> 
		<center>Тут текст бла-бла-бла-бла</center>' 
		$image[7]= '<center><img src="pict\gg\2гифсон2.gif"></center> 
		<center>Тут текст бла-бла-бла-бла</center>' 
		$image[8]= '<center><img src="pict\gg\3гифсон.gif"></center> 
		<center>Тут текст бла-бла-бла-бла</center>' 
		*clr 
		$image[rand(0,8)]
		! открываем действие "встать"
		ACT 'Встать': 
			GT 'Комната ГГ'
		! закрываем действие "встать"
	! закрываем условие mama_kux_zav = 2
	end
! закрываем действие "спать"
end
! открываем действие "Поваляться в кровати"
ACT 'Поваляться в кровати': 
    CLA 
    *CLR 
	$image[0]= '<center><img src="pict\gg\2кровать.jpg"></center> 
	<center>Тут текст бла-бла-бла-бла</center>' 
	$image[1]= '<center><img src="pict\gg\3кровать.jpg"></center> 
	<center>Тут текст бла-бла-бла-бла</center>' 
	$image[2]= '<center><img src="pict\gg\4кровать.jpg"></center> 
	<center>Тут текст бла-бла-бла-бла</center>' 
	$image[3]= '<center><img src="pict\gg\4кровать.jpg"></center> 
	<center>Тут текст бла-бла-бла-бла</center>' 
	*clr 
	$image[rand(0,3)] 
	'<center>Тут текст бла-бла-бла-бла</center>'
	! открываем действие "встать с кровати"
	ACT 'Встать с кровати': 
		CLA 
		gt 'Комната ГГ'
	! закрываем действие "встать с кровати"
	END
! закрываем действие "Поваляться в кровати"
end

А вот так плеер понимает твой нынешний код:

Spoiler
! открываем действие спать
ACT 'спать': 
    time+=340 
    Cla 
    *CLR
    ! открываем условие
    if mama_kux_zav = 2: 
		'<center><img src="pict\mom\1сны.gif" ></center>' 
		'<center>Тут текст бла-бла-бла-бла</center>'
		! открываем действие "встать"
		ACT 'Встать': 
			GT 'Комната ГГ'
			! эта часть идёт внутри действия "встать", а потому else игнорируется!!!
			else 
			$image[0]= '<center><img src="pict\gg\1спитГГ.jpg"></center> 
			<center>Тут текст бла-бла-бла-бла</center>' 
			$image[1]= '<center><img src="pict\gg\2спитГГ.jpg"></center> 
			<center>Тут текст бла-бла-бла-бла</center>' 
			$image[2]= '<center><img src="pict\gg\3спитГГ.jpg"></center> 
			<center>Тут текст бла-бла-бла-бла</center>' 
			$image[3]= '<center><img src="pict\gg\4спитГГ.jpg"></center> 
			<center>Тут текст бла-бла-бла-бла</center>' 
			$image[4]= '<center><img src="pict\gg\1гифсон.gif"></center> 
			<center>Тут текст бла-бла-бла-бла</center>' 
			$image[5]= '<center><img src="pict\gg\2cон.jpg"></center> 
			<center>Тут текст бла-бла-бла-бла</center>' 
			$image[6]= '<center><img src="pict\gg\2гифсон.gif"></center> 
			<center>Тут текст бла-бла-бла-бла</center>' 
			$image[7]= '<center><img src="pict\gg\2гифсон2.gif"></center> 
			<center>Тут текст бла-бла-бла-бла</center>' 
			$image[8]= '<center><img src="pict\gg\3гифсон.gif"></center> 
			<center>Тут текст бла-бла-бла-бла</center>' 
			*clr 
			$image[rand(0,8)]
			! открываем действие "встать" внутри действия "встать"
			ACT 'Встать':
				GT 'Комната ГГ'
			! закрываем действие "встать" последнее
			END
		! закрываем действие "встать" первое
		end
	! закрываем условие
	END 
! закрываем действие "спать"
end
! открываем действие "поваляться в кровати"
ACT 'Поваляться в кровати': 
    CLA 
    *CLR 
	$image[0]= '<center><img src="pict\gg\2кровать.jpg"></center> 
	<center>Тут текст бла-бла-бла-бла</center>' 
	$image[1]= '<center><img src="pict\gg\3кровать.jpg"></center> 
	<center>Тут текст бла-бла-бла-бла</center>' 
	$image[2]= '<center><img src="pict\gg\4кровать.jpg"></center> 
	<center>Тут текст бла-бла-бла-бла</center>' 
	$image[3]= '<center><img src="pict\gg\4кровать.jpg"></center> 
	<center>Тут текст бла-бла-бла-бла</center>' 
	*clr 
	$image[rand(0,3)] 
	'<center>Тут текст бла-бла-бла-бла</center>'
	! открываем действие "Встать с кровати" 
	ACT 'Встать с кровати': 
		CLA 
		gt 'Комната ГГ'
	! закрываем действие "Встать с кровати"
	END
! действие "поваляться в кровати" не закрыто. Поэтому "многострочные формы операторов должны завершаться словом end"

Спасибо огромное, и предыдущим собеседникам тоже спасибо)
Постараюсь найти время почитать последние сообщения этой темы. Как раз сегодня на работе сидел и думал как раз о том, что я не правильно указал конец операторов, и поэтому программа путается, теперь буду аккуратнее писать, хотя за раз как я понимаю этому не научиться)
Документацию я читал, но я не могу взять и сходу написать код без ошибок, раньше никакие языки не изучал, но вот кстати очень нравится, хоть и уходит на одну ошибку до целых суток)
Спасибо еще раз за решение уже моей второй проблемы, иногда просто не понимаешь что делаешь и как :)

Никак не могу понять как передать номер нпс (num) в модуль олегуса для меню

$areaNPC=''
as=arrsize('$loc_<<X[you]>>_<<Y[you]>>_<<Z[you]>>') 
temp_i=0
view
:mark_loc
dynamic 'num=$loc_<<X[you]>>_<<Y[you]>>_<<Z[you]>>[temp_i]'

	 if num!you and dead[num]=0 and num>0 and invisible[num]=0:
	 $status[num]=''
         if mobtipe[num]=1:
             if agression[num]=0:
			 statusrand=rand(1,4)
				 if statusrand=1:$status[num]='скалит зубы'
				 if statusrand=2:$status[num]='рычит'
				 if statusrand=3:$status[num]='угрожающе скалится'
				 if statusrand=4:$status[num]='гавкает'
				 
				 agrorand=rand(1,100)
				 if agrorand>=90:
				 agression[num]=1
				 end
             else
             energy[you]+=atk[num]
             $status[num]='кусает вас'
             end
         end
         
         gs'Menu.Create','NPCmainMenu'
         gs'Menu.Add','NPCmainMenu','Посмотреть','','MainMenuLoc','see','<<num>>'
	     gs'Menu.Add','NPCmainMenu','Ударить','','MainMenuLoc','slap','<<num>>'
	     if wand[you]>0:gs'Menu.Add','NPCmainMenu','Колдовать','','MainMenuLoc','wand','<<num>>'
         
         $areaNPC+=" <a href='exec: gs""Menu.Call"",""NPCmainMenu""'><<$name[num]>></b> <<$status[num]>></a>" 
		 $areaNPC += "<br>"
	 end
temp_i+=1
if temp_i<=as:jump'mark_loc'
$areaNPC

Все время передается номер последнего нпс, а не того которого нужно.

По-хорошему, надо было бы представить только проблемную часть кода, а не всю простыню. Я не претендую на ответ, но, возможно, дело в том, что в dynamic(в том виде, как записали его вы) подвыражения вычисляются передего выполнением. Так сказать, один раз и навсегда. Этого можно избежать, заключив динамический код в фигурные скобки.

$My_dynamic = {
    num=$loc_<<X[you]>>_<<Y[you]>>_<<Z[you]>>[temp_i]
}
:mark_loc 
    dynamic $My_dynamic
    !...
    temp_i+=1 
if temp_i<=as:jump'mark_loc'

Я не особо вникал в код (из-за его обширности), поэтому не могу гарантировать, что уловил суть проблемы.

Aleks Versus Moderator 18.12.2016 15:34 (9 years ago)

evp,
в фигурных скобках подвыражение не вычисляется.

DaGrozz,
дело в том, что ты создаёшь меню с именем ‘NPCmainMenu’, а если верить модулю Олегуса, он убивает предыдущее созданное меню с таким же именем. Или я чего не понимаю?

! # Menu.Create
if $ARGS[0]='': EXIT
!----------
$ARGS[0]='otg_Меню_'+$ARGS[0]
!----------
killvar '<<$ARGS[0]>>'
killvar '<<$ARGS[0]>>_Параметры'
killvar '<<$ARGS[0]>>_Выбрали'
killvar '<<$ARGS[0]>>_ВыбранныйПункт'
killvar '<<$ARGS[0]>>_Время'
killvar '<<$ARGS[0]>>_МодулиСобытий'

Поэтому, как я полагаю, ты создаёшь меню только для последнего NPC. Попробуй вместо

gs'Menu.Create','NPCmainMenu'

делать

gs'Menu.Create','NPCmainMenu<<num>>'

ну и далее.

Aleks Versus:

в фигурных скобках подвыражение не вычисляется

Все там вычисляется. Разница только в том, когдавычисляется. Если dynamicзадан текстом (кавычками), то выражения вычисляются в момент инициализации и не могут быть изменены в дальнейшем. Если dynamic задан фигурными скобками, то подвыражения вычисляются при каждом вызове динамического кода. В этом легко убедиться, запустив пример:

i = 0
$My_dynamic = "*nl '<<i>>'"
$My_dynamic_brace = {*nl "<<i>>"}
dynamic $My_dynamic
dynamic $My_dynamic_brace
*nl
i = 1
dynamic $My_dynamic
dynamic $My_dynamic_brace

Почувствуйте разницу. Кстати, в справке этот момент описан.

Другое дело, что проблема заключается не в этом и мой совет был ошибочным.

Aleks Versus Moderator 19.12.2016 14:57 (9 years ago)

evp,
я всё понимаю. Но вот это работать не будет:

evp:

$My_dynamic = { 
    num=$loc_<<X[you]>>_<<Y[you]>>_<<Z[you]>>[temp_i] 
}

Ах. Это - да. Не будет. Недосмотрел.

Давненько не брал я в руки шашки QSP. :) Вот и допускаю такие ляпы.

дело в том, что ты создаёшь меню с именем ‘NPCmainMenu’, а если верить модулю Олегуса, он убивает предыдущее созданное меню с таким же именем. Или я чего не понимаю?

Ну да именно так. Я нашел как исправить положение.
Нужно в ссылке на нпс выдавать gs на локацию где и создается меню, а номер нпс передавать через args
PS я как мог сократил код для наглядности. В реале он раз этак в 10ть больше, так как там расчет отображения статусов нпс и еще захватывает соседние локации.

Гуру qsp подскажите как сделать таблицу в главном окне?

Aleks Versus Moderator 25.12.2016 09:46 (9 years ago)

Darvin432,

! включаем режим распознавания html
usehtml=1
! выводим таблицу html
*p '<table border=1><tr><td>первая ячейка</td><td>вторая ячейка</td></tr></table>'

Между html-тегами не должно случаться переводов строки, символов пробелов и табуляции, ну и прочего.

Aleks Versus, Спасибо! А как эту таблицу сделать с фиксированными размерами? А то она варьируеться относитьельно размера названия ячейки
Да и ещё вопрос:
Есть команда по типа “go to” но что бы не прописывать локацию куда идти, а вjзвращаться на локацию откуда пришёл? Заранее спасибо

Aleks Versus Moderator 25.12.2016 11:20 (9 years ago)

Darvin432,
фиксированные размеры можно задавать атрибутом width. Ширина таблицы:

<table width=600>...

Ширина ячейки:

<td width=200>

Можно задавать относительные размеры. Растягиваем таблицу на ширину окна:

<table width=100%>...

Столбец в половину ширины таблицы:

<td width=50%>

Почитай здесь по тегам http://htmlbook.ru/html/table

Darvin432:

Есть команда по типа “go to” но что бы не прописывать локацию куда идти, а вjзвращаться на локацию откуда пришёл?

Есть решение для возврата на предыдущую локацию, но я не уверен, что оно подойдёт. Не совсем понимаю, что тебе нужно. Отдельной команды для возврата нет.

Всем привет. Возникла необходимость в том, чтобы Notepad распознавал синтаксис QSP - то есть вместо закорючек, было бы видно нормальны команды… Можно ли такое реализовать? И если да, то как? :)

Log in or Register to post comments.