RU 📌 Pinned

Как сделать?

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

Aleks Versus Moderator 06.06.2013 14:32 (12 years ago)

Anakox,
похоже твой первый вопрос был неправильно понят. Я тоже подумал, что ты говоришь действительно о том, как сделать дробные числа. А ты оказывается спрашивал о том, как отсчитывать доли. Но я так и не понял, зачем это нужно, - ты не пояснил. Только что в игре день состоит из 1440 минут, а действия могут прерываться… ммм…
То есть к примеру:
энергия растёт 1 ед в час, действие занимает 1584 минуты, что составляет 26 целых часов и 24 минуты сверху.
ты хочешь узнать сколько это будет энергии (0,41666666666666…), чтобы не потерять это значение и приплюсовать его позже? Правильно я понимаю?

Aleks Versus Moderator 06.06.2013 14:51 (12 years ago)

По последнему вопросу: возможно тебе нужно это https://qsp.org/forum/62-vzmoznosti-pomogite-razobratsa

Aleks Versus, вроде так, как ты описал. Напишу что у меня происходит: персонажу нужно прочитать книгу. При чтении растут навыки. Всю книгу можно прочитать за сутки и игрок сам выбирает сколько времени ему читать, 5 минут или 2 часа. Один из навыков растёт со скоростью 1 ед. в 20 минут. Надо, чтобы игрок мог читать произвольное количество времени, а прогресс не терялся. Так со всеми событиями в игре. В моём случае в действии “чтение книги” нужно просто вписать set h_m = 20 и сослаться на локацию-обработчик.

Всё, последний вопрос отпадает, нашел решение.

Aleks Versus Moderator 06.06.2013 17:45 (12 years ago)

Anakox,
у меня перемещения по миру происходят с учётом времени, некоторые действия тоже как бы отнимают время. Но я не храню доли статов, я считаю сколько прошло времени. Скажем восполнение здоровья 3 единицы в час. Если было затрачено всего 20 минут, восполнение просто не происходит. Если же было затрачено 80 минут, восполняется три единицы и 20 минут сохраняются в остаток, чтобы не потерять. Когда проходит ещё сорок минут, набирается час и вновь происходит восполнение. Однако твой способ мне больше нравится.

Друзья, вот я, допустим, хочу сделать карту местности, задаваемую массивом данных. При этом хочется, чтобы создавать карту я мог без напряга, просто расставляя циферки.
Чтобы в редакторе карта имела какой-то вид типа такого:
00110002000
00220110200
00003033011
И игра считывала эти данные в массив.
Как можно подобное реализовать?

я не совсем давно делал такой функционал

Spoiler
#read_map
$args[0] = trim($args[0])
killvar '$tmp_array'
killvar '$tmp_lines'
:loop
	pos = strpos($args[0], '(\r)?\n')
	if pos <= 0:
		$tmp_str = $args[0]
		if $tmp_str <> '':
			$tmp_lines[] = $tmp_str
		end
	else
		$tmp_str = $mid($args[0], 1, pos-1)
		if $tmp_str <> '':
			$tmp_lines[] = $tmp_str
		end
		$args[0] = $mid($args[0], pos+1)
		jump('loop')
	end
	
_tmp_len = arrsize('$tmp_lines')
_i = 0

:loop_i
	_j_len = len($tmp_lines[_i])
	_j = 1
	:loop_j
		$tmp_array['<<_i>>_<<_j-1>>'] = $mid($tmp_lines[_i], _j, 1)
		_j += 1
	if _j <= _j_len: jump('loop_j')
	''
	_i += 1
if _i < _tmp_len: jump('loop_i')
copyarr $arg[1], '$tmp_array'
-

лока принимает на входе строку с данными и название массива для записи (многомерный массив эмулируется через строки вида ’0_0’, ’0_1’ и тд)
пример использования

$map = '
00110002000
00220110200
00003033011
'
gs 'read_map', $map, '$map_array'

werewolf, Спасибо! Буду разбираться.

Здравствуйте.
Я вот немного разобрался в том, чтобы делать меню для предметов - как-то “осмотреть”, “использовать”, “выбросить” - но не понял, как сделать так, чтобы меню появлялось при нажатии какой-либо строчки в тексте. Это при помощи HTML, да?

Prophet,
да.

! в первой локации:
USEHTML = 1

! в локации с меню:
'<a href="EXEC:MENU ''$Моё_крутое_меню''">вызвать меню</a>'

Нужно внимательно следить за экранированием кавычек и апострофов.

