Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Вопрос с игрой трубопроводчик (https://javascript.ru/forum/misc/31209-vopros-s-igrojj-truboprovodchik.html)

2pizza 30.08.2012 04:51

Вопрос с игрой трубопроводчик
 
Привет всем! Сразу к проблеме:
Есть игровое поле, на котором расположены куски труб: — , |, T, L,+, и тд, каждый кусок трубы можно вращать. Необходимо составить из этих кусков трубопровод, по которому будет идти вода.
Проблема: я не могу понять как сделать, чтобы куски труб соединялись, например есть 2 куска трубы "—" и "|", вращаем "|" и получаем "——", трубы соединились в правой и левой стороне значит вода может проходить, как сделать это программно, по теории всё понятно, можете помочь примером ?

Deff 30.08.2012 09:16

Цитата:

Сообщение от 2pizza
по теории всё понятно,

:) Ну дык раскажите алгоритм ?

9xakep 30.08.2012 10:38

Немного глупо, но все же:
Для каждой картинке создаете массив:
допустим, для этой картинки: |
Массив будет такой: [false,true,false,true]
Для этой: T : [true, false,true,true]
И смотрите (сравниваете 2 массива, там где у них true совпадает, там вода протечь может).
Deff, он и спрашивал как алгоритм сделать)

Deff 30.08.2012 10:44

9xakep,
Несимпатично -
1. Лучше цифрами - 0,1,0
2. Будет матрица

Вертикальная труба
[0,1,0]
[0,1,0]
[0,1,0]

Горизонтальная труба
[0,0,0]
[1,1,1]
[0,0,0]

Крестовина
[0,1,0]
[1,1,1]
[0,1,0]

Т - труба
[1,1,1]
[0,1,0]
[0,1,0]


И нужен скрипт метод трансформации (поворота матрицы) на +/-90º (либо иметь массив всех заготовок)

9xakep 30.08.2012 10:47

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

9xakep 30.08.2012 10:47

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

Serg_pnz 30.08.2012 12:25

Согласен с Deff. Причем, по матрице волновой алгоритм пустить будет легче.

Deff 30.08.2012 12:33

Есть прикольная старая мини-Игра "Сетка" под Windows (долго как то гонял в неё , суть та же что и у "трубопроводчик"

nerv_ 30.08.2012 13:40

http://javascript.ru/forum/misc/2816...jki-v-ie9.html

Deff 30.08.2012 13:45

nerv_,
Да - идея с поворотом - идентична

2pizza 30.08.2012 15:45

Спасибо всем, я сам думал как Deff предложил, только:
Вертикальная труба
[0,1,0]
[0,0,0]
[0,1,0]

Горизонтальная труба
[0,0,0]
[1,0,1]
[0,0,0]
Смысл в том, что обозначаются 1 только концы соединений трубы и у каждой трубы есть top,left,right,bottom, игра будет простая, поворачиваться куски труб будут по заготовкам и смысл игры - все трубы соединить, волновых алгоритмов не будет, просто не могу элементарно соединить 2 трубки, просто даже не знаю как записать на поле два куска трубы и проверить их возможность соединения, для примера просто "+" и "L" вывести сообщение, что трубы не могут соединиться, мало знаний(

bes 30.08.2012 16:00

лучше создать конструктор объектов со свойствами t, r, b, l (top, right, bottom, left - свойства со значениями 0 или 1(1 - дырка есть)), также туда можно добавить и свойство obj - ссылка на элемент, который будет привязан к объекту, при повороте элемента соответствующим образом устанавливаются свойства связанного с ним объекта и осуществляется проверка, если воде (или что там течёт) куда дальше течь

Deff 30.08.2012 16:02

2pizza,
Допустим соединение справо от уже стоящего слево блока:
находите index элемента матрицы в левом блоке в правой колонки с "1"

Для горизонтальной трубы это будет (если элементы считаются от нуля
Элемент с индексом elem[1][1],
Значит в правом блоке - первый индекс должен совпадать с левым, т.е
i.row=1, a col индекс = будет равен 0 (поскольку ищем в первой колонке
т.е в правом блоке должен быть индекс elemRight[1][0]==elemLeft[1][1]==1
*Считаем что первый индекс - это строка - второй колонка

2pizza 30.08.2012 16:21

bes,
что-то вроде такого?:
var pipeobj = { //все виды труб
    horpipe:{left: 1, top: 0, right: 1, bottom: 0}, //труба горизонтального вида
	verpipe:{left: 0, top: 1, right: 0, bottom: 1}  //труба вертикального вида
}

bes 30.08.2012 16:37

Типа так, можно еще нужных методов добавить

function tube (obj, t, r, b, l) {
	this.obj = obj;
	this.t = t;
	this.r = r;
	this.b = b;
	this.l = l;
}

var elem1 = new tube(document.body.children[0], 0, 1, 1, 0);

2pizza 30.08.2012 16:43

bes, ясно, а как сей конструктор привязать к куску трубы в двумерном массиве ?
Например есть такой элемент:
var elem1 = new tube("T", 0, 1, 1, 1);

и есть поле, пусть труба будет значением 2:
var map=new Array(
	new Array(0,0,0,0,0,0,0,0,0,0),
	new Array(0,0,0,0,2,0,0,0,0,0),
	new Array(0,0,0,0,0,0,0,0,0,0),
	new Array(0,0,0,0,0,0,0,0,0,0),
	new Array(0,0,0,0,0,0,0,0,0,0)
);

bes 30.08.2012 17:08

не совсем понял, что требуется (разбросать картинки случайным образом по экрану что ли?)

tube - конструктор, каждый объект полученный с его помощью (например, elem1) создаёт связь между html-элементом (например, картинкой трубы в ячейке таблицы) и описанием этой трубы с точки зрения сторон этой картинки, через которые вода может течь (также можно было у каждой картинки трубы задать дополнительные 4 атрибута, описывающие доступность сторон картинки к течи)

2pizza 30.08.2012 17:33

bes, ясно, создаёт связь между html-элементом, я думал, что создаёт связь между элементами в массиве.


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