@progerstas

Как сделать чтоб змейка не ломалась на куски?

Я хочу сделать так, чтоб если змейка съедала яблоко, у нее появлялся новый блок в конце. Для этого, если координаты головы змейки и яблока совпадают, я изменяю переменную addNewBlock на координаты последнего блока, а затем, после того как змейка подвинулась на 1 шаг (последний элемент переместился вперед), добавляю новый блок в конец змейки. Но почему то он добавляется неправильно и змейка дробится на части.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Snake</title>
</head>
<body>
    <canvas id="game" width="600px" height="600px" style="border: 5px solid;"></canvas>

    <script>
        // Values
        var game = document.getElementById("game")
        var ctx = game.getContext('2d')
        var snakeSize = 30
        var direction = 2
        var snake = [[10, 10], [10, 11], [10, 12]]
        var apple = newApple()
        var addNewBlock = false

        // creating new apple
        function newApple() {
            return [Math.floor(Math.random() * 21) * 30, Math.floor(Math.random() * 21) * 30]
        }

        // changing direction of moving
        function changeDirection(event) {
            if (event.code == 'KeyA' && direction != 2) {direction = 0}
            else if (event.code == 'KeyW' && direction != 3) {direction = 1}
            else if (event.code == 'KeyD' && direction != 0) {direction = 2}
            else if (event.code == 'KeyS' && direction != 1) {direction = 3}
        }
        document.addEventListener('keydown', changeDirection);

        // game cycle
        setInterval(function() {
            // cleaning
            ctx.clearRect(0, 0, game.width, game.height)
            
            // checking if snake eat apple
            var prevSnake = snake.slice();
            if (apple[0] / 30 == snake[0][0] && apple[1] / 30 == snake[0][1]) {
                addNewBlock = snake[snake.length - 1]
                console.log(addNewBlock)
                apple = newApple()
            }

            // moving
            if (direction == 0) {
                snake[snake.length - 1][0] = snake[0][0] - 1; snake[snake.length - 1][1] = snake[0][1]
            }
            else if (direction == 1) {
                snake[snake.length - 1][1] = snake[0][1] - 1; snake[snake.length - 1][0] = snake[0][0]
            }
            else if (direction == 2) {
                snake[snake.length - 1][0] = snake[0][0] + 1; snake[snake.length - 1][1] = snake[0][1]
            }
            else if (direction == 3) {
                snake[snake.length - 1][1] = snake[0][1] + 1; snake[snake.length - 1][0] = snake[0][0]
            }
            var newHead = snake[snake.length - 1]
            snake.splice(snake.length - 1, 1)
            snake.unshift(newHead)

            if (addNewBlock) {
                console.log(addNewBlock)
                snake.push(addNewBlock)
                addNewBlock = false
            }
            
            

            // rendering
            for (let block in snake) {
                ctx.fillStyle = "black"
                ctx.fillRect(snake[block][0] * 30, snake[block][1] * 30, snakeSize, snakeSize)
            }
            ctx.fillStyle = "black"
            ctx.fillRect(apple[0], apple[1], snakeSize, snakeSize)
        }, (750));
    </script>
</body>
</html>
  • Вопрос задан
  • 127 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы