Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 04.10.2020, 19:25
Аспирант
Отправить личное сообщение для Alena_03 Посмотреть профиль Найти все сообщения от Alena_03
 
Регистрация: 06.09.2020
Сообщений: 57

Как изменить скорость змейки?
Всем привет, отредачить надо код так, чтобы можно было в нём изменить скорость движения змейки, прошу помощи
const canvas = document.getElementById("game"); // вызов канваса
const ctx = canvas.getContext("2d");
const ground = new Image();
ground.src = "img/ground.png";
const foodImg = new Image();
foodImg.src = "img/food.png";
const barImg = new Image();
barImg.src = "img/bar.png";
const tireImg = new Image();
tireImg.src = "img/tire.png";
const pizzaImg = new Image();
pizzaImg.src = "img/pizza.png";
let box = 32;
let score = 0;
var food = {
  x: Math.floor((Math.random() * 17 + 1)) * box, // еда в 
  y: Math.floor((Math.random() * 15 + 3)) * box, // еда в 
};
let snake = [];
snake[0] = {
  x: 9 * box,
  y: 10 * box
};
var bar = {
  x: Math.floor((Math.random() * 17 + 1)) * box,
  y: Math.floor((Math.random() * 15 + 3)) * box, 
};
var tire = {
  x: Math.floor((Math.random() * 17 + 1)) * box,
  y: Math.floor((Math.random() * 15 + 3)) * box,
};

