Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Генерация блоков (https://javascript.ru/forum/misc/39692-generaciya-blokov.html)

IVAAAAN 08.07.2013 14:47

Генерация блоков
 
Вот я генерирую блоки так
var level, size;
		level = 1;
		
	for(var i = level;i<level+4;i++){
		$("#game_area").append('<div class="num'+i+'"><p  class="numValue'+i+'">'+rand(1,10)+'</p></div>');
		size = rand(50,100);
		margin = rand(1,120);
		marginLeft = rand(1, 300);
		
		$(".num" +i).css({
			'width':size,
			'height':size,
			'border-radius':size + 1,
			'margin-top':margin,
			'margin-left':marginLeft,
			'border':'1px solid #000',
			'text-align': 'center',
			'cursor': '	pointer'


		});

		$(".numValue").css({
			'padding':rand(50,100)/5

		});
	}

Но случается когда они вылазят за нужную мне область, этом случае #game_area, не могу никак рассчитать чтобы они не вылазили, помогите

skrudjmakdak 08.07.2013 14:48

где то я это уже видел)))

IVAAAAN 08.07.2013 14:51

Цитата:

Сообщение от skrudjmakdak (Сообщение 260979)
где то я это уже видел)))

вопрос другой

skrudjmakdak 08.07.2013 14:52

кстати, где сама функция rand, как вы ее описали.. покажите

IVAAAAN 08.07.2013 14:53

не понимаю зачем она вам, но вот
function rand(min, max){
   return Math.floor(Math.random() * (max - min + 1)) + min;
}

skrudjmakdak 08.07.2013 15:04

ну.. что можно сказать? как высчитать область?? это размер самого блока плюс его сдвиг, поэтому
максимальный размер блока у нас равен: 100 пикселей (плюс рамка, по 1-му пикселю с каждой из сторон) итого конечный максимальный размер блока МОЖЕТ составить 104px,
а максимальный сдвиг по оси:
Y: 120 пикселей
X: 300 пикселей

тогда рабочая область у нас должна быть:
x: 404px
y: 224px

IVAAAAN 08.07.2013 15:18

skrudjmakdak,
что-то как-то не ясно ничего :-?

skrudjmakdak 08.07.2013 15:22

какая у вас сейчас рабочая область?

IVAAAAN 08.07.2013 15:23

700x500px

skrudjmakdak 08.07.2013 15:25

ммм. а можно всю страничку показать, видимо я чего то недогоняю

IVAAAAN 08.07.2013 15:28

index.html:
<!DOCTYPE HTML>


<div id="game_area">

</div>


script.js:
function rand(min, max){
   return Math.floor(Math.random() * (max - min + 1)) + min;
}

function generate(){

		var level, size;
		level = 1;
		

	for(var i = level;i<level+level+1;i++){
		var num = rand(1,10);
		
		
		$("#game_area").append('<div class="num'+i+'"><p  class="numValue'+i+'">'+num+'</p></div>');
		
		size = rand(50,100);
		margin = rand(1,104);
		marginLeft = rand(1, 300);
		
		$(".num" +i).css({
			'width':size,
			'height':size,
			'border-radius':size + 1,
			'margin-top':margin,
			'margin-left':marginLeft,
			'border':'1px solid #000',
			'text-align': 'center',
			'cursor': '	pointer'


		});

		$(".numValue").css({
			'padding':rand(50,100)/5

		});
	}

}


css:
#game_area{
	width: 700px;
	height: 500px;
	border:1px solid #ccc;
	margin: 0 auto;
	margin-top: 5px;
}

ruslan_mart 08.07.2013 15:31

А где html, head, body, кодировка? :blink:

IVAAAAN 08.07.2013 15:32

Цитата:

Сообщение от Ruslan_xDD (Сообщение 261009)
А где html, head, body, кодировка? :blink:

все есть, просто сюда решил не скидовать, т.к оно вам думаю не надо, место будет занимать.

skrudjmakdak 08.07.2013 15:41

я раз 100 сгенерил, у меня все норм.. можете тогда скрин прислать??

IVAAAAN 08.07.2013 15:44

