RU 📌 Pinned

Как сделать?

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

snail:

У тебя же ELSE стоит дальше слова END

не спорю. но END ставится если конструкция многострочная не только в ее конце.а у меня она многострочная. щас попробую
работает! странно. почему тогда первый пример работает? там же между IF и ELSE тоже END, и конструкция тоже многострочная…

IF вещи = 0: 
    "Телега подъехала прямо к входу в и девушка вместе со стариком быстро перенесла в нее свои немногочисленные вещи. После этого она попрощалась со старостой,  тот вскоре отправился на своей телеге обратно, и лишь скрип ее несмазанных осей еще долго был слышен среди деревьев…" 
    ACT "осмотреться": 
    вещи = 1 
    goto "Осмотр" 
    END 
ELSE: 
    ACT "в башню":goto "1_этаж" 
    ACT "в лабораторию":goto "лаборатория" 
    ACT "в деревню":goto "деревня" 
END

ой, кажется понял. вопрос снят.END сдвинут табом, как я мог забыть! но в неработающем примере я кажется его тоже табом сдвигал… или нет…

Edited at 01.05.2015 20:16 (10 years ago)

AleksGor:

Конкретно, когда используется $меню_Дневник[2]= “читать дальше:читать_2” и вызывается этот код:

Spoiler

IF читать=1: CLS
“текст текст текст”
act “задуматься”: goto “задуматься”
END
ELSE:”нужно заглянуть в начало дневника”

может, так нужно записать?

IF читать = 1:
    CLS
    "текст текст текст"
    ACT 'Задуматься':
        GT 'задуматься'
    END
ELSE
    'Нужно заглянуть в начало дневника.'
END
END

AleksGor,
таб тут вообще ни при чём. Он используется только для придания наглядности коду:

IF вещи = 0: 
    "Телега подъехала прямо к входу в и девушка вместе со стариком быстро перенесла в нее свои немногочисленные вещи. После этого она попрощалась со старостой,  тот вскоре отправился на своей телеге обратно, и лишь скрип ее несмазанных осей еще долго был слышен среди деревьев…" 
    ACT "осмотреться": 
        вещи = 1 
        goto "Осмотр" 
    END 
ELSE 
    ACT "в башню": goto "1_этаж" 
    ACT "в лабораторию": goto "лаборатория" 
    ACT "в деревню": goto "деревня" 
END

END используется не только в многострочных формах оператора IF, но и в многострочных формах оператора ACT.

AleksGor:

там же между IF и ELSE тоже END, и конструкция тоже многострочная…

Этот END как раз и соответствует действию ACT “осмотреться” в многострочной форме оператора ACT.

Lisichka,
ага, я разобрался, фишка была в том что бы END “закрывал” ТОЛЬКО ACT ‘Задуматься’: GT ‘задуматься’, если он многострочный, потому его нужно было сдвинуть. кстати у тебя в примере последний END не нужен. судя по всему кусп считает ELSE ‘Нужно заглянуть в начало дневника.’ однострочным вне зависимости от того перенесен ли текст на другую строку или нет. это видимо потому что там нет “операторов”, т.е. всяких там GOTO, ACT, и т.д.

snail:

таб тут вообще ни при чём. Он используется только для придания наглядности коду:

дык работает же. НЕ ПОНЯЛ!? щас вообще все работает!!!! не работало же, прибавляло текст…. это бреееед.
нет, не бред. кажется у меня ACT ‘Задуматься’: GOTO “задуматься” шел одной строкой, т.е. был однострочным и end там был не нужен, а я его влепил.
Спасибо, ребят. пойду отсыпаться, пока мозг не взорвался

Edited at 01.05.2015 21:08 (10 years ago)

AleksGor:

судя по всему кусп считает ELSE ‘Нужно заглянуть в начало дневника.’ однострочным

Ещё раз повторяю: ELSE — это не самостоятельный оператор. ELSE — это часть условного оператора IF.

snail:

ELSE — это часть условного оператора IF.

все, понял, спасибо. такие вот, мы - дикари от программирования :|

