RU

FAO по плееру QSP

Poganec37 #2231 01.09.2018 21:38 11 comments 7638 views

Здравствуйте всем. Я не новичок в программировании: язык хотя-бы Паскаль я знаю.
Я прочел мануал к программе, посмотрел уроки Нексуса. СПАСИБО большое. ДА: перетаскивать предметы, переименовывать персонажей из рандомных имен, вставлять картинки, менять тегами цвет текста.. Это я могу- понимаю.
И да, я примеры программ смотрел-видел. Спасибо, что разбираете и показваете.
Так вот вопрос-проблема именно в построении списков в плеере. Опять вернусь к теме с продажей животных.
В магазине купили животных- это действие на локации в МАГАЗИНЕ. А у нас же у фермера есть загоны, в которых надо сохранять животных хотя-бы по гендеру.
ЕСТЬ список- таблица на одной локации. Как перенести- скопировать или вставить её на другую локацию.
Но это надо делать проверку, например, по гендеру.
Да- динамические массивы. dynamic. Можно как-то вставить текстом.
Я вставил после покупки копировать массив в массив. Но у меня при переходе в локацию игра залипает.
файл с текстом локации прилогаю.voprosnik.txt

Poganec37:

Я не новичок в программировании

С этим я бы поспорил. Знать!=Уметь.

args[9]=args[9]

Что это?

args['race']=rand(0,1)
args['ver']=rand(20,50)
if args['ver']>=20 and args['ver']<=29:
args['variant']=0
elseif args['ver']>=37 and args['ver']<=50:
args['variant']=1
elseif args['ver']>=30 and args['ver']<=36:
args['variant']=2
end

Еще раз почитай что такое args.

! блок первого посещения
if $args[0]="":

Это блок любого посещения без аргументов. Блок первого посещения лучше через переменную делать.

Poganec37:

Так вот вопрос-проблема именно в построении списков в плеере.

Нет такого встроенного инструмента “работа со списками”. Списки ты сам задаешь в любом удобном для себя формате.

Poganec37:

ЕСТЬ список- таблица на одной локации. Как перенести- скопировать или вставить её на другую локацию.

Ничего не надо копировать\вставлять. Разделяй графику от данных.
Данные сохранены и не меняются, тебе просто нужно их вывести в двух разных местах. Тут даже dynamic не нужен.

Старые советы остаются в силе. Раздели на локации, станет гораздо проще. Дебагать тут нельзя, так что используй usercom или хотя-бы msg, p.
У меня локация грузится и работает, проверь переменные циклов, скорее всего бесконечный цикл где-то.

Aleks Versus Moderator 02.09.2018 07:33 (7 years ago)

Poganec37,
каждое животное в магазине — это запись в массивах под одним индексом:

! это не код, просто для наглядности
$Trace[0]='кошка' & $Tgender[0]='жен' & Tprice[0]=80 & $Tmark[0]='продано' & ! кошка за 80
$Trace[1]='кошка' & $Tgender[1]='муж' & Tprice[1]=170 & $Tmark[1]='' & ! кот за 170
$Trace[2]='кошка' & $Tgender[2]='дети' & Tprice[2]=120 & $Tmark[2]='' & ! котёнок за 120
$Trace[3]='собака' & $Tgender[3]='муж' & Tprice[3]=170 & $Tmark[3]='продано' & ! кобель за 170

В следующий раз, когда игрок приходит в магазин, будет сформирован новый список.

В момент покупки (где $args[0]=‘buy’) нужно данные из этих массивов переносить в массивы, которые отвечают за запись животных в магазине.

Покажу на примере денег.

Переменная money — это деньги в кошельке. Как положить деньги в банк? Заводим новую переменную money_bank. Теперь кладём 100 рублей в банк:

money=money-100 & ! вынули сто из кошелька
money_bank=money_bank+100 & ! положили сто в банк

Так же и с животными. Была кошка, которую купил игрок, она записана в виде данных под одним индексом в четыре массива:

! это не код, просто для наглядности
$Trace[0]='кошка' & $Tgender[0]='жен' & Tprice[0]=80 & $Tmark[0]='продано'

Во время покупки нужно вписать её в массивы, соответствующие ферме. Например:

