RU 📌 Pinned

Как сделать?

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

Белый Шарик #100 09.06.2015 06:03 (10 years ago)

Всем привет! Я новичек. Хочу делать свои игры на QSP

Первый вопросик - теоретический. Видел в ограничениях программы - использование не более 100 подключаемых файлов. Т.е. в каждой игре я смогу использовать, например 70 картинок и 30 звуков = 100 файлов, не более?

Второй вопросик практический. Задаю простейшее условие:
1 локация
showinput 0
tool1 = 0
tool1amount = 3
Действие: Переход в локацию 2
gt ’2’

2 локация
if tool1amount >= 1:
act ‘Take Tool 1’:
tool1 = tool1 + 1
addobj ‘Tool 1’
pl ‘Tool 1 taken’
end
end
gt $curloc

Запускаю тестовый прогон - нажимаю перейти в локацию 2 и программа вылетает. Показывает (см. картинку). Что не так?

Пока взрослые не видят…
1. Подключаемые файлы это те, что вызываются с команды ADDQST. Картинок хоть милльён можно…
2. Вместо “Действие: Переход в локацию 2”, наверное, написано так (?):
act ‘Переход в локацию 2’: gt ’2 локация’
3. Во второй локации gt $curloc унесён за условие, поэтому зацикливает и виснет. Сунь его выше END.

Белый Шарик #100 09.06.2015 06:37 (10 years ago)

О! Благодарю!!! Курлок все портил. )) Буду дальше грызть гранит науки ))))

Белый Шарик #100 09.06.2015 09:09 (10 years ago)

А вот еще появился вопросик. Как сделать, что бы однотипные предметы в инвентарь попадали не отдельными строками, а складывались в одну строку с указанием количества?

Инвентарь:
Гвоздь 5
доска 10

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

Ссылка на FAQ
FAQ

Ccылка на считаемые предметы..
http://qsp.su/index.php?option=com_content&view=article&id=70:qsp-inventory-advanced-lib-076&catid=36:2009-02-19-06-11-21&Itemid=76

$COUNTER = ‘Локация-счетчик’
Код на локации ‘Локация-счетчик’ выполняется сам, постоянно, через заданные промежутки времени (2 раза в секунду, по умолчанию).
Туда можно время засунуть, ну и много чего ещё…
$ONNEWLOC = ‘Проверка’
Код на локации ‘Проверка’ выполняется каждый раз при переходе на новую локацию, аналогично конструкции:
gs ‘Проверка’
Удобно, чтобы не прописывать gs на каждой локации.

Белый Шарик #100 09.06.2015 10:58 (10 years ago)

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

“Ccылка на считаемые предметы..
http://qsp.su/index.php?option=com_cont … ;Itemid=76 ” - в примере кода по ссылке для меня темный лес ))))

Белый Шарик

Можно сделать проще:

Создаешь предмет, к примеру «Ресурсы», пишешь там:

clr
pl 'Доски <<dosky>> шт.'
pl 'Гвозди <<gvozdy>> шт.'

При нажатии на этот предмет в окно дополнительного описания будет выводится информации о количестве предметов. В начале прописываешь стартовое количество этих предметов:
dosky = 0
gvozdy = 0

А дальше в действиях где изменяется это количество предметов пишешь к примеру:

Получение предмета.

Act 'Купить доски' :
  dosky = dosky + 5
End

Трата предметов.

Act 'Построить скамейку' :
  if gvozdy<10 or dosky<20 :
    *pl 'Недостаточно ресурсов'
  else
    dosky = dosky - 10
    gvozdy = gvozdy - 20
    *pl 'Вы построили скамейку.'
  End
End

BiK,
Это же про массивы…

Белый Шарик,
http://qsp.su/index.php?option=com_content&task=view&id=59&Itemid=56&limitstart=6
А это про считаемые предметы в инвентаре.
Вообще-то, лучше весь учебник пройти сначала, от начала и до конца…
P.S. Не совсем то, что надо, но пройти всё равно полезно.
Смысл считаемых объектов в совмещении знаний о массивах и условиях,

act 'Взять яблоко':
 яблоко += 1
 кол_во_яблок += 1
 delobj $Яблоки_в_инвентаре
 IF яблоко >= 1:
	IF кол_во_яблок = 1: $apple = 'о'
	IF кол_во_яблок > 1 and кол_во_яблок < 5: $apple = 'а'
	IF кол_во_яблок >= 5: $apple = ''
	$Яблоки_в_инвентаре = '<<кол_во_яблок>>' + ' яблок' + '<<$apple>>'
	add obj $Яблоки_в_инвентаре 
END
END

Не слишком правильно, но смысл должен быть понятен. DEL OBJ делаем, чтобы инвентарь обновлялся каждый раз… Как-то так.
P.P.S. Обновил код, чтоб склонялось правильнее…

UPD #3 - С отниманием яблок…

Spoiler
act 'Взять яблоко':
 яблоко += 1
 кол_во_яблок += 1
 delobj $Яблоки_в_инвентаре
 IF яблоко >= 1:
	IF кол_во_яблок = 1: $apple = 'о'
	IF кол_во_яблок > 1 and кол_во_яблок < 5: $apple = 'а'
	IF кол_во_яблок >= 5: $apple = ''
	$Яблоки_в_инвентаре = '<<кол_во_яблок>>' + ' яблок' + '<<$apple>>'
	add obj $Яблоки_в_инвентаре 
	gt $curloc
END
END