Цитата:

Сообщение от skrudjmakdak (Сообщение 261012)
я раз 100 сгенерил, у меня все норм.. можете тогда скрин прислать??

вы генерили только level 1? да, тогда генерятся только два блока, если level 10, то 10 блоков. тут и проблема

skrudjmakdak 08.07.2013 15:49

ааа. нудак конечно.. у вас позиционирование какое? статичное, разумеется будет в низ тянуть. делайте абсолютное, а game_area релативное

skrudjmakdak 08.07.2013 15:50

ну и соответственно не margin-left и margit-top использовать надо будет.. а top и left

IVAAAAN 08.07.2013 15:58

Цитата:

Сообщение от skrudjmakdak (Сообщение 261018)
ну и соответственно не margin-left и margit-top использовать надо будет.. а top и left

это я понял, но тогда есть шанс что они переплетутся. а точнее инфа 100%, они переплетутся

ruslan_mart 08.07.2013 16:01

IVAAAAN, или поставьте для gamearea overflow:hidden, тогда ничего вылазить не будет :D

IVAAAAN 08.07.2013 16:02

Цитата:

Сообщение от Ruslan_xDD (Сообщение 261024)
IVAAAAN, или поставьте для gamearea overflow:hidden, тогда ничего вылазить не будет :D

ага, и нужно мне кол-во блоков тоже тогда отображаться не будет

skrudjmakdak 08.07.2013 16:05

вы хотите реализовать такой алгоритм не парясь)) а так как вы хотите придется по парится.. либо заплатить за работу

skrudjmakdak 08.07.2013 16:06

либо ваш game_area не делать фиксированной высотой, а делать динамичным

IVAAAAN 08.07.2013 16:13

я же код не прошу, просто подскажите как вычислить можно))

skrudjmakdak 08.07.2013 16:19

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

IVAAAAN 08.07.2013 16:23

Цитата:

Сообщение от skrudjmakdak (Сообщение 261034)
да тут сразу в голову и не придет как это все реализовать. написать можно, но это все таки дело времени. и я думаю что за даром вам мало кто поможет.. может и найдутся добрые люди))

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

ruslan_mart 08.07.2013 16:26

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

skrudjmakdak 08.07.2013 16:27

ну это уже не равномерное распределение..

IVAAAAN 08.07.2013 19:51

function rand(min, max){
   return Math.floor(Math.random() * (max - min + 1)) + min;
}
function maxArray(array	){
	return Math.max.apply( Math, array );
}
function generate(){
	var size, margins, level; //размер блока с числом, отступы между блоками, уровень
	var margins = [];
		level=10; //уровень

	for(var i = level;i<level+level+1;i++){ //заносим сгенерированые отступы в массив
		margins.push(rand(1,300));
	}
	
	for(var i = 0; i<margins.length;i++){ //сравниваем дабы избежать пересечений
		if(maxArray(margins)==margins[0]){
		margins.reverse();
	}
	var m =maxArray(margins)-margins[i];

	if(m<=10){

		$("#debug").html('Результат: блоки пересекутся;<br>Максимальный отступ: '+maxArray(margins)+'; <br>Разница: '+m + '<br>Числа:' + margins);
		
	}
	else{
		size = rand(50,100);
		$("#game_area").append('<div class="num'+i+'">'+rand(1,10) + '</div>');
		$(".num"+i).css({
			'position':'absolute',
			'width': size,
			'height': size,
			'border-radius': size+1,
			'top':margins[rand(0, margins.length)],
			'left':margins[rand(0, margins.length)],
			'border':'1px solid #ccc'
		});
$("#debug").html('Результат: блоки не пересекутся;<br>Максимальный отступ: '+maxArray(margins)+'; <br>Разница: '+m + '<br>Числа:' + margins);
	}
		
		
	}
	
}


ну вот, что-то я наговнокодил, работает наполовину. т.е сравнение идет по left(x), т.е по координате x все ок, они не пересекаются, а по координате y(top) бывает пересекаются. как поправить ума не приложу :blink:


Часовой пояс GMT +3, время: 04:18.