Редактирование: Whtmlets/js2020/Jakhangirov/index.html

Перейти к: навигация, поиск

Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 15: Строка 15:
  
 
<syntaxhighlight lang="javascript" line start="1" enclose="div">
 
<syntaxhighlight lang="javascript" line start="1" enclose="div">
const canvas = document.getElementById("game");
+
let cols, rows;
const ctx = canvas.getContext("2d");
+
let w = 20;
 +
let grid = [];
 +
let current;
 +
let stack = [];
  
const ground = new Image();
+
function setup() {
ground.src = "img/ground.png";
+
  createCanvas(600, 600);
 +
  cols = floor(width / w);
 +
  rows = floor(height / w);
  
const foodImg = new Image();
+
  for (let j = 0; j < rows; j++) {
foodImg.src = "img/food.png";
+
    for (let i = 0; i < cols; i++) {
 +
      var cell = new Cell(i, j);
 +
      grid.push(cell);
 +
    }
 +
  }
  
let box = 32;
+
  current = grid[0];
 +
}
  
let score = 0;
+
function draw() {
 +
  background(51);
 +
  for (let i = 0; i < grid.length; i++) {
 +
    grid[i].show();
 +
  }
  
let food = {
+
  current.visited = true;
   x: Math.floor((Math.random() * 17 + 1)) * box,
+
   current.highlight();
   y: Math.floor((Math.random() * 15 + 3)) * box,
+
  // STEP 1
};
+
   let next = current.checkNeighbors();
 +
  if (next) {
 +
    next.visited = true;
  
let snake = [];
+
    // STEP 2
snake[0] = {
+
    stack.push(current);
  x: 9 * box,
 
  y: 10 * box
 
};
 
  
document.addEventListener("keydown", direction);
+
    // STEP 3
 +
    removeWalls(current, next);
  
let dir;
+
    // STEP 4
 +
    current = next;
 +
  } else if (stack.length > 0) {
 +
    current = stack.pop();
 +
  }
 +
}
  
function direction(event) {
+
function index(i, j) {
   if(event.keyCode == 37 && dir != "right")
+
   if (i < 0 || j < 0 || i > cols - 1 || j > rows - 1) {
    dir = "left";
+
     return -1;
  else if(event.keyCode == 38 && dir != "down")
+
   }
     dir = "up";
+
   return i + j * cols;
   else if(event.keyCode == 39 && dir != "left")
 
    dir = "right";
 
   else if(event.keyCode == 40 && dir != "up")
 
    dir = "down";
 
 
}
 
}
  
function eatTail(head, arr) {
+
function removeWalls(a, b) {
   for(let i = 0; i < arr.length; i++) {
+
   let x = a.i - b.i;
     if(head.x == arr[i].x && head.y == arr[i].y)
+
  if (x === 1) {
      clearInterval(game);
+
     a.walls[3] = false;
 +
    b.walls[1] = false;
 +
  } else if (x === -1) {
 +
    a.walls[1] = false;
 +
    b.walls[3] = false;
 +
  }
 +
  let y = a.j - b.j;
 +
  if (y === 1) {
 +
    a.walls[0] = false;
 +
    b.walls[2] = false;
 +
  } else if (y === -1) {
 +
    a.walls[2] = false;
 +
    b.walls[0] = false;
 
   }
 
   }
 
}
 
}
  
function drawGame() {
+
</syntaxhighlight>
  ctx.drawImage(ground, 0, 0);
+
</div>
  
  ctx.drawImage(foodImg, food.x, food.y);
+
<div class="mw-collapsible mw-collapsed">
  
  for(let i = 0; i < snake.length; i++) {
+
'''Код программы Cell на языке JavaScript:''' <div class="mw-collapsible-content">
    ctx.fillStyle = i == 0 ? "blue" : "orange";
+
<syntaxhighlight lang="javascript" line start="1" enclose="div">
    ctx.fillRect(snake[i].x, snake[i].y, box, box);
+
function Cell(i, j) {
   }
+
  this.i = i;
 +
  this.j = j;
 +
  this.walls = [true, true, true, true];
 +
   this.visited = false;
  
   ctx.fillStyle = "black";
+
   this.checkNeighbors = function() {
  ctx.font = "50px Times New Roman";
+
    let neighbors = [];
  ctx.fillText(score, box * 2.5, box * 1.7);
 
  
  let snakeX = snake[0].x;
+
    let top = grid[index(i, j - 1)];
  let snakeY = snake[0].y;
+
    let right = grid[index(i + 1, j)];
 +
    let bottom = grid[index(i, j + 1)];
 +
    let left = grid[index(i - 1, j)];
  
  if(snakeX == food.x && snakeY == food.y) {
+
    if (top && !top.visited) {
     score++;
+
      neighbors.push(top);
     food = {
+
     }
       x: Math.floor((Math.random() * 17 + 1)) * box,
+
     if (right && !right.visited) {
       y: Math.floor((Math.random() * 15 + 3)) * box,
+
       neighbors.push(right);
     };
+
    }
  } else {
+
    if (bottom && !bottom.visited) {
    snake.pop();
+
       neighbors.push(bottom);
  }
+
     }
 +
    if (left && !left.visited) {
 +
      neighbors.push(left);
 +
    }
  
  if(snakeX < box || snakeX > box * 17
+
    if (neighbors.length > 0) {
     || snakeY < 3 * box || snakeY > box * 17)
+
      let r = floor(random(0, neighbors.length));
     clearInterval(game);
+
      return neighbors[r];
 +
    } else {
 +
      return undefined;
 +
    }
 +
  };
 +
  this.highlight = function() {
 +
    let x = this.i * w;
 +
     let y = this.j * w;
 +
    noStroke();
 +
    fill(0, 0, 255, 100);
 +
     rect(x, y, w, w);
 +
  };
  
   if(dir == "left") snakeX -= box;
+
   this.show = function() {
  if(dir == "right") snakeX += box;
+
    let x = this.i * w;
  if(dir == "up") snakeY -= box;
+
    let y = this.j * w;
  if(dir == "down") snakeY += box;
+
    stroke(255);
 +
    if (this.walls[0]) {
 +
      line(x, y, x + w, y);
 +
    }
 +
    if (this.walls[1]) {
 +
      line(x + w, y, x + w, y + w);
 +
    }
 +
    if (this.walls[2]) {
 +
      line(x + w, y + w, x, y + w);
 +
    }
 +
    if (this.walls[3]) {
 +
      line(x, y + w, x, y);
 +
    }
  
  let newHead = {
+
    if (this.visited) {
    x: snakeX,
+
      noStroke();
     y: snakeY
+
      fill(255, 0, 255, 100);
 +
      rect(x, y, w, w);
 +
     }
 
   };
 
   };
 
  eatTail(newHead, snake);
 
 
  snake.unshift(newHead);
 
 
}
 
}
 
let game = setInterval(drawGame, 100);
 
 
 
 
 
 
 
//
 
 
  
 
</syntaxhighlight>
 
</syntaxhighlight>
 
</div>
 
</div>
Вам запрещено изменять защиту статьи. Edit Создать редактором

Обратите внимание, что все добавления и изменения текста статьи рассматриваются как выпущенные на условиях лицензии Public Domain (см. Department of Theoretical and Applied Mechanics:Авторские права). Если вы не хотите, чтобы ваши тексты свободно распространялись и редактировались любым желающим, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого.
НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ МАТЕРИАЛЫ, ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ!

To protect the wiki against automated edit spam, we kindly ask you to solve the following CAPTCHA:

Отменить | Справка по редактированию  (в новом окне)