var _score;
var _id ;
var _point_x ;
var _point_y ;
var _x ;
var _y ;
var _tail_x = [];
var _tail_y = [];
var _length ; // длина хвоста
var cr_mtrx_again = true ;
var _prev_dir = 'RIGHT';
var _extra_fruit = false ;
var time = -1 ;
var count = 0 ;
//
// Создание матрицы.
//
function createMatrix() // class Matrix
{
var matrix = document.getElementById('matrix');//объект матрица
var n = 20 * 20;
for (var i = 0; i < n; i++)
{
var div = document.createElement('div');//cрздание объекта div c именем класса cell
div.className = 'cell';
div.style.backgroundImage = 'url(pixel.png)';
matrix.appendChild(div);//заносим в матрицу детей div cell
}
}
function showScore(time) //
{
document.getElementById('score').innerHTML = 'Score : ' + _score;
if (_extra_fruit && time )
document.getElementById('time_left').innerHTML = 'Time : ' + time;
else
document.getElementById('time_left').innerHTML = '' ;
}
//
// Чтение ячейки матрицы.
//
function getCell(row,col)
{
var div = document.getElementById('matrix');
if ( div.children[20*(row-1) + col -1].style.backgroundColor == 'red' )
return true ;
else
return false ;
}
//
// Установка ячейки матрицы.
//
function setCell(row,col,url, val)
{
var div_matrix = document.getElementById('matrix');
if ( val == true )
div_matrix.children[(row-1)*20 + col-1].style.backgroundImage = url;
else
{
div_matrix.children[(row-1)*20 + col-1].style.backgroundImage = 'url(pixel.png)';
}
}
document.onkeydown = function(event)
{
if (window.event)
event = window.event;
switch (event.keyCode)
{
//влево
case 37: {if (_prev_dir != 'RIGHT' && _prev_dir != 'LEFT') move_snake('LEFT'); break;}
//вверх
case 38: {if (_prev_dir != 'UP' && _prev_dir != 'DOWN') move_snake('UP'); break;}
//вправо
case 39: {if (_prev_dir != 'RIGHT' && _prev_dir != 'LEFT') move_snake('RIGHT'); break;}
//вниз
case 40: {if (_prev_dir != 'UP' && _prev_dir != 'DOWN') move_snake('DOWN'); break;}
}
}
function crash_snake()
{
var lose ;
// границы
if (_x == 0 || _x == 21 || _y == 0 || _y == 21)
{
lose = true ;
}
// врезание в своё тело
for ( i = 0 ; i < _length ; i ++ )
{
if (_x == _tail_x[i] && _y == _tail_y[i])
{
lose = true ;
break ;
}
}
if (lose == true)
{
clearInterval(_id);
alert('Вы проиграли') ;
erase_matrix();
_prev_dir = 'RIGHT';
cr_mtrx_again = false ;
return true ;
}
return false ;
}
function set_point()
{
_point_x = Math.floor(Math.random()*20+1);
_point_y = Math.floor(Math.random()*20+1);
if ( _point_x == _x && _point_y ==_y)
set_point();
for ( i = 0 ; i < _length ; i ++ )
{
if ((_point_x == _tail_x[i]) && (_point_y == _tail_y[i]))
{
set_point();
}
}
if (_extra_fruit)
setCell(_point_x,_point_y,'url(extra_fruit.png)',true);
else
setCell(_point_x,_point_y,'url(fruit_pixel.png)',true);
}
function eat_point(last_x,last_y)
{
if ( (_x == _point_x) && (_y == _point_y) )
{
_score+= (_extra_fruit) ? time : 1 ;
if (_extra_fruit == true )
_extra_fruit = false ;
_length++;
_tail_x[_length-1] = last_x;
_tail_y[_length-1] = last_y;
return true ;
}
return false;
}
function create_snake(size,x,y)
{
_length = size-1;//длина хвоста - 3
_x = x ;
_y = y ;
for (i = 0; i <_length ; i++) // от 0 до 2
{
_tail_x[i] = _x ;
_tail_y[i] = _y -(i+1);
}
draw_snake() ;
}
function erase_matrix()
{
for ( i = 1 ; i <= 20 ; i++ )
{
for ( j = 1 ; j <= 20 ; j++ )
setCell(i,j,false);
}
}
function draw_snake()
{
setCell(_x,_y,'url(snake_pixel.png)',true); // голова
var i ;
for ( i = 0 ; i < _length ; i++ )
{
setCell(_tail_x[i],_tail_y[i],'url(snake_pixel.png)',true);
}
}
//
// Точка входа.
//
window.onload = function()
{
_score = 0;
showScore();
if (cr_mtrx_again)
createMatrix();
set_point();
create_snake(3,10,10);
move_snake('RIGHT');
// set_point();
}
function move_snake(dir_move)
{
switch (dir_move)
{
case 'LEFT' : {_prev_dir = 'LEFT' ; break }
case 'RIGHT' : {_prev_dir = 'RIGHT' ; break }
case 'UP' : {_prev_dir = 'UP' ;break }
case 'DOWN' : {_prev_dir = 'DOWN' ; break }
}
var last_x ;
var last_y ;
clearInterval(_id);
_id = setInterval( function ()
{
if (!time)
{
_extra_fruit = false ;
setCell(_point_x,_point_y,false);
time = - 1;
set_point();
}
if (_extra_fruit) count ++ ;
// время бонуса
time-= (_extra_fruit && (count == 5 )) ? 1 : 0;
count = (count==5) ? 0 : count ;
last_x = _tail_x[_length-1] ;
last_y = _tail_y[_length-1] ;
for ( i = _length ; i >= 0 ; i -- )
{
if (i)
{
_tail_x[i] = _tail_x[i-1];
_tail_y[i] = _tail_y[i-1];
}
else
{
_tail_x[i] = _x;
_tail_y[i] = _y;
}
}
switch (dir_move)
{
case 'LEFT' : {--_y; break;}
case 'RIGHT' : {++_y; break;}
case 'UP' : {--_x; break;}
case 'DOWN' : {++_x; break;}
}
showScore(time);
if (!crash_snake())
{
if (!eat_point(last_x,last_y))
{
setCell(last_x,last_y,false ); // последний элемент хвоста
}
else
{
if (( _score > 0 ) && (!(_score % 5)) )
{
_extra_fruit = true ;
time = 5 ;
}
set_point();
}
draw_snake();
}
else
window.onload();
},100 ) ;
}