Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Змейка: совпадение координат (https://javascript.ru/forum/misc/37532-zmejjka-sovpadenie-koordinat.html)

Hekumok 23.04.2013 16:15

Змейка: совпадение координат
 
Делаю игру "змейка" на канвасе. Имеется такой код
function randomNumber(max) {
	return Math.floor(Math.random() * max) ;
} // генерит случайное число от 0 до (но не включая) max
function Position(x, y, side) {
	this.x = x ;
	this.y = y ;
	if(side !== undefined)
		this.movementToSide = side ;
} // конструктор позиций, x и y - координаты, movementToSide - сторона, в которую двигаемся
function Food() {
	this.position = new Position(randomNumber(canvas.width), randomNumber(canvas.height)) ;
} // конструктор еды, которую ест змейка; position - позиция, где эта еда находится, она может появиться в любом месте на поле
function Snake() {
	this.positionsOfTurns = [] ;
	this.head = new Position(canvas.center.x + canvas.cellSize, canvas.center.y, "right") ;
	this.tail = new Position(canvas.center.x - canvas.cellSize, canvas.center.y, "right") ;
}
/* positionOfTurns - массив позиций, где и в какую сторону поворачивает змейка
пример этого массива:
[{
	x: 250,
	y: 250,
	movementToSide: "top"
},
{
	x: 250,
	y: 200,
	movementToSide: "left"
}], т.е. первый поворот змейка делает вверх в позиции x:250, y:250; далее передвигается на 50пикселей вверх и следующий поворот она делает влево в позиции x:250, y:200
head - позиция головы змейки
tail - позиция хвоста змейки
*/
// прочий код

Так вот, когда создается позиция для еды, нужно проверить, не попала ли она на змейку (нельзя же, чтоб еда появилась на змейке). Следовательно, вопрос: как максимально эффективно (т.е. наиболее быстро) и можно ли вообще проверить, совпала позиция еды с какой-либо координатой, где ползет сейчас змейка, не имея при этом массива всех этих координат змейки (у меня же только хранятся позиции головы, хвоста и поворотов змейки). Я не вижу никакого варианта, кроме как с использованием массива всех координат

Aetae 23.04.2013 16:45

Ну не всех координат, можно взять imageData конкретного участка. Также возможно поможет isPointInPath().

Dim@ 23.04.2013 17:44

Hekumok,
хвост следует за головой по пути пройденному головой => по идее, должен быть массив поворотов которые должен сделать хвост на данный момент, он есть (если есть можно его скинуть)?

JsLoveR 23.04.2013 18:41

Может быть стоит проверять если координаты еды попадают в прямоугольник, где залито цветом змейки, а не цветом фона и возвращать true. Как Aetae предложил.

Hekumok 23.04.2013 21:53

Aetae, JsLoveR, спасибо, но получается, что мне нужно в цикле пробегать по всем координатам змейки и смотреть, совпадают ли они с позицией еды или нет, но я этого не хочу, почему и не использую массив всех координат змейки. А вообще у меня тут идейка появилась, завтра попробую.
Dim@, ээмм... Ну так snake.positionsOfTurns - это и есть массив поворотов змейки, т.е. поворотов, которые должен пройти хвост

Dim@ 23.04.2013 22:07

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

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

nerv_ 23.04.2013 22:26

Цитата:

Сообщение от Dim@
массив поворотов

:cray:

Цитата:

Сообщение от Hekumok
Я не вижу никакого варианта, кроме как с использованием массива всех координат

делай с массивом и не страдай ерундой )

Dim@ 23.04.2013 22:29

nerv_,
Цитата:

Сообщение от nerv_
Цитата:

Сообщение от Dim@
массив поворотов

:cray:

:cray: да я знаю

Aetae 23.04.2013 22:37

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

Dim@ 23.04.2013 22:51

Aetae,
это логично, а если там змейка не в виде простых линий?


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