Nex,
Благодарю.

Подскажите как сделать такую ерунду.
Допустим у меня есть 3 переменных (А,В,С)в которых сохранены разные числа. Их значение я не знаю, но хочу отобразить их в порядке убывания

'1. <<first>>'
'2. <<second>>'
'3. <<third>>'

Рассчитывать в лоб даже эти три значения это нагородить огород из if, а если их не 3, а 10 или 20.
Каким образом можно решить такую задачу?

Farfignugen,
для начала тебе нужно изучить циклы и массивы.

Потом:

1. Заполняешь массив значениями в любом порядке.

2. Используешь любой алгоритм сортировки чтобы отсортировать массив, например “сортировку пузырьком”.

3. Выводишь уже отсортированный массив.

Nex:

Farfignugen,
для начала тебе нужно изучить циклы и массивы.

Потом:

1. Заполняешь массив значениями в любом порядке.

2. Используешь любой алгоритм сортировки чтобы отсортировать массив, например “сортировку пузырьком”.

3. Выводишь уже отсортированный массив.

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

!первая локация
a=RAND(1,100)
b=RAND(1,100)
c=RAND(1,100)
mas[0]=a
mas[1]=b
mas[2]=c
perebor=3
numa=0
numb=0
numc=0
!локация расчета
:loop
     if perebor=1:
     perebor=0
         if numa=0:
         tmas[2]=mas[0]
         end
         if numb=0:
         tmas[2]=mas[1]
         end
         if numc=0:
         tmas[2]=mas[2]
         end
     end
     if perebor=2:
     perebor=1
         if numa=1:
             if mas[1]>mas[2]:tmas[1]=mas[1]&numb=1&jump'loop'
             if mas[2]>mas[1]:tmas[1]=mas[2]&numc=1&jump'loop'
         end
         if numb=1:
             if mas[0]>mas[2]:tmas[1]=mas[0]&numa=1&jump'loop'
             if mas[2]>mas[2]:tmas[1]=mas[2]&numc=1&jump'loop'
         end
         if numc=1:
             if mas[0]>mas[1]:tmas[1]=mas[0]&numa=1&jump'loop'
             if mas[1]>mas[0]:tmas[1]=mas[1]&numb=1&jump'loop'
         end

     end
     if perebor=3:
     perebor=2
     tmas[0]=max (mas[0],mas[1], mas[2])
     if tmas[0]=mas[0]:numa=1
     if tmas[0]=mas[1]:numb=1
     if tmas[0]=mas[2]:numc=1
     end

if perebor>0:jump'loop'
numa=0
numb=0
numc=0
perebor=3

'<<mas[0]>> <<mas[1]>> <<mas[2]>>'
'1. <<tmas[0]>>'
'2. <<tmas[1]>>'
'3. <<tmas[2]>>'

Вот с массивами накидал. Но это же громоздко.

В своем примере ты делаешь сортировку в лоб - прямым перебором, при этом размер массива зашит
но если использовать сортировку пузырьком, упомянутую Нексом, то можно сделать универсальную локу, которая сможет сортировать массивы любого размера
вот пример реализации

Spoiler
#sort
copyarr 'tmparr', $args[0]

J = 0
N = ARRSIZE('tmparr')
:for_j
    F = 0
    M = J
    I=J
    :for_i
        IF tmparr[I]>tmparr[I+1]:
			_tmp = tmparr[I]
			tmparr[I] = tmparr[I+1]
			tmparr[I+1] = _tmp
			F=1
		end
		IF tmparr[I]<tmparr[M]: M=I
        I += 1
    if I < N-J-1: jump('for_i')
    IF F=0: jump('exit_for')
    IF M <> J:
		_tmp = tmparr[J]
		tmparr[J] = tmparr[M]
		tmparr[M] = _tmp
	end
    J += 1
if J < N: jump('for_j')
:exit_for
copyarr $args[0], 'tmparr'
-

в локу первым параметром надо передавать название массива, который надо отсортировать

mas[] = RAND(1,100)
mas[] = RAND(1,100)
mas[] = RAND(1,100)
copyarr 'tmas', 'mas'
gs 'sort', 'tmas'
'<<mas[0]>> <<mas[1]>> <<mas[2]>>'
'1. <<tmas[0]>>'
'2. <<tmas[1]>>'
'3. <<tmas[2]>>'

Спасибо. Действительно работает, только почему то сортирует в другом направлении, от минимума к максимуму.

Log in or Register to post comments.