diff --git a/script.js b/script.js index 7df65f1..bde773b 100644 --- a/script.js +++ b/script.js @@ -1,8 +1,8 @@ /* Задание * - * 1. Добавить управление - * 2. Каждая из сторон при пресечении должна перемещать на противоположенную - * 3. Добавить рандомное появление еды (подсказка: надо навешивать на ячейки класс food) + * 1. Добавить управление + * 2. Каждая из сторон при пресечении должна перемещать на противоположенную + * 3. Добавить рандомное появление еды (подсказка: надо навешивать на ячейки класс food) * 4. Размер змейки должен увеличиваться * 5*. Научиться увеличивать сокрость игры при увеличении количества очков * 6**. Придумать новую фичу и реализовать @@ -13,18 +13,23 @@ var snakeGame = (function () { //Константы оформляются в особом стиле const WIDTH = 10; const HEIGHT = 10; - + foodOnField = false; let headX = 0; let headY = 0; - let dx = 1; - let dy = 0; + dx = 0; + dy = 1; let currentStep = 1; + let playStep = () => { - headX += dx; - headY += dy; + if(!foodOnField) placeFood(); + headX = (headX + dx) % 10; + headY = (headY + dy) % 10; let newHeadCell = getCell(headX, headY); - + if (hasClass(newHeadCell, "food")){ + removeFoodFromCell(newHeadCell); + foodOnField = false; + } removeSnakeCells(); addSnakeToCell(newHeadCell); setCellStep(newHeadCell, currentStep); @@ -33,6 +38,20 @@ var snakeGame = (function () { return true; } + let placeFood = () => { + while(true) { + let foodX = Math.floor(Math.random() * 10); + let foodY = Math.floor(Math.random() * 10); + console.log(foodX + " " + foodY); + let cell = getCell(foodX, foodY); + if(!hasClass(cell, "snake")) { + addFoodToCell(cell); + foodOnField = true; + return; + } + } + } + let removeSnakeCells = () => { for (let snakeCell of getSnakeCells()) removeSnakeFromCell(snakeCell); @@ -40,7 +59,7 @@ var snakeGame = (function () { let getCell = (x, y) => { // Можно находить элементы DOM по id - return document.getElementById(y + '_' + x); + return document.getElementById((HEIGHT + y) % HEIGHT + '_' + (WIDTH + x) % WIDTH); } let getSnakeCells = () => { @@ -51,13 +70,21 @@ var snakeGame = (function () { let addSnakeToCell = cell => { // Строчка className может включать несколько классов, например "class1 class2". // Поэтому добавляем пробел. - cell.className += ' snake'; + cell.className += ' snake '; + } + + let addFoodToCell = cell => { + cell.className += ' food '; } let removeSnakeFromCell = cell => { cell.className = cell.className.replace('snake', ''); } + let removeFoodFromCell = cell => { + cell.className = cell.className.replace('food', ''); + } + let setCellStep = (cell, step) => { // Есть соглашение, что пользовательские атрибуты называются с префикса "data-". cell.setAttribute('data-step', step); @@ -68,6 +95,7 @@ var snakeGame = (function () { return new Number(cell.getAttribute('data-step')); } + // Только этот объект будет доступен извне. return { getScore: 0, @@ -75,6 +103,19 @@ var snakeGame = (function () { } })(); // Используем IIFE (Immediately Invoked Function Expression) для изоляции. +function checkTurnPossibility(dx1, dy1) { + if((Math.abs(dx1) - Math.abs(dx) === 0) || (Math.abs(dy1) - Math.abs(dy) === 0)) + return; + else { + dx = dx1; + dy = dy1; + } +} + +function hasClass(element, cls) { + return (' ' + element.className + ' ').indexOf(' ' + cls + ' ') > -1; +} + // Главный цикл игры. let timer = setInterval(function () { if (!snakeGame.playStep()) @@ -83,12 +124,15 @@ let timer = setInterval(function () { clearInterval(timer); alert('Game Over! Score: ' + snakeGame.getScore()); } -}, 500); +}, 200); // Обработка действий пользователя. document.onkeydown = e => { switch (e.keyCode) { - // http://keycode.info/ + case 68: checkTurnPossibility(1, 0); break; + case 87: checkTurnPossibility(0, -1); break; + case 65: checkTurnPossibility(-1, 0); break; + case 83: checkTurnPossibility(0, 1); break; } } \ No newline at end of file