var pizza = {
  x: Math.floor((Math.random() * 17 + 1)) * box,
  y: Math.floor((Math.random() * 15 + 3)) * box, 
};
document.addEventListener("keydown", direction);
let dir;
function direction(event) { 
  if(event.keyCode == 37 && dir != "right") 
    dir = "left";
  else if(event.keyCode == 38 && dir != "down")
    dir = "up";
  else if(event.keyCode == 39 && dir != "left")
    dir = "right";
  else if(event.keyCode == 40 && dir != "up")
    dir = "down";
}
function eatTail(head, arr) {
  for(let i = 0; i < arr.length; i++) {
    // элементов змейки(массива)
    if(head.x == arr[i].x && head.y == arr[i].y)  
      clearInterval(game); // очищаем интервал
  } 
}
function drawGame() {
  ctx.drawImage(ground, 0, 0);
  ctx.drawImage(foodImg, food.x, food.y);
  ctx.drawImage(barImg, bar.x, bar.y);
  ctx.drawImage(tireImg, tire.x, tire.y);
  ctx.drawImage(pizzaImg, pizza.x, pizza.y);
  if (bar.x == food.x && bar.y == food.y) {
    food = {
    x: Math.floor((Math.random() * 17 + 1)) * box, 
    y: Math.floor((Math.random() * 15 + 3)) * box,
  };

    bar = {
    x: Math.floor((Math.random() * 17 + 1)) * box,
    y: Math.floor((Math.random() * 15 + 3)) * box, 
    };
  }

  for(let i = 0; i < snake.length; i++) { // счётчик
    ctx.fillStyle = i == 0 ? "green" : "red";
    ctx.fillRect(snake[i].x, snake[i].y, box, box);
  }


if (food.x == bar.x && food.y == bar.y || food.x == tire.x && food.y == tire.y || bar.x == tire.x && bar.y == tire.y) {
food = {
  x: Math.floor((Math.random() * 17 + 1)) * box, // еда в 
  // случайном месте от 0 до 1, увеличиваем его *17 и +1(от 1)
  // и *box(1 квадратик)
  y: Math.floor((Math.random() * 15 + 3)) * box, // еда в 
  // случайном месте от 0 до 1, увеличиваем его *15 и +3
  // (чтобы не залазила на верхнюю панель)
};

bar = {
  x: Math.floor((Math.random() * 17 + 1)) * box, // еда в 
  // случайном месте от 0 до 1, увеличиваем его *17 и +1(от 1)
  // и *box(1 квадратик)
  y: Math.floor((Math.random() * 15 + 3)) * box, // еда в 
  // случайном месте от 0 до 1, увеличиваем его *15 и +3
  // (чтобы не залазила на верхнюю панель)
};

tire = {
  x: Math.floor((Math.random() * 17 + 1)) * box, // еда в 
  // случайном месте от 0 до 1, увеличиваем его *17 и +1(от 1)
  // и *box(1 квадратик)
  y: Math.floor((Math.random() * 15 + 3)) * box, // еда в 
  // случайном месте от 0 до 1, увеличиваем его *15 и +3
  // (чтобы не залазила на верхнюю панель)
};
}

if (pizza.x == food.x && pizza.y == food.y || pizza.x == bar.x && pizza.y == bar.y || pizza.x == tire.x && pizza.y == tire.y) {
  food = {
  x: Math.floor((Math.random() * 17 + 1)) * box, // еда в 
  // случайном месте от 0 до 1, увеличиваем его *17 и +1(от 1)
  // и *box(1 квадратик)
  y: Math.floor((Math.random() * 15 + 3)) * box, // еда в 
  // случайном месте от 0 до 1, увеличиваем его *15 и +3
  // (чтобы не залазила на верхнюю панель)
};

bar = {
  x: Math.floor((Math.random() * 17 + 1)) * box, // еда в 
  // случайном месте от 0 до 1, увеличиваем его *17 и +1(от 1)
  // и *box(1 квадратик)
  y: Math.floor((Math.random() * 15 + 3)) * box, // еда в 
  // случайном месте от 0 до 1, увеличиваем его *15 и +3
  // (чтобы не залазила на верхнюю панель)
};

tire = {
  x: Math.floor((Math.random() * 17 + 1)) * box, // еда в 
  // случайном месте от 0 до 1, увеличиваем его *17 и +1(от 1)
  // и *box(1 квадратик)
  y: Math.floor((Math.random() * 15 + 3)) * box, // еда в 
  // случайном месте от 0 до 1, увеличиваем его *15 и +3
  // (чтобы не залазила на верхнюю панель)
};

pizza = {
  x: Math.floor((Math.random() * 17 + 1)) * box, // еда в 
  // случайном месте от 0 до 1, увеличиваем его *17 и +1(от 1)
  // и *box(1 квадратик)
  y: Math.floor((Math.random() * 15 + 3)) * box, // еда в 
  // случайном месте от 0 до 1, увеличиваем его *15 и +3
  // (чтобы не залазила на верхнюю панель)
};
}

  ctx.fillStyle = "white"; // шрифт белый
  ctx.font = "50px Arial"; // 50 кегглей шрифт ариал
  ctx.fillText(score, box * 2.5, box * 1.7); // рисуем шрифт
  //(какой текст, коорд.по x и по y (выравниваем число))

  let snakeX = snake[0].x; // координата по иксу
  let snakeY = snake[0].y; // координата по игреку

  if(snakeX == food.x && snakeY == food.y) { // проверяем 
    // если голова змейки на еде, то еду в новом месте
    score++; // добавляем очко
    food = { // ставим еду в новом месте
      x: Math.floor((Math.random() * 17 + 1)) * box, // по x
      y: Math.floor((Math.random() * 15 + 3)) * box, // по y
    };
  } else if(snakeX == pizza.x && snakeY == pizza.y) {
    score += 2; // добавляем очко
    pizza = { // ставим еду в новом месте
      x: Math.floor((Math.random() * 17 + 1)) * box, // по x
      y: Math.floor((Math.random() * 15 + 3)) * box, // по y
    };
  } else {
    snake.pop(); // удаляем последний элемент в змейке
  }

   if(snakeX == bar.x && snakeY == bar.y) { // проверяем 
    // если голова змейки на препятствии, то препятствие в новом месте
    score -= 3; // вычитаем очко
    snake.pop();
    bar = { // ставим еду в новом месте
      x: Math.floor((Math.random() * 17 + 1)) * box, // по x
      y: Math.floor((Math.random() * 15 + 3)) * box, // по y
    };
  }

  if(snakeX == tire.x && snakeY == tire.y) { // проверяем 
    // если голова змейки на препятствии, то препятствие в новом месте
    score--; // вычитаем очко
    snake.pop();
    tire = { // ставим еду в новом месте
      x: Math.floor((Math.random() * 17 + 1)) * box, // по x
      y: Math.floor((Math.random() * 15 + 3)) * box, // по y
    };
  }




  if(score <= -1) {
    clearInterval(game); // завершаем игру(очищением переменной)
  }

  if(snakeX < box || snakeX > box * 17 // чтобы змейка не 
    // выезжала за границы канваса(а точнее туда, где нет 
    // клеток на канвасе)
    || snakeY < 3 * box || snakeY > box * 17)
    clearInterval(game); // завершаем игру(очищением переменной)

  if(dir == "left") snakeX -= box; // передвигаем на 
  // один бокс влево
  if(dir == "right") snakeX += box;
  if(dir == "up") snakeY -= box;
  if(dir == "down") snakeY += box;

  let newHead = { // голова змейки в новых координатах
    x: snakeX,
    y: snakeY
  };

  eatTail(newHead, snake);

  snake.unshift(newHead); // добавляем новый элемент 
  // в самое начало массива
}

let game = setInterval(drawGame, 100); // Вызов функции из вне,
// каждые 100 миллисекунд вызывается]
Ответить с цитированием
  #2 (permalink)  
Старый 06.10.2020, 13:52
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,663

Как здесь, но с интервалом:
let speed = 0,
    calls = 0;

setInterval(() => {

    speed = Math.min(10, Math.floor(score / 5));

    if (++calls % (10 - speed) == 0) {

        // ...

    }
}, 1000 / 60);
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как изменить Select с помощью JS Alex921 Общие вопросы Javascript 4 04.01.2016 16:55
Как изменить значение соседней ячейки ivt22 Элементы интерфейса 1 04.01.2016 16:01
Как изменить заливку SVG user_name Элементы интерфейса 2 21.04.2015 23:36
Как изменить ссылку в слайдере alexvost jQuery 3 13.06.2012 02:24
ActionScript - как изменить значение soundbuftime? Маэстро Flash 6 14.01.2012 15:08