Как сделать?
…
Stag_Beetle:
Столкнулся с небольшой проблемой, в чем соль разобрался, но осталось странное ощущение.
При работе с массивами следует учитывать ещё несколько нюансов:
- Удаления элемента массива по строковому индексу нет (в официальной библиотеке). Но есть способ это обойти.
- Если в заполненном ненулевыми значениями массиве попробовать найти 0, то функция arrpos вернёт значение, равное размеру массива + 1.
Обсуждение этих нюансов велось тут.
Ну мне, наверное, удалять то ничего и не надо из массивов. Они (по большой части) статичные, вбиваю туда данные к которым будет обращаться игра. Данные в одну сторону, процедуры над ними - в другую (за редким исключением), мне так удобнее. Вообще я массивы смотреть начал для того, чтобы сделать возможность выбрасывания предметов из инвентаря в на любую локацию и последующее их поднятие, по необходимости (не знаю зачем, я пока с кодом балуюсь, о чем игра даже не думал пока. м.б. и не буду ее делать вообще). В итоге так запарился с этими ошибками, что сделал это вообще без массивов, в одной расчленяемой строке. А так… выход простой - вообще не использовать в массивах фиолетовые (числовые значения) для индексов. Они не нужны, на самом деле. То есть вообще. Эти глюки с рандомным переписыванием данных (причем в некоторых случаях цифровые данные у меня вроде бы даже переписывались из числовых значений массива в строковые и наоборот 0_0) просто не стоят того чтобы с ними возиться. Да и многомерные массивы только строками задаются, в любом случае. Лучше просто расставить кавычки и не париться. А arrpos я что-то не понял как работает. В инструкции сказано что третий аргумент - это *значения*, а не выражения. Если выражения он не принимает, то какой от него вообще толк? Или это инструкция кривая? Я для определения индексов второй массив сделал. Например, в первом $a[’1’]=‘слово’, во втором записано $b[’слово’]=‘1’ и т.д.
Stag_Beetle:
Эти глюки с рандомным переписыванием данных
Оно не рандомное. Запись элемента с текстовым индексом добавляет элемент в конец массива и привязывает текстовый индекс к нему.
killvar 'a'
a[0] = 1
a['a'] = 2 равносильно a[1] = 2
$a['b'] = '1' равносильно $a[2] = '1'
a['c'] = 5 равносильно a[3] = 5
$a['a'] = 'a' равносильно $a[1] = 'a'
При удалении элемента строковые индексы сдвигаются так, чтобы соответствие не терялось.
Stag_Beetle:
arrpos я что-то не понял как работает
У меня проверка заняла две минуты, одну из которых я искал у себя на компе QGen. Всё работает с выражениями. Я бы даже сказал, что вообще все операторы и функции работают с аргументами-выражениями. То, что автор справки где-то пользовался термином “выражение”, а где-то писал по смыслу, мне тоже не нравится. Я бы вообще по минимуму использовал слово “выражение” в справке.
Stag_Beetle:
Я для определения индексов второй массив сделал
Уверен есть более простые пути. С какой целью тебе понадобилась такая конструкция?
Stag_Beetle:
Они не нужны, на самом деле.
На самом деле нужны. На самом деле с ними гораздо проще, чем с текстовыми. Например, когда нужна таблица данных (база данных, если хочешь). Индексировать строки таблицы текстовыми значениями? Постоянное преобразование текст-число-текст? Нет, спасибо.
Stag_Beetle:
возможность выбрасывания предметов из инвентаря в на любую локацию и последующее их поднятие, по необходимости
Это делается очень просто. До того просто, что подобная организация предметов работает не только с локациями, но и с сумками, и вложением предметов одного в другой, причём уровни вложений могут быть бесконечными. Причём достаточно всего двух одномерных массивов.
Stag_Beetle:
Да и многомерные массивы только строками задаются, в любом случае.
Технически это так, но если абстрагироваться от технической части, то решений уйма. Ведь что такое по сути массив? Это таблица. В одном, двух, трёх … N измерениях. Можно построить таблицу из нескольких массивов, можно индексировать ячейки через имена переменных, и ещё много чего можно, вплоть до простройки таблицы в одной единственной переменной (QSP это позволяет. 2Гб текста, кто-то говорил. Для таблицы более, чем достаточно).
Короче, “практика, практика, и ещё раз практика”. Как везде.
Ребята, как сделать действие с 2 условиями?
Michail777,
не совсем ясно, что ты имеешь ввиду. Если проверить два значения при выборе действия, то можно так например:
act 'действие':
if a=1 and b=2:
! выполняем код
end
end
Если же действие, которое в зависимости от выполнения определённого условия даёт определённый результат, то так:
act 'действие':
if a=1:
! выполняем код №1
elseif a=2:
! выполняем код №2
end
end
Aleks Versus,
есть ещё вариант
IF a=1 OR b=2:
Всем доброго времени суток.
Подскажите новичку. Прочитал все уроки, посмотрел примеры кода, и решил изменить код боя. Хотел сделать систему, с ожиданием хода, чтобы время ожидания зависело от разных факторов, и чтобы у противника было свое время ожидания хода. У меня получается что локации не обрабатываются одновременно(это вообще возможно?)
Может кто уже делал подобное или знает как?
Вот код который я писал
*clr
'Здоровье <<$Имя>>: <<здоровье_героя>>'
'Здоровье <<$имя_врага>>: <<здоровье_врага>>'
gosub 'герой' & gosub 'противник'
код локации “герой”
if b < 3:
if a = 3:
act 'нанести удар':
атака_текущая = атака_героя+rand(0,3)
pl'Вы нанесли <<$имя_врага>> урон <<атака_текущая>>.'
здоровье_врага = здоровье_врага - атака_текущая
*clr
'Здоровье <<$Имя>>: <<здоровье_героя>>'
'Здоровье <<$имя_врага>>: <<здоровье_врага>>'
a = 0
if здоровье_врага<=0:
'Вы убили <<$имя_врага>>.'
delact $selact
act 'Далее':gt 'победа'
exit
end
gt curloc
end
else
wait 500
a = a + 1
gt curloc
end
end
код локации “противник”
if a < 3:
if b = 3:
атака_врага_текущая = атака_врага+rand(0,3)
pl'<<$имя_врага>> наносит урон <<атака_врага_текущая>>.'
здоровье_героя = здоровье_героя - атака_врага_текущая
*clr
'Здоровье <<$Имя>>: <<здоровье_героя>>'
'Здоровье <<$имя_врага>>: <<здоровье_врага>>'
b = 0
if здоровье_героя<=0:
'Вас убил <<$имя_врага>>.'
act 'Далее':gt 'поражение'
exit
gt curloc
end
else
wait 300
b = b + 1
gt curloc
end
end
SV_fep,
моё личное субъективное мнение - реалтайму нет места в текстовой игре. Поэтому ничего не порекомендую. Я готов терпеть только пошаговый бой.
Nex,
Ну это не совсем реалтайм. Это что-то в духе FF IX.
Просто стучать врага всегда первым тоже неинтересно, или бросать виртуальный кубик на первый ход.
SV_fep:
У меня получается что локации не обрабатываются одновременно(это вообще возможно?)
Локации даже в таком написании обрабатываются последовательно. Тебе нужно логику задержек держать в одной локации. Я так понял, что задержки должны работать независимо - тогда лучше исходить из минимального дискрета времени, например:
wait 100
a += 1
b += 1
if a = a_n:
gs 'герой'
a = 0
end
if b = b_n:
gs 'противник'
b = 0
end
gt $curloc
Задержки регулируются с помощью a_n и b_n.
Теперь замечания:
- Длинные неинтерактивные бои раздражают. Т.е. либо нужно делать бодренько и зрелищно, либо интерактив, либо просчитывать бой без реальных задержек.
- a, b, a_n, b_n в данном случае неподходящие названия, лучше придумать нормальное имя типа “счётчик_хода_героя”
SV_fep,
для того чтобы “не стучать врага первым”, в пошаговых боях уже давно придумали десятки решений. Для этого вовсе не обязательно вводить реалтайм.
Боевые системы обсуждались во многих темах, ссылки собраны здесь: https://qsp.org/forum/436-koncepcia-mehaniki-dla-tekstovo-takticeskogo-slesera
newsash,
А можно разжевать для непонятливых, что такое а+=1 и а_n ?
SV_fep:
newsash,
А можно разжевать для непонятливых, что такое а+=1 и а_n ?
a+=1 - это a=a+1
a_n - эквивалент задержки, количество дискретов времени между вызовами процедуры (обработками локации) ‘герой’
wait 100 - дискрет времени 100 миллисекунд
Кстати, странно, что эта тема про боевые системы до сих пор не в FAQ разработчика. Я вот её в первый раз вижу… :/