Игра "Змейка" — различия между версиями

Материал из Department of Theoretical and Applied Mechanics
Перейти к: навигация, поиск
(Код программы)
(Код программы)
 
(не показаны 4 промежуточные версии 1 участника)
Строка 2: Строка 2:
 
В этой игре пользователь управляет змейкой, которая ползает по плоскости, ограниченной стенками, и собирает еду, избегая столкновения с собственным хвостом и краями игрового поля.
 
В этой игре пользователь управляет змейкой, которая ползает по плоскости, ограниченной стенками, и собирает еду, избегая столкновения с собственным хвостом и краями игрового поля.
  
Исполнители: [http://tm.spbstu.ru/%D0%94%D0%B5%D0%BC%D0%B8%D0%BD%D0%B0_%D0%9A%D1%81%D0%B5%D0%BD%D0%B8%D1%8F Демина Ксения], [http://tm.spbstu.ru/%D0%9F%D1%80%D0%BE%D1%85%D0%BE%D1%80%D0%B5%D0%BD%D0%BA%D0%BE%D0%B2%D0%B0_%D0%98%D1%80%D0%B8%D0%BD%D0%B0 Прохоренкова И.Г.], [http://tm.spbstu.ru/%D0%9C%D0%B0%D0%BB%D1%8B%D1%88%D0%B5%D0%B2%D0%B0_%D0%92%D0%B5%D1%80%D0%BE%D0%BD%D0%B8%D0%BA%D0%B0 Малышева В.Н.]
+
Исполнители: [http://tm.spbstu.ru/%D0%94%D0%B5%D0%BC%D0%B8%D0%BD%D0%B0_%D0%9A%D1%81%D0%B5%D0%BD%D0%B8%D1%8F Демина К.В.], [http://tm.spbstu.ru/%D0%9F%D1%80%D0%BE%D1%85%D0%BE%D1%80%D0%B5%D0%BD%D0%BA%D0%BE%D0%B2%D0%B0_%D0%98%D1%80%D0%B8%D0%BD%D0%B0 Прохоренкова И.Г.], [http://tm.spbstu.ru/%D0%9C%D0%B0%D0%BB%D1%8B%D1%88%D0%B5%D0%B2%D0%B0_%D0%92%D0%B5%D1%80%D0%BE%D0%BD%D0%B8%D0%BA%D0%B0 Малышева В.Н.]
  
 
Группа 13632/1 Кафедра Теоретической механики.
 
Группа 13632/1 Кафедра Теоретической механики.
Строка 14: Строка 14:
 
== Код программы ==
 
== Код программы ==
 
<div class="mw-collapsible mw-collapsed">
 
<div class="mw-collapsible mw-collapsed">
<syntaxhighlight lang=javascript>
+
<syntaxhighlight lang="javascript" line start="1" enclose="div">
window.addEventListener("load", main_code, false);
+
window.addEventListener("load",main,false);
function main_code(){
+
function main_code(){
 
  var ctx = SnakeS.getContext("2d");
 
  var ctx = SnakeS.getContext("2d");
 
  var h = SnakeS.height;
 
  var h = SnakeS.height;
Строка 34: Строка 34:
 
  var rightCode = 39;
 
  var rightCode = 39;
 
  var pause = false;
 
  var pause = false;
function get_mouse_coords(e){  
+
function get_mouse_coords(e){  
var m = {};
+
var m = {};
var rect = SnakeS.getBoundingClientRect();
+
var rect = SnakeS.getBoundingClientRect();
m.x = e.clientX - rect.left;
+
m.x = e.clientX - rect.left;
m.y = e.clientY - rect.top;
+
m.y = e.clientY - rect.top;
return m;
+
return m;
}
+
}
SnakeS.onclick = function(e){
+
SnakeS.onclick = function(e){
var m = get_mouse_coords(e);
+
  var m = get_mouse_coords(e);
console.log(m.x, m.y);
+
  console.log(m.x, m.y);
if ((m.x>(w/2-95))&&(m.x<(w/2+95))&&(m.y>(h/2+30))&&(m.y<(h/2+70))) {
+
  if ((m.x>(w/2-95))&&(m.x<(w/2+95))&&(m.y>(h/2+30))&&(m.y<(h/2+70))) {
console.log(1);
+
  console.log(1);
location.reload();
+
  location.reload();
}
+
  }
}
+
}
 
  var sl=1;
 
  var sl=1;
 
  var nofood = false;
 
  var nofood = false;
Строка 55: Строка 55:
 
  var y = h/n;
 
  var y = h/n;
 
  console.log(x,y);
 
  console.log(x,y);
function box(){
+
function box(){
this.conteins = "empty";
+
  this.conteins = "empty";
}
+
}
+
function Snake(){
function Snake(){
+
  this.head = null;
this.head = null;
+
  this.tail = null;
this.tail = null;
+
  this.body = [];
this.body = [];
+
  this.length = 1;
this.length = 1;
+
}
}
+
var field = [];
var field = [];
+
for (var i=0; i<n; i++) {
for (var i=0; i<n; i++) {
+
  var m = [];
var m = [];
+
  for (var j=0; j<n; j++){
for (var j=0; j<n; j++){
+
  m.push(new box());
m.push(new box());
+
  }
}
+
  field.push(m);
field.push(m);
+
}
}
+
var snake = new Snake();
var snake = new Snake();
+
function finish() {
function finish() {
+
  ctx.textAlign = 'center';
ctx.textAlign = 'center';
+
  ctx.font = '30px Georgia';
ctx.font = '30px Georgia';
+
  pause = true;
pause = true;
+
  console.error("Вы проиграли");
console.error("Вы проиграли");
+
  clearInterval(intervalID);
clearInterval(intervalID);
+
  ctx.fillStyle = 'rgb(180, 234, 255)';
ctx.fillStyle = 'rgb(180, 234, 255)';
+
  ctx.fillRect(0.25*w, 0.25*h, 0.5*w, 0.5*h);
ctx.fillRect(0.25*w, 0.25*h, 0.5*w, 0.5*h);
+
  ctx.strokeStyle = 'black';
ctx.strokeStyle = 'black';
+
  ctx.strokeRect(0.25*w, 0.25*h, 0.5*w, 0.5*h);
ctx.strokeRect(0.25*w, 0.25*h, 0.5*w, 0.5*h);
+
  ctx.fillStyle = 'black';
ctx.fillStyle = 'black';
+
  ctx.fillText('Вы проиграли!', w/2, h/2-40);
ctx.fillText('Вы проиграли!', w/2, h/2-40);
+
  ctx.fillText('Ваш счет: '+score, w/2, h/2);
ctx.fillText('Ваш счет: '+score, w/2, h/2);
+
  ctx.fillStyle = 'rgb(14, 151, 184)';
ctx.fillStyle = 'rgb(14, 151, 184)';
+
  ctx.fillRect(w/2-95, h/2+30, 190, 40);
ctx.fillRect(w/2-95, h/2+30, 190, 40);
+
  ctx.strokeRect(w/2-95, h/2+30, 190, 40);
ctx.strokeRect(w/2-95, h/2+30, 190, 40);
+
  ctx.fillStyle = 'black';
ctx.fillStyle = 'black';
+
  ctx.fillText('Сыграть еще', w/2, h/2+60);
ctx.fillText('Сыграть еще', w/2, h/2+60);
+
  console.info('rtr');
+
}
console.info('rtr');
+
function CreateItem(item){
}
+
  var i=Math.round(Math.random()*(n - 1));
function CreateItem(item){
+
  var j=Math.round(Math.random()*(n - 1));
var i=Math.round(Math.random()*(n - 1));
+
  while (field [i][j].conteins != "empty"){
var j=Math.round(Math.random()*(n - 1));
+
    var i=Math.round(Math.random()*(n - 1));
while (field [i][j].conteins != "empty"){
+
    var j=Math.round(Math.random()*(n - 1));
var i=Math.round(Math.random()*(n - 1));
+
  }
var j=Math.round(Math.random()*(n - 1));
+
  field [i][j].conteins = item;
}
+
}
field [i][j].conteins = item;
+
function Init(){
}
+
  var i=Math.round(Math.random()*(n - 1));
function Init(){
+
  var j=Math.round(Math.random()*(n - 1));
var i=Math.round(Math.random()*(n - 1));
+
  field [i][j].conteins = "food";
var j=Math.round(Math.random()*(n - 1));
+
  var i=Math.round(Math.random()*(n - 1));
field [i][j].conteins = "food";
+
  var j=Math.round(Math.random()*(n - 1));
var i=Math.round(Math.random()*(n - 1));
+
  while (field [i][j].conteins == "food"){
var j=Math.round(Math.random()*(n - 1));
+
    var i=Math.round(Math.random()*(n - 1));
while (field [i][j].conteins == "food"){
+
    var j=Math.round(Math.random()*(n - 1));
var i=Math.round(Math.random()*(n - 1));
+
  }
var j=Math.round(Math.random()*(n - 1));
+
  field [i][j].conteins = "snake";
}
+
  snake.head = {x: i, y: j};
field [i][j].conteins = "snake";
+
  snake.tail = {x: i, y: j};
snake.head = {x: i, y: j};
+
  snake.body.push({x: i, y: j}) ;
snake.tail = {x: i, y: j};
+
  console.log(direction, snake.body, snake.head);
snake.body.push({x: i, y: j}) ;
+
  CreateItem('nofood');
console.log(direction, snake.body, snake.head);
+
}
+
function Draw() {
CreateItem('nofood');
+
  for (var i=0; i<n; i++) {
}
+
  for (var j=0; j<n; j++){
function Draw() {
+
    if (field[i][j].conteins == "empty") {
for (var i=0; i<n; i++) {
+
    ctx.fillStyle = 'white';
for (var j=0; j<n; j++){
+
    ctx.fillRect(x*i, y*j, x, y);
if (field[i][j].conteins == "empty") {
+
    }
ctx.fillStyle = 'white';
+
    if (field[i][j].conteins == "food") {
ctx.fillRect(x*i, y*j, x, y);
+
    ctx.fillStyle = 'red';
}
+
    ctx.fillRect(x*i, y*j, x, y);
if (field[i][j].conteins == "food") {
+
    ctx.strokeStyle = 'black';
ctx.fillStyle = 'red';
+
    ctx.strokeRect(x*i, y*j, x, y);
ctx.fillRect(x*i, y*j, x, y);
+
    }
ctx.strokeStyle = 'black';
+
    if (field[i][j].conteins == "snake") {
ctx.strokeRect(x*i, y*j, x, y);
+
    ctx.fillStyle = 'green';
}
+
    ctx.fillRect(x*i, y*j, x, y);
if (field[i][j].conteins == "snake") {
+
    ctx.strokeStyle = 'black';
ctx.fillStyle = 'green';
+
    ctx.strokeRect(x*i, y*j, x, y);
ctx.fillRect(x*i, y*j, x, y);
+
    }
ctx.strokeStyle = 'black';
+
    if (field[i][j].conteins == "nofood") {
ctx.strokeRect(x*i, y*j, x, y);
+
    ctx.fillStyle = 'blue';
}
+
    ctx.fillRect(x*i, y*j, x, y);
if (field[i][j].conteins == "nofood") {
+
    ctx.strokeStyle = 'black';
ctx.fillStyle = 'blue';
+
    ctx.strokeRect(x*i, y*j, x, y);
ctx.fillRect(x*i, y*j, x, y);
+
    }
ctx.strokeStyle = 'black';
+
    if (field[i][j].conteins == "nofoodno") {
ctx.strokeRect(x*i, y*j, x, y);
+
    ctx.fillStyle = 'yellow';
}
+
    ctx.fillRect(x*i, y*j, x, y);
if (field[i][j].conteins == "nofoodno") {
+
    ctx.strokeStyle = 'black';
ctx.fillStyle = 'yellow';
+
    ctx.strokeRect(x*i, y*j, x, y);
ctx.fillRect(x*i, y*j, x, y);
+
    }
ctx.strokeStyle = 'black';
+
  }
ctx.strokeRect(x*i, y*j, x, y);
+
  }
}
+
  document.getElementById('scre').innerHTML = score;
}
+
}
}
+
window.onkeydown = function(evt) {  
document.getElementById('scre').innerHTML = score;
+
evt = evt || window.event;
}
+
var charCode = evt.keyCode || evt.which;
window.onkeydown = function(evt) {  
+
console.log(charCode);  
evt = evt || window.event;
+
if (((charCode == wCode)||(charCode == upCode)) && direction != "down") {
var charCode = evt.keyCode || evt.which;
+
  direction = "up";
console.log(charCode);  
+
}
if (((charCode == wCode)||(charCode == upCode)) && direction != "down") {
+
if (((charCode == sCode)||(charCode == downCode)) && direction != "up") {
direction = "up";
+
  direction = "down";  
}
+
}
if (((charCode == sCode)||(charCode == downCode)) && direction != "up") {
+
if (((charCode == aCode)||(charCode == leftCode)) && direction != "right") {
direction = "down";  
+
  direction = "left";
}
+
}
if (((charCode == aCode)||(charCode == leftCode)) && direction != "right") {
+
if (((charCode == dCode)||(charCode == rightCode)) && direction != "left") {
direction = "left";
+
  direction = "right";
}
+
}
if (((charCode == dCode)||(charCode == rightCode)) && direction != "left") {
+
}
direction = "right";
+
function CheckLength() {
}
+
  if ((score == 3) && (sl != 2)){
}
+
  sl = 2;
function CheckLength() {
+
  ms = ms-100;
if ((score == 3) && (sl != 2)){
+
  clearInterval(intervalID);
sl = 2;
+
  intervalID = setInterval(control, ms);
ms = ms-100;
+
  return ;
clearInterval(intervalID);
+
  }
intervalID = setInterval(control, ms);
+
  if ((score == 5 ) && (sl != 3)){
return ;
+
  sl = 3;
}
+
  ms = ms-50;
if ((score == 5 ) && (sl != 3)){
+
  clearInterval(intervalID);
sl = 3;
+
  intervalID = setInterval(control, ms);
ms = ms-50;
+
  }
clearInterval(intervalID);
+
}
intervalID = setInterval(control, ms);
+
function Calcul(){
}
+
  var next  
}
+
  try {
function Calcul(){
+
  if (direction == "left") {
var next  
+
  next = {x: snake.head.x-1, y: snake.head.y}
try {
+
  }
if (direction == "left") {
+
  if (direction == "right") {
next = {x: snake.head.x-1, y: snake.head.y}
+
  next = {x: snake.head.x+1, y: snake.head.y}
}
+
  }
if (direction == "right") {
+
  if (direction == "up") {
next = {x: snake.head.x+1, y: snake.head.y}
+
  next = {x: snake.head.x, y: snake.head.y-1}
}
+
  }
if (direction == "up") {
+
  if (direction == "down" && snake.length == 1) {
next = {x: snake.head.x, y: snake.head.y-1}
+
  next = {x: snake.head.x, y: snake.head.y+1}
}
+
  }
if (direction == "down" && snake.length == 1) {
+
  if (direction == "down" && snake.length > 1) {
next = {x: snake.head.x, y: snake.head.y+1}
+
  next = {x: snake.head.x, y: snake.head.y}
}
+
  }
if (direction == "down" && snake.length > 1) {
+
  if (score > 5) {
next = {x: snake.head.x, y: snake.head.y}
+
  if (next.x<0) {
}
+
    next.x = n-1
if (score > 5) {
+
    console.log('TP')
if (next.x<0) {
+
    }
next.x = n-1
+
  if (next.y<0) {
console.log('TP')
+
    next.y = n-1
}
+
    console.log('TP')
if (next.y<0) {
+
   
next.y = n-1
+
  if (next.x>n-1) {
console.log('TP')
+
    next.x = 0
}
+
    console.log('TP')
if (next.x>n-1) {
+
    }
next.x = 0
+
  if (next.y>n-1) {
console.log('TP')
+
    next.y = 0
}
+
    console.log('TP')
if (next.y>n-1) {
+
    }
next.y = 0
+
  } else {
console.log('TP')
+
  if (next.x<0) {
}
+
    finish();
} else {
+
    return;
if (next.x<0) {
+
    }
finish();
+
  if (next.y<0) {
return;
+
    finish();
}
+
    return;
if (next.y<0) {
+
    }
finish();
+
  if (next.x>n-1) {
return;
+
    finish();
}
+
    return;
if (next.x>n-1) {
+
    }
finish();
+
  if (next.y>n-1) {
return;
+
    finish();
}
+
    return;
if (next.y>n-1) {
+
    }
finish();
+
  }
return;
+
  if (field[next.x][next.y].conteins == "snake") {
}
+
  finish();
}
+
  return;
+
  }
if (field[next.x][next.y].conteins == "snake") {
+
  if (field[next.x][next.y].conteins == "food") {
finish();
+
  snake.body.push({x:next.x, y:next.y});
return;
+
  snake.head = {x:next.x, y:next.y};
}
+
  field[next.x][next.y].conteins = "snake";
if (field[next.x][next.y].conteins == "food") {
+
  CreateItem ('food');
snake.body.push({x:next.x, y:next.y});
+
  score++;
snake.head = {x:next.x, y:next.y};
+
  }
field[next.x][next.y].conteins = "snake";
+
  if (field[next.x][next.y].conteins == "nofoodno") {
CreateItem ('food');
+
  snake.body.push({x:next.x, y:next.y});
score++;
+
  snake.head = {x:next.x, y:next.y};
}
+
  field[next.x][next.y].conteins = "snake";
if (field[next.x][next.y].conteins == "nofoodno") {
+
  field[snake.body[0].x][snake.body[0].y].conteins = "empty";
snake.body.push({x:next.x, y:next.y});
+
  snake.body.shift();
snake.head = {x:next.x, y:next.y};
+
  if(snake.body.length!=1)
field[next.x][next.y].conteins = "snake";
+
    field[snake.body[0].x][snake.body[0].y].conteins = "empty";
field[snake.body[0].x][snake.body[0].y].conteins = "empty";
+
    snake.body.shift();
snake.body.shift();
+
  score++;
if(snake.body.length!=1)
+
  nofoodno=false;
field[snake.body[0].x][snake.body[0].y].conteins = "empty";
+
  }
snake.body.shift();
+
  if (field[next.x][next.y].conteins == "nofood") {
score++;
+
  snake.body.push({x:next.x, y:next.y});
nofoodno=false;
+
  snake.head = {x:next.x, y:next.y};
}
+
  field[next.x][next.y].conteins = "snake";
if (field[next.x][next.y].conteins == "nofood") {
+
  field[snake.body[0].x][snake.body[0].y].conteins = "empty";
snake.body.push({x:next.x, y:next.y});
+
  snake.body.shift();
snake.head = {x:next.x, y:next.y};
+
  score++;
field[next.x][next.y].conteins = "snake";
+
  nofood=false;
field[snake.body[0].x][snake.body[0].y].conteins = "empty";
+
  }
snake.body.shift();
+
  if (field[next.x][next.y].conteins == "empty") {
score++;
+
  snake.body.push({x:next.x, y:next.y});
nofood=false;
+
  snake.head = {x:next.x, y:next.y};
}
+
  field[next.x][next.y].conteins = "snake";
if (field[next.x][next.y].conteins == "empty") {
+
  field[snake.body[0].x][snake.body[0].y].conteins = "empty";
snake.body.push({x:next.x, y:next.y});
+
  snake.body.shift();
snake.head = {x:next.x, y:next.y};
+
  }
field[next.x][next.y].conteins = "snake";
+
  } catch (err){
field[snake.body[0].x][snake.body[0].y].conteins = "empty";
+
  console.error("Что то пошло не так; X=", next.x, "Y=", next.y);
snake.body.shift();
+
  clearInterval(intervalID);
}
+
  }
} catch (err){
+
  if (((score+1) % 5 == 0)&&(!nofood)){
console.error("Что то пошло не так; X=", next.x, "Y=", next.y);
+
  CreateItem ('nofood');
clearInterval(intervalID);
+
  nofood=true;
}
+
  }
if (((score+1) % 5 == 0)&&(!nofood)){
+
  if (((score+1) % 8 == 0)&&(!nofoodno)){
CreateItem ('nofood');
+
  CreateItem ('nofoodno');
nofood=true;
+
  nofoodno=true;
}
+
  }
if (((score+1) % 8 == 0)&&(!nofoodno)){
+
}
CreateItem ('nofoodno');
+
function control (){
nofoodno=true;
+
  if (!pause)
}
+
  Calcul ();
}
+
  if (!pause)
+
  Draw();
function control (){
+
  CheckLength();
if (!pause)
+
}
Calcul ();
+
Init();
if (!pause)
+
Draw ();
Draw();
+
intervalID = setInterval(control, ms);
CheckLength();
 
}
 
Init();
 
Draw ();
 
intervalID = setInterval(control, ms);
 
 
}
 
}
 +
</syntaxhighlight>
 +
</div>

Текущая версия на 19:37, 19 июня 2019

Описание[править]

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

Исполнители: Демина К.В., Прохоренкова И.Г., Малышева В.Н.

Группа 13632/1 Кафедра Теоретической механики.

Файл: Текст курсового проекта

Математическая модель[править]

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

Визуализация[править]

Код программы[править]

  1  window.addEventListener("load",main,false);
  2  function main_code(){
  3  var ctx = SnakeS.getContext("2d");
  4  var h = SnakeS.height;
  5  var w = SnakeS.width;
  6  var n = 45;
  7  var intervalID;
  8  var direction = "left";
  9  var ms =200;
 10  var score = 0;
 11  var wCode = 87;
 12  var aCode = 65;
 13  var sCode = 83;
 14  var dCode = 68;
 15  var upCode = 38;
 16  var leftCode = 37;
 17  var downCode = 40;
 18  var rightCode = 39;
 19  var pause = false;
 20  function get_mouse_coords(e){ 
 21  var m = {};
 22  var rect = SnakeS.getBoundingClientRect();
 23  m.x = e.clientX - rect.left;
 24  m.y = e.clientY - rect.top;
 25  return m;
 26  }
 27  SnakeS.onclick = function(e){
 28   var m = get_mouse_coords(e);
 29   console.log(m.x, m.y);
 30   if ((m.x>(w/2-95))&&(m.x<(w/2+95))&&(m.y>(h/2+30))&&(m.y<(h/2+70))) {
 31    console.log(1);
 32    location.reload();
 33   }
 34  }
 35  var sl=1;
 36  var nofood = false;
 37  var nofoodno = false;
 38  var x = w/n;
 39  var y = h/n;
 40  console.log(x,y);
 41  function box(){
 42   this.conteins = "empty";		
 43  }
 44  function Snake(){
 45   this.head = null;
 46   this.tail = null;
 47   this.body = [];
 48   this.length = 1;
 49  }
 50  var field = [];
 51  for (var i=0; i<n; i++) {
 52   var m = [];
 53   for (var j=0; j<n; j++){
 54    m.push(new box());
 55   }
 56   field.push(m);
 57  }
 58  var snake = new Snake();
 59  function finish() {
 60   ctx.textAlign = 'center';
 61   ctx.font = '30px Georgia';
 62   pause = true;
 63   console.error("Вы проиграли");
 64   clearInterval(intervalID);
 65   ctx.fillStyle = 'rgb(180, 234, 255)';
 66   ctx.fillRect(0.25*w, 0.25*h, 0.5*w, 0.5*h);
 67   ctx.strokeStyle = 'black';
 68   ctx.strokeRect(0.25*w, 0.25*h, 0.5*w, 0.5*h);
 69   ctx.fillStyle = 'black';
 70   ctx.fillText('Вы проиграли!', w/2, h/2-40);
 71   ctx.fillText('Ваш счет: '+score, w/2, h/2);
 72   ctx.fillStyle = 'rgb(14, 151, 184)';
 73   ctx.fillRect(w/2-95, h/2+30, 190, 40);
 74   ctx.strokeRect(w/2-95, h/2+30, 190, 40);
 75   ctx.fillStyle = 'black';
 76   ctx.fillText('Сыграть еще', w/2, h/2+60);
 77   console.info('rtr');
 78  }
 79  function CreateItem(item){
 80   var i=Math.round(Math.random()*(n - 1));
 81   var j=Math.round(Math.random()*(n - 1));
 82   while (field [i][j].conteins != "empty"){
 83     var i=Math.round(Math.random()*(n - 1));
 84     var j=Math.round(Math.random()*(n - 1));
 85    }
 86   field [i][j].conteins = item;
 87  }
 88  function Init(){
 89    var i=Math.round(Math.random()*(n - 1));
 90    var j=Math.round(Math.random()*(n - 1));
 91    field [i][j].conteins = "food";
 92    var i=Math.round(Math.random()*(n - 1));
 93    var j=Math.round(Math.random()*(n - 1));
 94    while (field [i][j].conteins == "food"){
 95     var i=Math.round(Math.random()*(n - 1));
 96     var j=Math.round(Math.random()*(n - 1));
 97    }
 98    field [i][j].conteins = "snake";
 99    snake.head = {x: i, y: j};
100    snake.tail = {x: i, y: j};
101    snake.body.push({x: i, y: j}) ;
102    console.log(direction, snake.body, snake.head);
103    CreateItem('nofood');
104  }
105  function Draw() {
106   for (var i=0; i<n; i++) {
107    for (var j=0; j<n; j++){
108     if (field[i][j].conteins == "empty") {
109     ctx.fillStyle = 'white';
110     ctx.fillRect(x*i, y*j, x, y);
111     }
112     if (field[i][j].conteins == "food") {
113     ctx.fillStyle = 'red';
114     ctx.fillRect(x*i, y*j, x, y);
115     ctx.strokeStyle = 'black';
116     ctx.strokeRect(x*i, y*j, x, y);
117     }
118     if (field[i][j].conteins == "snake") {
119     ctx.fillStyle = 'green';
120     ctx.fillRect(x*i, y*j, x, y);
121     ctx.strokeStyle = 'black';
122     ctx.strokeRect(x*i, y*j, x, y);
123     }
124     if (field[i][j].conteins == "nofood") {
125     ctx.fillStyle = 'blue';
126     ctx.fillRect(x*i, y*j, x, y);
127     ctx.strokeStyle = 'black';
128     ctx.strokeRect(x*i, y*j, x, y);
129     }
130     if (field[i][j].conteins == "nofoodno") {
131     ctx.fillStyle = 'yellow';
132     ctx.fillRect(x*i, y*j, x, y);
133     ctx.strokeStyle = 'black';
134     ctx.strokeRect(x*i, y*j, x, y);
135     }
136    }
137   }
138   document.getElementById('scre').innerHTML = score;
139  }
140  window.onkeydown = function(evt) { 
141  evt = evt || window.event;
142  var charCode = evt.keyCode || evt.which;
143  console.log(charCode); 
144  if (((charCode == wCode)||(charCode == upCode)) && direction != "down") {
145   direction = "up";
146  }
147  if (((charCode == sCode)||(charCode == downCode)) && direction != "up") {
148   direction = "down"; 
149  }
150  if (((charCode == aCode)||(charCode == leftCode)) && direction != "right") {
151   direction = "left";
152  }
153  if (((charCode == dCode)||(charCode == rightCode)) && direction != "left") {
154   direction = "right";
155  }
156  }
157  function CheckLength() {
158   if ((score == 3) && (sl != 2)){
159    sl = 2;
160    ms = ms-100;
161    clearInterval(intervalID);
162    intervalID = setInterval(control, ms);
163    return ;
164   }
165   if ((score == 5 ) && (sl != 3)){
166    sl = 3;
167    ms = ms-50;
168    clearInterval(intervalID);
169    intervalID = setInterval(control, ms);
170   }
171  }
172  function Calcul(){
173   var next 
174   try {
175   if (direction == "left") {
176    next = {x: snake.head.x-1, y: snake.head.y}
177   }
178   if (direction == "right") {
179    next = {x: snake.head.x+1, y: snake.head.y}
180   }
181   if (direction == "up") {
182    next = {x: snake.head.x, y: snake.head.y-1}
183   }
184   if (direction == "down" && snake.length == 1) {
185    next = {x: snake.head.x, y: snake.head.y+1}
186   }
187   if (direction == "down" && snake.length > 1) {
188    next = {x: snake.head.x, y: snake.head.y}
189   }
190   if (score > 5) {
191    if (next.x<0) {
192     next.x = n-1
193     console.log('TP')
194     }
195    if (next.y<0) {
196     next.y = n-1
197     console.log('TP')
198     
199    if (next.x>n-1) {
200     next.x = 0
201     console.log('TP')
202     }
203    if (next.y>n-1) {
204     next.y = 0
205     console.log('TP')
206      }	
207   } else {
208    if (next.x<0) {
209     finish();
210     return;
211     }
212    if (next.y<0) {
213     finish();
214     return;
215     }
216    if (next.x>n-1) {
217     finish();
218     return;
219     }
220    if (next.y>n-1) {
221     finish();
222     return;
223     }	
224   }
225   if (field[next.x][next.y].conteins == "snake") {
226    finish();
227    return;
228   }
229   if (field[next.x][next.y].conteins == "food") {
230    snake.body.push({x:next.x, y:next.y});
231    snake.head = {x:next.x, y:next.y};
232    field[next.x][next.y].conteins = "snake";
233    CreateItem ('food');
234    score++;
235   }
236   if (field[next.x][next.y].conteins == "nofoodno") {
237    snake.body.push({x:next.x, y:next.y});
238    snake.head = {x:next.x, y:next.y};
239    field[next.x][next.y].conteins = "snake";
240    field[snake.body[0].x][snake.body[0].y].conteins = "empty";
241    snake.body.shift();
242    if(snake.body.length!=1)
243     field[snake.body[0].x][snake.body[0].y].conteins = "empty";
244     snake.body.shift();
245    score++;
246    nofoodno=false;
247   }
248   if (field[next.x][next.y].conteins == "nofood") {
249    snake.body.push({x:next.x, y:next.y});
250    snake.head = {x:next.x, y:next.y};
251    field[next.x][next.y].conteins = "snake";
252    field[snake.body[0].x][snake.body[0].y].conteins = "empty";
253    snake.body.shift();
254    score++;
255    nofood=false;
256   }
257   if (field[next.x][next.y].conteins == "empty") {
258    snake.body.push({x:next.x, y:next.y});
259    snake.head = {x:next.x, y:next.y};
260    field[next.x][next.y].conteins = "snake";
261    field[snake.body[0].x][snake.body[0].y].conteins = "empty";
262    snake.body.shift();
263   }
264   } catch (err){
265    console.error("Что то пошло не так; X=", next.x, "Y=", next.y);
266    clearInterval(intervalID);
267   }
268   if (((score+1) % 5 == 0)&&(!nofood)){
269    CreateItem ('nofood');
270    nofood=true;
271   }
272   if (((score+1) % 8 == 0)&&(!nofoodno)){
273    CreateItem ('nofoodno');
274    nofoodno=true;
275   }
276  }
277  function control (){
278   if (!pause)
279    Calcul ();
280   if (!pause)
281    Draw();
282   CheckLength();
283  }
284  Init();
285  Draw ();
286  intervalID = setInterval(control, ms);
287 }