Ребят, всем привет! Я тут решил приобщиться к прекрасному, написал свой генератор предложения и обнаружил досадную ошибку.
Предложение состоит из четырёх частей, слова в каждую берутся случайным образом из четырёх массивов соответственно. Но иногда последний массив возвращает мне пустоту: это случается где-то в 2-3 предложениях из 15.
вот скрин:

почему так? можно ли пофиксить?

Не могу решить проблему с падежами, у меня в квесте есть битва бандитов против военных, а там просят ввести имя врага, ну я ввел: военные, а когда побеждаешь, там написано: вы победили Военные. Как сделать так, чтобы окончания были другими?

Millstream,

Хитрый Пряник:

Думаю, это сюда.
На дворе 21 век, когда роботы не то что разговаривают, а начинают выдвигать простейшие идеи. И на фоне этого почти нигде не наблюдается культуры интерфейсного языка в программах. И не только. Пресловутые «Уважаем(ый/ая)» повсеместно.

Короче, мой вклад в искоренение топорности робоязыка. Функция, выбирающая правильное склонение предмета, согласно количеству. Может добавлять эпитет, можно подтачивать напильником, как нравится. Файл:
duxlab.com/files/qsp/chisskl-1_5.zip

я там нихрена не понял. копируй duxlab.com/files/qsp/chisskl-1_5.zip в адресную строку браузера. мож. разберешся

Edited at 02.05.2015 11:50 (10 years ago)

Друзья, не пойму, как сделать магазин? Я знаю, там нужны переменные и т д, и использование предметов, однако я не понял, как поставить счетчик денег, чтобы их тратить

Ничего не понял

Millstream,
деньги можно сделать через переменную.
создаешь новую локацию и пишешь в окне доп описания:

деньги = 100

теперь можно их отнимать.
добавляешь действие “Купить булочку” и в окне действия пишешь:

if деньги > 24:
	addobj 'Булочка!'
	деньги = деньги - 25
    gt $curloc
else
	'А денег больше нет!'
end

здесь указано, что если значение переменной “деньги” больше 24, то добавить в инвентарь предмет “Булочка!”, если же денег не хватает, то не добавлять. С репутацией почти то же самое - через переменные.
А вообще, тут все прекрасно объяснено, кстати)

Спасибо, но в QGen у меня нет окна доп описания. Где оно?

Millstream,
я имела в виду окно “Выполнить при посещении”, которое справа находится.

Итак. Есть нпс, они передвигаются по карте. Игрок тоже передвигается по карте и все передвижения отслеживаются через координаты. x[индекс] y[индекс] z[индекс]. Сам индекс означает номер нпс, все массивы устроены таким образом что индекс и определяет нпс. Например $name[i]это имя нпс с индексом i. you это индекс который обозначает главного героя.

Есть массив areatipe[’<<X[you]>>,<<Y[you]>>’] если его значение больше 0 то этот массив пригоден для передвижения, например 1 это поле, 2 лес итд итп. Если значение равно 0, то это море и передвигаться по нему нельзя.

Огромная проблема даже не с отслеживанием нпс, а с тем ,что бы можно было составить список нпс на локации.
Вот например

Spoiler
$areaNPCsResult = ""
areaNPCsLoop_i = 1
:areaNPCsLoop
	
	 if X[areaNPCsLoop_i] = X[you] and Y[areaNPCsLoop_i] = Y[you] and Z[areaNPCsLoop_i] = Z[you] and areaNPCsLoop_i!you:
		 if npcIsDead[areaNPCsLoop_i] = 0 :
			$areaNPCsResult += "<br>"							
			$areaNPCsResult += "<a href='exec: gt""androidWithIndex"", <<areaNPCsLoop_i>>'><b><<$name[areaNPCsLoop_i]>></b></a>" 
		 end	
	 end
	
	areaNPCsLoop_i += 1	
if areaNPCsLoop_i < arrsize('X'): jump 'areaNPCsLoop'

if $areaNPCsResult!'':"Тут: <<$areaNPCsResult>>"

Этот код прогоняет в лоб всех нпс и выводит их на экран. Но этот способ не применим если нпс очень много например на моем компе 3500 нпс уже сильно тормозят комп. И самое главное, при использовании этого способа нпс слепые, совершенно не возможно никаким образом передать нпс список других нпс на локации. Если начать для каждого нпс прогонять весь список нпс что бы выяснить кто на локации то кусп зависает намертво. Но даже если обойти эту проблему, то это все равно не выход, так как нпс должны обрабатывать встречи не только в той локации где расположен игрок.

