RU 📌 Pinned

Как сделать?

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

а, это я пропустил, что тебе нужен был обратный порядок сортировки
для изменения направления нужно в 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
Aleks Versus Moderator 05.07.2013 07:01 (12 years ago)

Farfignugen:

И в итоге надо получить что бы бойцы сортировались по рейтингу и им присваивались в массив места и все это отображалось как то так.

Как я понял, тебе нужно отсортировать один массив, а позже перетасовать другие массивы соответственно первому. Для этого я специально писал две функции:

Spoiler
! array.sort
$args[0] = $args[0] & ! название сортируемого массива. Может сортировать как текстовые значения, так и числовые
$args[1] = $args[1] & ! параметр, который указывает в какую сторону сортируется массив. 'up' или '' - значения будут располагаться от большего к меньшему 'down' - значения будут располагаться от меньшего к большему.
$args[2] = $replace($args[2],'$') & ! имя массива, в который будут помещены номера элементов исходного массива в порядке сортировки
if $args[3]='': $args[3] = $args[0] & ! имя массива, в который будут помещены результаты сортировки. Т.е. отсортированные значения можно поместить в другой массив, не трогая исходный. Если не указать, результат сортировки будет помещён в исходный массив.
killvar 'easy_math_sort_array'
killvar 'easy_math_copy_array'
if instr($args[0],'$')=1: $args['$']='$' else $args['$']=''
copyarr $args['$']+'easy_math_copy_array',$args[0]
if $args[2]!'':
	args['i']=0
	:for
	if args['i']<arrsize($args['$']+'easy_math_copy_array'):
		easy_math_sort_array[args['i']]=args['i']
		args['i']+=1
		jump 'for'
	end
end
args['i'] = 0
:prohody
if args['i']<arrsize($args['$']+'easy_math_copy_array'):
	args['j']=args['i']
	:sorting
	if args['j']<arrsize($args['$']+'easy_math_copy_array'):
		dynamic "if (<<$args['$']>>easy_math_copy_array[args[0]] < <<$args['$']>>easy_math_copy_array[args[1]] and ($args[2]='' or $args[2]='up')) or (<<$args['$']>>easy_math_copy_array[args[0]] > <<$args['$']>>easy_math_copy_array[args[1]] and $args[2]='down'):
			<<$args['$']>>args['tmp'] = <<$args['$']>>easy_math_copy_array[args[0]]
			<<$args['$']>>easy_math_copy_array[args[0]] = <<$args['$']>>easy_math_copy_array[args[1]]
			<<$args['$']>>easy_math_copy_array[args[1]] = <<$args['$']>>args['tmp']
			if $args[3]!'':
				args['temp'] = easy_math_sort_array[args[0]]
				easy_math_sort_array[args[0]] = easy_math_sort_array[args[1]]
				easy_math_sort_array[args[1]] = args['temp']
			end
		end",args['i'],args['j'],$args[1],$args[2]
		args['j']+=1
		jump 'sorting'
	end
	args['i']+=1
	jump 'prohody'
end
if $args[2]!'': copyarr $args[2],'easy_math_sort_array'
copyarr $args[3],$args['$']+'easy_math_copy_array'
killvar 'easy_math_sort_array'
killvar $args['$']+'easy_math_copy_array'

Не смотри, что громоздко, это только на первый взгляд. На самом деле код, выполняющий сортировку не такой уж и большой. В основном, перед ним, и после, находятся разные проверки и защита от дурака. Следующая программа, используя результаты из первой, переставит элементы других массивов на новые “правильные” места:

Spoiler
! array.retape
$args[0] = $args[0] & ! массив, элементы которого нужно перетасовать
$args[1] = $replace($args[1],'$') & ! массив, в который внесены номера элементов отсортированного массива (в его изначальном варианте) в порядке сортировки.
if $args[2] = '': $args[2] = $args[0] & ! имя массива, в который можно сохранить результат перетасовки. Можно не указывать, тогда результаты сохранятся в исходный массив.
killvar 'easy_math_sort_array'
killvar $args['$']+'easy_math_copy_array'
if instr($args[0],'$')=1: $args['$']='$' else $args['$']=''
copyarr 'easy_math_sort_array',$args[1]
args['i']=0
:for
if args['i'] < arrsize('easy_math_sort_array'):
	dynamic $args['$']+"easy_math_copy_array[args[0]] = "+$args[0]+"[args[1]]",args['i'],easy_math_sort_array[args['i']]
	args['i']+=1
	jump 'for'
end
copyarr $args[2],$args['$']+"easy_math_copy_array"

Теперь для наглядности, пример:

Spoiler
reit[0]=15
reit[1]=10
reit[2]=25
$arm[0]='might'
$arm[1]='sparrow'
$arm[2]='hand'
pow[0]=333
pow[1]=444
pow[2]=55

gs 'array.sort','reit','down','res_array'
! {результат получится такой:
reit[0]=10
reit[1]=15
reit[2]=25
res_array[0]=1
res_array[1]=0
res_array[2]=2
! переставляем элементы в других массивах:}
gs 'array.retape','$arm','res_array'
gs 'array.retape','pow','res_array'
! {результат:
$arm[0]='sparrow'
$arm[1]='might'
$arm[2]='hand'
pow[0]=444
pow[1]=333
pow[2]=55
! res_array теперь можно уничтожить}
killvar 'res_array'

Т.е. был у нас герой с рейтингом 10, и стоял он на второй строчке хитпарада, владел оружием ‘sparrow’ и силой 444, мы переместили его на верхнюю строчку и он сохранил за собой и “оружие” и “силу”. :)

Nex,
Спасибо, я попробую так сделать…
А переменная мне нужна была, что бы сделать предмет численным, как тут быть тогда?

В запасе имеется <<mistloot>> шт.

Log in or Register to post comments.