|
|
|||||
Регистрация: Oct 2013
Сообщений: 126
|
Цитата:
Что, если сделать так: после того, как массив сформирован, пройтись по нему ещё раз, посчитать нули и, если их окажется меньше, чем нужно, заменить нулями произвольные цифры в массиве? По остальным замечаниям исправляю UPD: А, понял, как сделать, сейчас поменяю Добавлено через 1 час 1 минуту Большое спасибо, всё работает! Получилось вот что: // максимальная цифра var max_level:uint=MyMath.randomRange(0,9); // вектор для вычислений из 8 ячеек (крайние останутся нулями, а ещё 2 ноля добавим потом) var temp_vector:Vector.<uint> = new < uint > [0,0,0,0,0,0,0,0]; // если максимальная цифра = 0, то ничего не проверяем if (max_level > 0) { // создаём мешок с цифрами, откуда будем их тянуть (rjkbxtcndj одинаковых цифр в мешке означает их максимально допустимое количество в итоговом массиве) var bag:Vector.<uint> = new <uint>[0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,5,5,5,6,6,6,7,7,8,8,9]; var max_bag_index:uint; // максимальный индекс в мешке // количество элементов мешка, которое мы будем проверять, зависит от максимальной цифры switch (max_level) { case 1: max_bag_index = 9; break; // 1 не более 4 [0,0,0,0,0,0,1,1,1,1] case 2: max_bag_index = 13; break; // 2 не более 4 case 3: max_bag_index = 17; break; // 3 не более 4 case 4: max_bag_index = 20; break; // 4 не более 3 case 5: max_bag_index = 23; break; // 5 не более 3 case 6: max_bag_index = 26; break; // 6 не более 3 case 7: max_bag_index = 28; break; // 7 не более 2 case 8: max_bag_index = 30; break; // 8 не более 2 case 9: max_bag_index = 31; break; // 9 не более 1 } var testee:uint=0; // проверяемая цифра var previous1:uint = 0; // предыдущая цифра var previous2:uint = 0; // препредыдущая цифра var tvl:int = temp_vector.length; // длина временного вектора для ссылки в цикле // перебор каждой ячейки, кроме первой (0) и последней(7) (получается 6) for (var i:int = 1; i < tvl - 1; i++) { var ind:uint = MyMath.randomRange(0, max_bag_index); // выбираем случайную ячейку мешка testee = bag[ind]; // переносим цифру из случайной ячейки мешка в переменную для проверки // если выбранное число совпадает с предыдущим while (testee == previous1) { // если при этом совпадает ещё и с предпредыдущим - ищем в мешке другое число, пока не найдём такое, которое повторяло бы одновременно 2 предыдущих цифры if (testee == previous2) { ind = MyMath.randomRange(0, max_bag_index); // повторяем вытягивание цифры из мешка testee = bag[ind] } else { break } } // найдя подходящую цифру, заносим её в соответствую ячейку вектора , записываем предыдущие цифры и удаляем выбранную из мешка temp_vector[i] = testee; // найдя подходящую цифру, заносим её в соответствую ячейку вектора previous2 = previous1; // записываем предыдущие цифры previous1 = testee; bag.splice(ind, 1); // удаляем из мешка ячейку, из которой вытянули подходящую цифру max_bag_index--; // уменьшаем максимальный индекс мешка, чтобы не залезть в его лишние цифры, которые идут дальше } } // получился массив из 8 ячеек, крайние равны 0 // добавляем 2 нуля в произвольные места массива, кроме крайних ячеек. Итого у нас в 10 ячейках 4 нуля (2 по краям, 2 в произвольных местах). Остальные цифры - случайные (в т.ч. могут быть нули) temp_vector.splice(MyMath.randomRange(1, temp_vector.length - 2), 0, 0) temp_vector.splice(MyMath.randomRange(1,temp_vector.length-2),0,0) trace('temp_vector='+temp_vector) Последний раз редактировалось a7s1h1; 18.03.2016 в 01:15. |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
var max_bag_index:uint; — должен быть инт, так как подвергается декременту в теле цикла.
var bag:Vector.<uint> — по сути константа, надо объявить и инициализировать один раз, чтобы не тратить драгоценные пикосекунды. while (testee == previous1) { if (testee == previous2) { — чтобы не делать if на каждом витке while, можно заключить while в условие if (previous1 == previous2). Это состояние неизменно и определяет необходимость проверки testee вообще — если два предыдущих не равны, то пофиг чему равен testee.
__________________
Reality.getBounds(this); |
|
|||||
Добавлю к предыдущему своему комментарию в другой теме: необходимо ознакомиться с конвенциями именований AS3. В данном случае неверно записаны имена у локальных переменных. А еще советую польоваться автореформатом кода в той IDE, где Вы пишете код (если это не FlashIDE, конечно).
__________________
тут я |
|
|||||
Регистрация: Oct 2013
Сообщений: 126
|
Цитата:
Цитата:
Код пишу во FlashDevelop. "Автореформат" - это Refactor-Code Formatter? Он мне всё по абзацам разбил - теперь всё выглядит предельно наглядно, но очень непривычно (например, я привык фигурные скобки ставить не на следующей строке, а сразу после условия/функции - это разве плохо?) Последний раз редактировалось a7s1h1; 18.03.2016 в 11:22. |
|
|||||
Цитата:
В as3 принято использовать верблюжий регистр (camel case). То есть вместо max_bag_index, нужно писать maxBagIndex Локальные переменные начинаются с маленькой буквы. Публичные переменные тоже, а приватные начинаются с андерскора _
__________________
Ко мне можно и нужно обращаться на ты) |
|
|||||
Регистрация: Oct 2013
Сообщений: 126
|
И правда... Спасибо большое, исправил
|
|
|||||
Цитата:
__________________
тут я |
|
|||||
Регистрация: Oct 2013
Сообщений: 126
|
Цитата:
|
|
|||||
По ссылке выше написано почти все неверно. https://sourceforge.net/adobe/flexsd...20Conventions/
__________________
тут я |
|
|||||
Цитата:
Если уж не читая конвенции делать, но стоило бы посмотреть на то, как пишут сами адобовцы. п.с. Кстати, названия интерфейсов в виде прилагательных (оканчивающихся на able) принято в Java, но не в as3. А переменные через андерскор пишут где-нибудь в php. Цитата:
__________________
Ко мне можно и нужно обращаться на ты) |
Часовой пояс GMT +4, время: 04:54. |
|
« Предыдущая тема | Следующая тема » |
|
|