RU 📌 Pinned

Как сделать?

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

newsash,

Огромнейшее спасибо! Считаю минутки до окончания рабочего дня, чтобы попробовать способ =)

newsash:

P.S. А вообще Аэрой уже мало кто пользуется, вместо неё теперь Навигатор.

Ох уж эта эра ИТ, не успеваешь к одному привыкнуть, как это уже безнадежно устарело)

И вообще, я правильно понимаю, что Навигатор только для Андроид и iOS?

Aleks Versus Moderator 04.10.2014 05:59 (11 years ago)

Jolly Roger:

В чем моя ошибка?

werewolf:

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

очевидно моя ошибка))) прошу прощения. Проверил наспех, и вот что получилось.

Объясните, пожалуйста, нубу, как правильно сделать:

Spoiler

Есть массив:
$апельсин_имя[0] = ‘’
апельсин_вес[0] = 0
$апельсин_имя[1] = ‘красный’
апельсин_вес[1] = 100
$апельсин_имя[2] = ‘желтый’
апельсин_вес[2] = 75

Мне нужно:
Чтобы все значения этого массива только с индексом [1] (то есть и имя, и вес) скопировались в другой массив, допустим, “склад” которого пока нет. Как этот массив-приемник правильно назвать? И куда его поместить? На какую локацию? Как его проиндексировать? Чтобы было вот так:
$склад_имя[1] = ‘красный’
склад_вес[1] = 100
Это вроде делается COPYARR ‘a’,’b’ но не понятно, как правильно задавать имена передатчика и приемника в случае разнородных элементов, как в моем примере. Заранее спасибо.

Jolly Roger,

$склад[] = 1

IF ARRSIZE('$склад') > 0:
    'Список предметов на складе:'
    i = 0
    :loop

    номер_предмета = $склад[i]
    '-----'
    'Предмет: <<$апельсин_имя[номер_предмета]>>'
    'Вес: <<апельсин_вес[номер_предмета]>>'

    i = i + 1
    IF i < ARRSIZE('$склад'):
        JUMP 'loop'
    END
ELSE
    'На складе пусто.'
END

Jolly Roger,
Локация ‘copy_arrs’

dynamic '
if args[1] = 0:
  args[1] = arrsize(<<$args[1]>>)
else
  args[1] = min( args[0] + args[1], arrsize(<<$args[1]>>) )
end
:loop
  $<<$args[0]>>_имя[] = $<<$args[1]>>_имя[args[0]]
  <<$args[0]>>_вес[] = <<$args[1]>>_вес[args[0]]
  args[0] += 1
if args[0] < args[1]: jump "loop"', args[2], args[3]

Использование:

gs 'copy_arrs', 'склад', 'апельсин', 1, 1

P.S. Если таких параметров как ‘имя’ и ‘вес’ на самом деле много, то лучше использовать многомерный массив, а не несколько массивов.

Aleks Versus Moderator 06.10.2014 19:20 (11 years ago)

Jolly Roger,
“апельсины - склад” - это конкретная задача, или абстрактная? Если ты пытаешься генерировать базы для разных местоположений объектов, то такой подход не рационален. Когда создана общая база для всех объектов, нет нужды перетаскивать значения из одного массива в другой, если ты хочешь изменить местоположение объекта. Может, конечно, я неправильно представляю, что ты пытаешься сделать, а может и правильно (это наработки по моему движку).

Aleks Versus:

“апельсины - склад” - это конкретная задача, или абстрактная? Если ты пытаешься генерировать базы для разных местоположений объектов, то такой подход не рационален. Когда создана общая база для всех объектов, нет нужды перетаскивать значения из одного массива в другой, если ты хочешь изменить местоположение объекта. Может, конечно, я неправильно представляю, что ты пытаешься сделать, а может и правильно (это наработки по моему движку).

Пока конкретная - я пытаюсь сделать что-то вроде сундука, чтоб туда положить, а потом забрать. Или передать одному объекту свойства другого, чтобы манипулировать этим объектом без риска изменить начальные параметры элементов массива. Но в перспективе и абстрактная, по мере роста опыта.

Aleks Versus Moderator 07.10.2014 10:36 (11 years ago)

Jolly Roger:

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

Вот про это я и говорю. По ссылке в предыдущем сообщении можно посмотреть мои наработки в этом направлении. В грубом виде я уже показывал тебе где-то выше, как может выглядеть база (таблица) объектов, но идентификация в той базе была, прямо скажем, ущербная. Лучше всего использовать отдельный массив, куда помещается уникальный идентификатор на каждый объект.

Spoiler

В двух словах, как “помещать” один объект в другой:
У каждого объекта есть идентификатор, т.е. помимо

$object_name[N]='Апельсины'
$object_type[N]='еда, ингредиент'
object_weight[N]=35
object_kolvo[N]=5
...и т.д.

должен быть ещё массив

$object_id[N]='bErTui'

который хранит уникальные идентификаторы объектов. У меня идентификаторы генерируются случайным образом каждый раз, когда создаётся новый объект. Не менее восьми символов (букв и цифр) - и вероятность совпадения двух идентификаторов близка к нулю. И есть ещё один массив:

$object_position[N]='Crkfldl'

В этот массив помещается идентификатор того объекта, в котором хранится текущий объект.
Пример для объектов Склад и Апельсины:

$object_name[N]='Апельсины'
$object_type[N]='еда, ингредиент'
object_weight[N]=35
object_kolvo[N]=5
$object_id[N]='Food:bErTui'
$object_position[N]='Chest:Crkfldl'

$object_name[M]='Склад'
$object_type[M]='хранилище, сундук'
object_weight[M]=0
object_kolvo[M]=0
$object_id[M]='Chest:Crkfldl'
$object_position[M]=''

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

Есть недостаток у подобных “упрощений” - приходится долго и упорно работать над кодом.

А в QSP есть возможность сделать цвет фона и шрифта самой игры один, а цвет MSG-окошка - другим?

RomaDova:

А в QSP есть возможность сделать цвет фона и шрифта самой игры один, а цвет MSG-окошка - другим?

В классическом плеере - нет.

В индексе массива можно использовать переменные. Можно ли их использовать в самом значении массива? Типа:
$moveph[1] = $enemy+’ медленно приближается к вам, набирая +’+addmove+’ к ходу.’
У меня не получается.

Engineer,
тебе нужно, чтобы переменные вычислялись на момент “извлечения” элемента массива?
Это можно сделать с помощью динамического кода

$moveph[1] = {$enemy+' медленно приближается к вам, набирая +'+addmove+' к ходу.' }
$enemy = 'Враг'
addmove = 5
DYNEVAL($moveph[1])

Небольшое уточнение:

$moveph[1] = {$result = $enemy+' медленно приближается к вам, набирая +'+addmove+' к ходу.' } 
$enemy = 'Враг' 
addmove = 5 
DYNEVAL($moveph[1])

newsash,
зачем? Не нужно никаких RESULT.

DYNEVAL вычисляет выражение. Поэтому достаточно передать в него выражение таким, какое оно есть. Ничего лишнего придумывать не надо.

Когда использую DYNEVAL между строками огромное расстояние. Когда добавляю $result - расстояние становится меньше, но не пропадает.

Все, исправил. Проблема в коде была. За подсказку спасибо.

Log in or Register to post comments.