Я решил сделать какое то отслеживание в механизме передвижения. Вот сам механизм передвижения нпс.

Spoiler
if i>=total_npc:i = 1
poisk_error=0
:moveNPCsLoop
cikl_npc_max-=1

if npcIsDead[i] = 0 and i!you:
oldX[i]=X[i]
oldY[i]=Y[i]
oldZ[i]=Z[i]
:mark_terrain_end
napravlenie=rand(0,7)
     if napravlenie=0:
         if areatipe['<<X[i]>>,<<Y[i]+1>>']>0:
         !север
         X[i]=X[i]
         Y[i]=Y[i]+1
         else
         poisk_error+=1
			 if poisk_error<50:
			 jump'mark_terrain_end'
			 else
			 stop_move=1
			 end
         end
     end
     if napravlenie=1:
         if areatipe['<<X[i]-1>>,<<Y[i]>>']>0:
         !запад
         X[i]=X[i]-1
         Y[i]=Y[i]
         else
         poisk_error+=1
			 if poisk_error<50:
			 jump'mark_terrain_end'
			 else
			 stop_move=1
			 end
         end
     end
     if napravlenie=2:
         if areatipe['<<X[i]+1>>,<<Y[i]>>']>0:
         !восток
         X[i]=X[i]+1
         Y[i]=Y[i]
         else
         poisk_error+=1
			 if poisk_error<50:
			 jump'mark_terrain_end'
			 else
			 stop_move=1
			 end
         end
     end
     if napravlenie=3:
         if areatipe['<<X[i]>>,<<Y[i]-1>>']>0:
         !юг
         X[i]=X[i]
         Y[i]=Y[i]-1
         else
         poisk_error+=1
			 if poisk_error<50:
			 jump'mark_terrain_end'
			 else
			 stop_move=1
			 end
         end
     end
     if napravlenie=4:
         if areatipe['<<X[i]-1>>,<<Y[i]+1>>']>0:
         !северо запад
         X[i]=X[i]-1
         Y[i]=Y[i]+1
         else
         poisk_error+=1
			 if poisk_error<50:
			 jump'mark_terrain_end'
			 else
			 stop_move=1
			 end
         end
     end
     if napravlenie=5:
         if areatipe['<<X[i]+1>>,<<Y[i]+1>>']>0:
         !северо восток
         X[i]=X[i]+1
         Y[i]=Y[i]+1
         else
         poisk_error+=1
			 if poisk_error<50:
			 jump'mark_terrain_end'
			 else
			 stop_move=1
			 end
         end
     end
     if napravlenie=6:
         if areatipe['<<X[i]-1>>,<<Y[i]-1>>']>0:
         !юго запад
         X[i]=X[i]-1
         Y[i]=Y[i]-1
         else
         poisk_error+=1
			 if poisk_error<50:
			 jump'mark_terrain_end'
			 else
			 stop_move=1
			 end
         end
     end
     if napravlenie=7:
         if areatipe['<<X[i]+1>>,<<Y[i]-1>>']>0:
         !юго восток
         X[i]=X[i]+1
         Y[i]=Y[i]-1
         else
         poisk_error+=1
			 if poisk_error<50:
			 jump'mark_terrain_end'
			 else
			 stop_move=1
			 end
         end
     end
     dynamic $dy_main_move
end

if i < ARRSIZE('X') and cikl_npc_max>0: jump 'moveNPCsLoop'

Динамик dynamic $dy_main_move должен был по идее работать следующим образом. Добавлять нпс который переместился в массив на новой локации и удалять его со старой. Попробовал 2 версии, но получается какая то чушь.

Spoiler

1я версия

