RU 📌 Pinned

Как сделать?

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

Stag_Beetle:

Столкнулся с небольшой проблемой, в чем соль разобрался, но осталось странное ощущение.

При работе с массивами следует учитывать ещё несколько нюансов:

  1. Удаления элемента массива по строковому индексу нет (в официальной библиотеке). Но есть способ это обойти.
  2. Если в заполненном ненулевыми значениями массиве попробовать найти 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:

Я для определения индексов второй массив сделал

Уверен есть более простые пути. С какой целью тебе понадобилась такая конструкция?

Aleks Versus Moderator 08.11.2013 13:57 (12 years ago)

Stag_Beetle:

Они не нужны, на самом деле.

На самом деле нужны. На самом деле с ними гораздо проще, чем с текстовыми. Например, когда нужна таблица данных (база данных, если хочешь). Индексировать строки таблицы текстовыми значениями? Постоянное преобразование текст-число-текст? Нет, спасибо.

Stag_Beetle:

возможность выбрасывания предметов из инвентаря в на любую локацию и последующее их поднятие, по необходимости

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

Stag_Beetle:

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

Технически это так, но если абстрагироваться от технической части, то решений уйма. Ведь что такое по сути массив? Это таблица. В одном, двух, трёх … N измерениях. Можно построить таблицу из нескольких массивов, можно индексировать ячейки через имена переменных, и ещё много чего можно, вплоть до простройки таблицы в одной единственной переменной (QSP это позволяет. 2Гб текста, кто-то говорил. Для таблицы более, чем достаточно).

Короче, “практика, практика, и ещё раз практика”. Как везде.

Ребята, как сделать действие с 2 условиями?

Aleks Versus Moderator 09.11.2013 18:12 (12 years ago)

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

act 'действие':
if a=1 and b=2:
! выполняем код
end
end
Aleks Versus Moderator 09.11.2013 18:14 (12 years ago)

Если же действие, которое в зависимости от выполнения определённого условия даёт определённый результат, то так:

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

##text##

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 разработчика. Я вот её в первый раз вижу… :/

Log in or Register to post comments.