if $ARGS[0]="buy":
! блок покупки
	if money>=Tprice[args[1]]:
		money=money-Tprice[args[1]]
		$Tmark[args[1]]="продано"
		! закидываем кошку на ферму
		$PhermRace[]=$Trace[args['i']]
		$PhermGender[]=$Tgender[args['i']]
		PhermPrice[]=Tprice[args['i']]
		! выводим на экран список магазина
		gs "магазин","print"
	else
		gs "магазин","print"
		*pl "У вас нет денег"
	end
end
Aleks Versus Moderator 02.09.2018 07:49 (7 years ago)

Engineer,

Engineer:

Код:
args[9]=args[9]
Что это?

это инициализация локальной переменной, чтобы данные из args[’i’] не затёрли скажем args[0]. Элементы массивов, которые индексируются текстом, на самом деле индексируются числами, текстовый индекс как бы привязывается к числовому. Поэтому если ты пишешь:

mass['index']=100
*pl mass[0]

На экран выводится не 0, а 100

Engineer:

Еще раз почитай что такое args.

что ты имел ввиду? :D Что args предназначен для передачи аргументов? Таки да. Но только args с нулевого по восьмой. Поэтому args[9] инициирован первой строкой. Поэтому можно использовать args как локальные переменные с любыми индексами в дальнейшем.

Если что, код написан мной в результате переработки кода Poganec37. Все косяки — мои.

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

Дело в том, что когда любой вид программирования доходит до массивов данных, то я начинаю тормозить в коде. И получаются ошибки. Заскок в данный момент был вот в чем: ARGS - локальная переменная, которая работает только на локации. А я думал, что массив, созданный через такую переменную, можно отображать на любой локации.
теперь я исправил код так: я вывел ПРИНТ-вывод на другую локацию. И теперь при обращении к ней в нужном месте печатается текст с наличием животных.
Например, при условии, что животное мужского пола- печатается в локации- клетки с мальчиками.

Спасибо за комментарий.

Aleks Versus:

это инициализация локальной переменной, чтобы данные из args[’i’] не затёрли скажем args[0]

Что-то я не понимаю. Когда ты попадаешь на локацию, все необходимые переменные с 0 по X (до 8) уже инициализированы, каким образом args[’i’] перезапишет их?

Aleks Versus:

что ты имел ввиду?

Поэтому можно использовать args как локальные переменные с любыми индексами в дальнейшем.

Как уже сказано выше, зачем использовать args, когда ему надо записать и использовать результат в других местах.

Aleks Versus:

Нужно знать геймдизайн и как оно работает в остальной игре, чтобы предложить адекватное решение.

Не надо знать геймдизайн, чтобы понять, что локальная переменная локации - худшее решение для записи о посещении этой локации.
Можно это сделать один раз, если ты на 100% уверен, что игрок попадет на локацию только из одного места. Там в переход засунуть аргумент, а после этого попадать на локацию без этого аргумента.
Использование обычной переменной объективно лучше, на что я и намекнул. А остальное уже сам.

print_jivotnyie_v_ferme.txt

magazin.txt
Пожалуйста, если я надоедаю, то простите меня.
Я сделал вывод на ферму.
На локации ферма смотрим клетки с животными: пусто. Теперь идём покупать в магазин. здесь список. Купить- продано. В списке-ферме должно отобразиться по гендерному признаку запись с животным.
1. я поставил проверку на пол. Получилось, что покупаем мужчину- в списке появляется не мужчина, а “дети” или женщины.
2. Если уйти из магазина, то можно посмотреть в клетки: получается случайно заполняется: или в мужской, или в женскй формируется список .

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

То, что Алексей Шпак(Нексус) делает видео по программе- большой плюс. Но иногда в ФАО к программе нет нормального объяснения. Конечно, ФАО- это не полноценный учебник. Но чем больше ковыряешься в программе, тем больше возникает вопросов.
ДА- я затестил “Создаём простую Систему Предметов на QSP”. Но это не то, что нужно.

Aleks Versus Moderator 02.09.2018 18:26 (7 years ago)

Engineer:

Что-то я не понимаю. Когда ты попадаешь на локацию, все необходимые переменные с 0 по X (до 8) уже инициализированы, каким образом args[’i’] перезапишет их?