$dy_main_move={
if stop_move=0:
!удаление со старой локации
oldlocnpctime=locnpc['<<oldX[i]>>,<<oldY[i]>>,<<oldZ[i]>>']
locnpcnum['<<oldX[i]>>,<<oldY[i]>>,<<oldZ[i]>>,<<oldlocnpctime>>']=0
n=loknpcpor['<<oldX[i]>>,<<oldY[i]>>,<<oldZ[i]>>,<<oldlocnpctime>>']
t=locnpcnum['<<oldX[i]>>,<<oldY[i]>>,<<oldZ[i]>>,<<oldlocnpctime>>']
killvar 'loknpcpor',n
killvar 'locnpcnum',t
locnpc['<<oldX[i]>>,<<oldY[i]>>,<<oldZ[i]>>']-=1

!создание на новой локации
locnpc['<<X[i]>>,<<Y[i]>>,<<Z[i]>>']+=1
locnpctime=locnpc['<<X[i]>>,<<Y[i]>>,<<Z[i]>>']
loknpcpor['<<X[i]>>,<<Y[i]>>,<<Z[i]>>,<<locnpctime>>']=locnpctime
locnpcnum['<<X[i]>>,<<Y[i]>>,<<Z[i]>>,<<locnpctime>>']=i
else
stop_move=0
X[i]=oldX[i]
Y[i]=oldY[i]
Z[i]=oldZ[i]
end
}

И когда эта версия не сработала, то попробовал решить задачу в лоб.

$dy_main_move={
if stop_move=0:
!удаление со старой локации
oldlocnpctime=locnpc['<<oldX[i]>>,<<oldY[i]>>,<<oldZ[i]>>']
locnpcnum['<<oldX[i]>>,<<oldY[i]>>,<<oldZ[i]>>,<<oldlocnpctime>>']=0
loknpcpor['<<oldX[i]>>,<<oldY[i]>>,<<oldZ[i]>>,<<oldlocnpctime>>']=0
!создание на новой локации
locnpc['<<X[i]>>,<<Y[i]>>,<<Z[i]>>']+=1
locnpctime=locnpc['<<X[i]>>,<<Y[i]>>,<<Z[i]>>']
loknpcpor['<<X[i]>>,<<Y[i]>>,<<Z[i]>>,<<locnpctime>>']=locnpctime
locnpcnum['<<X[i]>>,<<Y[i]>>,<<Z[i]>>,<<locnpctime>>']=i
else
stop_move=0
X[i]=oldX[i]
Y[i]=oldY[i]
Z[i]=oldZ[i]
end
}

Отслеживал нпс кроме базового способа методом перебора еще так

Spoiler
$areaNPC=''
if locnpc['<<X[you]>>,<<Y[you]>>,<<Z[you]>>']>0:
loknpc_p=locnpc['<<X[you]>>,<<Y[you]>>,<<Z[you]>>']
cikl_lnp=loknpc_p
:markcikllnp
cikl_res=locnpcnum['<<X[you]>>,<<Y[you]>>,<<Z[you]>>,<<cikl_lnp>>']
			if $name[cikl_res]>0:$areaNPC += "<a href='exec: gt""androidWithIndex"", <<cikl_res>>'><b><<$name[cikl_res]>></b></a>
" 
cikl_lnp-=1
if cikl_lnp>0:jump'markcikllnp'
'<<$areaNPC>>'
end

И так

Spoiler
testcikl=0
i=0
$areaNPCs=''
cikl=locnpc['<<X[you]>>,<<Y[you]>>,<<Z[you]>>']
:mark_i
if locnpcnum['<<X[you]>>,<<Y[you]>>,<<Z[you]>>,<<i>>']>0:
is=locnpcnum['<<X[you]>>,<<Y[you]>>,<<Z[you]>>,<<i>>']
     if X[you]=X[is] and Y[you]=Y[is] and Z[you]=Z[is]:
	 $areaNPCs += "<br>"							
	 $areaNPCs += "<a href='exec: gt""androidWithIndex"", <<is>>'><b><<$name[is]>></b></a>" 
     end
end
i+=1
testcikl+=1
if i<cikl:jump'mark_i'
'<<$areaNPCs>>'
'<<testcikl>> прогонов'

И оба эти способы получились не очень. 1й способ очень часто либо не видит какого то нпс, либо видит нпс который уже давно ушел с локации. А второй способ не чуть не лучше решения в лоб, количество циклов в нем слишком велико, для того, что бы использовать его.

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

Вложил файл в котором и есть весь код ,если с объяснений не будет понятно.
igra.qsp

Log in or Register to post comments.