Как сделать?
…
В своем примере ты делаешь сортировку в лоб - прямым перебором, при этом размер массива зашит
но если использовать сортировку пузырьком, упомянутую Нексом, то можно сделать универсальную локу, которая сможет сортировать массивы любого размера
вот пример реализации
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]>>'
Спасибо. Действительно работает, только почему то сортирует в другом направлении, от минимума к максимуму.
а, это я пропустил, что тебе нужен был обратный порядок сортировки
для изменения направления нужно в 2 местах заменить сравнение на обратное
строку
IF tmparr[I]>tmparr[I+1]:
заменить на
IF tmparr[I]<tmparr[I+1]:
а строку
IF tmparr[I]<tmparr[M]: M=I
на
IF tmparr[I]>tmparr[M]: M=I
Огромное спасибо. Это было даже не обязательно, я же мог в статистике изменить расположение массивов. Но теперь хотя бы буду знать.
Бился бился, нет, мне такой способ сортировки не подходит.
$name[0]='Имя Игрока'
$name[1]='Михаил Петров'
$name[2]='Петр Сидоров'
id[0]=1
id[1]=2
id[2]=3
reit[0]=RAND(1,100)
reit[1]=RAND(1,100)
reit[2]=RAND(1,100)
win[0]=RAND(0,30)
win[1]=RAND(0,30)
win[2]=RAND(0,30)
loss[0]=RAND(0,5)
loss[1]=RAND(0,15)
loss[2]=RAND(0,30)
draw[0]=RAND(0,1)
draw[1]=RAND(0,3)
draw[2]=RAND(0,10)
wko[0]=(win[0]*75)/100
wko[1]=(win[1]*60)/100
wko[2]=(win[2]*50)/100
fig[0]=win[0]+loss[0]+draw[0]
fig[1]=win[1]+loss[1]+draw[1]
fig[2]=win[2]+loss[2]+draw[2]
mesto[0]=0
mesto[1]=0
mesto[2]=0
$text[0]=mesto[0]+" место "+$name[0]+" рейтинг "+reit[0]+" провел "+fig[0]+" боев, из ниx победил "+win[0]+" проиграл "+loss[0]+" ничьих "+draw[0]+" побед Нокаутом "+wko[0]+" ID бойца "+id[0]
$text[1]=mesto[1]+" место "+$name[1]+" рейтинг "+reit[1]+" провел "+fig[1]+" боев, из ниx победил "+win[1]+" проиграл "+loss[1]+" ничьих "+draw[1]+" побед Нокаутом "+wko[1]+" ID бойца "+id[1]
$text[2]=mesto[2]+" место "+$name[2]+" рейтинг "+reit[2]+" провел "+fig[2]+" боев, из ниx победил "+win[2]+" проиграл "+loss[2]+" ничьих "+draw[2]+" побед Нокаутом "+wko[2]+" ID бойца "+id[2]
И в итоге надо получить что бы бойцы сортировались по рейтингу и им присваивались в массив места и все это отображалось как то так.
'<<$itext[0]>>'
'<<$itext[1]>>'
'<<$itext[2]>>'
где $itext[0]= массиву $text с самым большим рейтингом то есть массивом reit
Что бы я мог сделать в описании ссылку, в которой будут присвоены бойцу параметры. Но предыдущий метод просто создает еще один массив с распределенными значениями не затрагивая массив из которого эти значения были взяты.
Мне же нужно хранить данные массива в текстовом массиве и распределять эти массивы между собой по величине параметра рейтинг. Иначе я не смогу ни статистику вести бойцов, не вызывать нужные параметры.
Общий смысл всей этой затеи в том, что бы создать энное количество бойцов, например 100, с параметрами. Они автоматом бились бы друг с другом по очереди и распределялись по рейтингу. Игрок тоже мог участвовать в этом и вести своего бойца к титулу. С боевкой и прочим я справлюсь, но совсем застрял на этом вот распределении по рейтингу. Мне нужно что бы на экране были строчки в которых написаны бойцы, от чемпиона и далее. Строчки сделать через хтмл с возможностью вызова меню, когда выбираешь противника, то боевке присваивались параметры противника, дальше бой и новое перераспределение. Поэтому мне кровь из носу нужно не терять значения из массива $text, а отслеживать его от и до.
Хм… Не знаю, может быть это тебе предлагали, но я бы использовал такой способ:
1. Просто “вставляешь” (копируешь значение массива) всех бойцов в так сказать свою “таблицу” рейтинга:
$itext[1]= $text[1]
$itext[2]= $text[2]...
...и так далее
Можешь циклом воспользоваться
2. Потом тоже самое можешь сделать и с рейтингом, скопируя его в массив например reit_result (это нужно для того чтобы каждый боец потом имел действительно свой рейтинг)
3. Дальше вставляешь вот такой вот непонятный код:
i=1
:cycle2
j=i
:cycle3
if reit_result[i]<reit_result[j]:
$a=$itext[i]
b=reit_result[i]
$itext[i]=$itext[j]
reit_result[i]=reit_result[j]
$itext[j]=$a
reit_result[j]=b
end
if j<10:
j=j+1
jump'cycle3'
end
*pl'<<$itext[i]>> - его рейтинг: <<reit_result[i]>>'
if i<10:
i=i+1
jump'cycle2'
end
Я не очень могу объяснить что как тут работает, но принцип в том, чтобы сравнивать каждого последующего бойца с другими, находить самого “крутого” из них и ставить его на первое (и последующие) место в самой таблице, путем присваивания (где же я таких слов понабрался :) ) другим случайным переменным его значение (имя и рейтинг). Ну короче, я сам запутался пока объяснял, но если будут вопросы, постараюсь помочь :=D.
Можно ли в Аэре разместить текст (ну или картинку) по центру, по вертикальной оси? Пробовал через html (делал таблицу со значением style=“vertical-align: middle;”), однако ничего не получилось. Может я что-нибудь не так делаю? И еще прошу не предлагать смещать основное окно описания, так как у меня есть заголовок на верху. Заранее спасибки
AKA,
AeroQSP не поддерживает некоторые свойства CSS. К сожалению выравнивание по вертикали - одна из самых проблемных тем в вёрстке даже там где все свойства поддерживаются. Нормальных способов сделать это нет, везде используются костыли разной степени сложности. Понятно, что в AeroQSP они не работают.
AKA AeroQSP должен поддерживать вертикальное выравнивание.
“vertical-align: middle;” нужно прописывать для ячейки таблицы, при этом высоту ячейки можно указать принудительно (в случае, если в других ячейках строки таблицы нет элементов).
Byte, может быть мои руки не достаточно прямые, или я просто не совсем тебя понял, но код *pl ‘<table width=“100%” height=“100%”><tr width=“100%” height=“100%” style=“vertical-align: middle;”><td width=“100%” height=“100%” style=“vertical-align: middle;”>Тут должен быть текст</td></tr></table>’ приводит к появлению текста вверху :(
Farfignugen:
И в итоге надо получить что бы бойцы сортировались по рейтингу и им присваивались в массив места и все это отображалось как то так.
Мне же нужно хранить данные массива в текстовом массиве и распределять эти массивы между собой по величине параметра рейтинг. Иначе я не смогу ни статистику вести бойцов, не вызывать нужные параметры.
Возможно тебе поможет модуль работы с таблицами данных. Я обновил версию, там как раз есть команда сортировки таблицы по нескольким колонкам.
AKA, высоту таблицы/ячейки нужно указывать явно, в пикселях. По идее, достаточно так:
<table><tr><td height=“300” style=“vertical-align: middle;”>Тут должен быть текст</td></tr></table>
Если не заработает, то можно попробовать указать ширину ячейки в процентах: добавить к стилю “width:100%;”.
UPD: Кстати, height лучше указывать также стилем, а не отдельным атрибутом.
Byte,
Спасибо, все получилось (указал высоту и ширину стилем)
Выручайте: у меня тут вопрос встал:
IF astraluck = 1:
astraloot = rand (1, 25)
IF astraloot = 13:
msg "В результате Ваших действий ..."
mistloot = mistloot + 1
END
IF mistloot > 0 and no obj "Материя мироздания":
ADDOBJ "Материя мироздания"
END
По задумке я решил добавить предмет с вероятностью 1:25 в зависимости от выбранного действия.
Надеюсь я нигде не накосярякал? :)
THE FIEND,
шанс на выпадение считается правильно.
Но переменная mistloot не обнуляется, это приведёт к тому, что второй и все последующие разы выпадение будет с вероятностью 100%. Так как судя по коду эта переменная вообще лишняя, предлагаю сделать так:
IF astraluck = 1:
astraloot = rand(1, 25)
IF astraloot = 13:
MSG "В результате Ваших действий ..."
IF NO OBJ "Материя мироздания":
ADDOBJ "Материя мироздания"
END
END
END