Да, ты прав. Так оно и работает. Ничего не перезапишется.

Engineer:

Как уже сказано выше, зачем использовать args, когда ему надо записать и использовать результат в других местах.

Нет, из поставленной задачи я этого не увидел. К тому же используется только для локальных нужд.

Engineer:

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

Это не запись о посещении. Это запись о выполнении кода на момент входа. Если войти на локацию ещё раз, код сработает ещё раз. Именно так я и понял работу локации.

Ладно. Всё это оффтоп.

Poganec37:

Алексей Шпак(Нексус)

Poganec37,
я не Нексус. :D

А ошибка у тебя проста. Ты хотя может быть и проверяешь пол, но выводишь всё равно всех подряд.

*clr
		*pl "Список девочек "
		*p '<table  border="1" cellpadding="10">'
		args['i']=0
		:for_printWim
		! в следующей строке заменил название массива на правильное
		if args['i']<arrsize('$PhermRace'):
			! добавил действительно условие для проверки пола
			if $PhermGender[args['i']]='жен':
				*p '<tr>'
					*p '<th>'+args['i']+'</th>'
					*p '<th>'+$PhermRace[args['i']]+'</th>'
					*p '<th>'+$PhermGender[args['i']]+'</th>'
					*p '<th>'+PhermPrice[args['i']]+'</th>'
					*p '<th><font color="#BC8F8F">Преобретено</font></th>'
				*p '</tr>'
			end
			args['i']+=1
			jump 'for_printWim'
		end
		*pl '</table>'

Engineer тебе правильно говорит. Отдельно работа с данными, отдельно вывод на экран. Ты же мешаешь всё в одно, и путаешься. Ну, здесь правда отдельные локации для вывода. ) Это правильно.

Я разделил мальчиков и девочек. Да- работает код:
(if $PhermGender[args[’i’]]=‘муж’) - это вывод мальчико в таблицу мужской части.
(if $PhermGender[args[’i’]]<>’муж’) - это женская часть. НЕ РАВНО, т.к. надо, чтобы ДЕТИ жили с мамами.
вот.
Есть проблема: код делит по гендеру в клетки. Да- формируется список, все нормально.
Купили детей. - в списке женщины. Это же не верно.
Если, скажем, я сделаю 3 части, которые будут отдельно равны значению. То все будет в мужской части..

Aleks Versus Moderator 03.09.2018 05:25 (7 years ago)

Poganec37,
вывод - это вывод. Он ничего не означает. Ты просто отсеиваешь во время вывода по половому признаку и на экране отображается так, как ты хочешь. Но в переменных/массивах никак не записано, что одни животные — в одной клетке, другие — в другой.

Можешь сочетать условия, разве нет?

if $PhermGender[args['i']]='жен' or $PhermGender[args['i']]='дети':

Будут выводиться и девочки и дети.

1. Я попробовал делать код с if $PhermGender[args[’i’]]=‘жен’ or $PhermGender[args[’i’]]=‘дети’
если купить детей, а потом взрослых, то в списке-вольере женском появляются либо все дени, или все помечаются как женщины.
Ещё может сделаться так: купить мужчину- будет отображаться или ДЕТИ, или женщины.
2. Я разбил каждый гендер по локации и проверку на каждый гендер вывел отдельно.
Код проверки везде одинаковый, просто условия равенства по гендеру разные. Программа путает место вывода текста.
Можно это как-то пофиксить?

Aleks Versus Moderator 03.09.2018 15:36 (7 years ago)

Poganec37,
я внимательно посмотрел твой код. Снова напутано с данными. Не знаю, как ты это делаешь. Ещё раз.

1. Животные в магазине помещаются в массивы $Trace $Tgender Tprice $Tmark
2. Животные на ферме помещаются в массивы $PhermRace $PhermGender PhermPrice $PhermMark (в необходимости последнего массива я не уверен.
Массивы сами по себе означают разные места расположения животных: магазин или ферма, — но животное не записывается в массивы фермы под тем же индексом, под каким записано в массивы магазина. Поэтому вывод информации в магазине снова неверный.
3. Ни в одном из этих массивов нет информации, в какой конкретно клетке на ферме сидит животное.

Напишу на почту.

Log in or Register to post comments.