Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему  
Старый 18.03.2016, 01:01
a7s1h1 вне форума Посмотреть профиль Отправить личное сообщение для a7s1h1 Найти все сообщения от a7s1h1
  № 11  
Ответить с цитированием
a7s1h1

Регистрация: Oct 2013
Сообщений: 126
Цитата:
Сообщение от Wolsh Посмотреть сообщение
если Вы будете брать из мешка всего шесть чисел, включая ноли, то "ненолей" больше шести никак и не получится. Берете шесть чисел из мешка, а ПОТОМ вставляете еще два ноля в рандомные индексы от 2 до 7 (чтобы не касались нолей по краям массива).
Во время перебора ячеек в цикле приходится проверять предыдущие, из-за чего ячейки проверяются по-очереди. С таким подходом приходится брать из мешка все 8, т.к. если брать 6, то два нуля окажутся с краю.
Что, если сделать так: после того, как массив сформирован, пройтись по нему ещё раз, посчитать нули и, если их окажется меньше, чем нужно, заменить нулями произвольные цифры в массиве?

По остальным замечаниям исправляю

UPD: А, понял, как сделать, сейчас поменяю

Добавлено через 1 час 1 минуту
Большое спасибо, всё работает! Получилось вот что:
Код AS3:
// максимальная цифра
			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.
Создать новую тему   Часовой пояс GMT +4, время: 08:30.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 08:30.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.