If яблоко > 0:
	act 'Съесть яблочко':
		яблоко -= 1
		кол_во_яблок -= 1
		delobj $Яблоки_в_инвентаре
		IF яблоко >= 1:
			IF кол_во_яблок = 1: $apple = 'о'
			IF кол_во_яблок > 1 and кол_во_яблок < 5: $apple = 'а'
			IF кол_во_яблок >= 5: $apple = ''
			$Яблоки_в_инвентаре = '<<кол_во_яблок>>' + ' яблок' + '<<$apple>>'
			add obj $Яблоки_в_инвентаре 
			gt $curloc
		ELSE
			!Чтобы не съесть больше чем есть...
			gt $curloc
		END
	END
END

UPD # 4. Переменная Яблоко не очень-то и нужна тут. Проверку можно делать только по кол_во_яблок. Это по инерции получилось - я ж не специалист. Щас специалисты придут и сделают мне “ататат”…

Белый Шарик #100 10.06.2015 06:57 (10 years ago)

Урааа! Спасибо, svandrus, получилось! Ток я без наворотов со склонениями.

act ‘купить гвозди’:
delobj $гвозди_инвентарь
гвозди += 1
$гвозди_инвентарь = ‘гвозди ’ + гвозди + ’ шт’
clr
addobj $гвозди_инвентарь
gt $curloc
end
if гвозди > 0:
act ‘продать гвозди’:
delobj $гвозди_инвентарь
гвозди -= 1
$гвозди_инвентарь = ‘гвозди ’ + гвозди + ’ шт’
addobj $гвозди_инвентарь
gt $curloc
end
else pl ‘Нет гвоздей в наличи’
gt $curloc
end

Представляю масштабы, если придется допустим для 100 объектов подобные блоки писать.

У меня опять несколько вопросиков:
1) А разъясните пжл популярно, зачем необходимы массивы? Я так понял это те же переменные, только объединенные по какому-то признаку с присвоением единого имени и индексов. В чем полезность использования массивов вместо простых переменных?

2) В некоторых кодах встречал следующую строку delact $selact
Насколько я понимаю эта строка удаляет последнее выбранное действие из списка доступных действий? Нет?

3) Подскажите какой-нибудь хелп, не слишком заумный, по оформлению внешнего вида игры. Шрифты, цвета, расположение текстов на экране.

Белый Шарик,
Есть у меня такой хепл. Давай почту - скину.
2) да
1) Те же гвозди, как рекомендовал BiK можно накапливать не в инвентаре, а в массивах, да ещё и рассортировать их по толщине, длине и остроте… И хранить там же и умножать на что-нибудь… Это касательно твоего замечания о 100 типах объектов в инвентаре…
P.S. Как-то неправильно у тебя сделано. Если гвозди = 0, до должно зацикливать и зацикливает, если сделать так:

...
else 
	pl 'Нет гвоздей в наличи' 
	gt $curloc    
end

Разнеся ELSE и PL на разные строки. Плюс, однажды купив гвозди они будут в инвентаре всё время, т.е. будет гвозди 0 шт.
Чтобы от этого избавиться хвост должен быть так:

else 
	pl 'Нет гвоздей в наличии' 
	delobj $гвозди_инвентарь
end

Моя очередь спрашивать. Подскажите, пожалуйста, игру, в которой реализованы многомерные массивы.
И, чисто теоретический вопрос - скольки-мерные массивы можно пользовать в QSP?

Aleks Versus Moderator 10.06.2015 09:55 (10 years ago)

svandrus,
многомерных массивов, как таковых, в QSP нет. Есть разные ухищрения организации “многомерности” через текстовые индексы, через динамическое создание переменных, через формулы, вычисляющие “координаты” ячейки по её номеру.
Подробнее о массивах
В игре “Серафим” были двумерные массивы, но я её что-то не нашёл в каталоге.

Aleks Versus,
В Вики расписано про создание двумерного массива, да и тут где-то видел дискуссию на тему многомерностей, вот и спросил. С поиском у меня плохо.
Хочется сделать карточную игру, но через двумерный массив [x_y], где х - значение карты, а у - масть… В обучалках есть BJ, но там не так как мне хочется сделано.
UPD. Вот-вот, эту тему я и помнил, спасибо. Только там не то, чтобы пример практического применения. Да и про предельность сказано, что может быть и больше, чем 2 измерения. Вот можно, допустим три? На большее, я как-то не рассчитываю, маловато фантазиии, но вот три? Вроде координаты в пространстве - долгота, широта и высота над горизонтом? Три разных к одной точке я могу, а вот три в одном?

Aleks Versus Moderator 10.06.2015 10:54 (10 years ago)

svandrus,
проще всего тебе сейчас сделать через текстовые индексы. Хотьсколькимерное пространство.
$пространство[X] или $пространство[’<<X>>’] - одномерное
$пространство[’<<X>>,<<Y>>’] - двумерное
$пространство[’<<X>>,<<Y>>,<<Z>>’] - трёхмерное
и т.д.

добавлено:

$карта['тройка_треф']='в руке'

типа того?
тогда
$карта[’<<$X>>_<<$Y>>’]

svandrus,
честно говоря я не очень понимаю зачем тебе в карточной игре духмерный массив - карты можно просто всквозную пронумеровать и работать с обычными цифрами

а пример работы с двумерными массивами можно посмотреть еще в Сапере, хотя код там наверное на самый простой для понимания новичку

Log in or Register to post comments.