Advertisement
retigam

Snake Game in JavaScript

Feb 23rd, 2014
1,268
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <!DOCTYPE html>
  2.  
  3. <html lang="en" xmlns="http://www.w3.org/1999/xhtml">
  4. <head>
  5.     <meta charset="utf-8" />
  6.     <title>Snake Game!</title>
  7.     <style>
  8.         canvas{
  9.             margin-left:42%;
  10.         }
  11.     </style>
  12. </head>
  13. <body>
  14.    <script>
  15.        window.onload = function () {
  16.            var canvas = document.createElement('canvas');
  17.            var ctx = canvas.getContext('2d');
  18.            var score = 0;
  19.            var level = 0;
  20.            var direction = 0;
  21.            var snake = new Array(3);
  22.            var active = true;
  23.            var speed = 200;
  24.  
  25.            //matrix field
  26.            var map = new Array(20);
  27.            for (var i = 0; i < map.length; i++) {
  28.                map[i] = new Array(20);
  29.            }
  30.  
  31.            canvas.width = 204;
  32.            canvas.height = 224;
  33.  
  34.            var body = document.getElementsByTagName('body')[0];
  35.            body.appendChild(canvas);
  36.  
  37.            //adding the snake
  38.            map = dSnake(map);
  39.  
  40.            //adding the food
  41.            map = dFood(map);
  42.            
  43.  
  44.            drawGame();
  45.  
  46.            //keybindings
  47.            window.addEventListener('keydown', function (e) {
  48.                if (e.keyCode === 38 && direction !== 3) {
  49.                    direction = 2;//up
  50.                }
  51.                else if (e.keyCode === 40 && direction !== 2) {
  52.                    direction = 3;//down
  53.                }
  54.                else if (e.keyCode === 37 && direction !== 0) {
  55.                    direction = 1;//left
  56.                }
  57.                else if (e.keyCode === 39 && direction !== 1) {
  58.                    direction = 0;//right
  59.                }
  60.  
  61.            })
  62.  
  63.            function drawGame() {
  64.                //clearing the canvas
  65.                ctx.clearRect(0, 0, canvas.width, canvas.height);
  66.  
  67.                for (var i = snake.length - 1; i >= 0; i--) {
  68.  
  69.                    if (i === 0) {
  70.                        switch (direction) {
  71.                            case 0://right
  72.                                snake[0] = { x: snake[0].x + 1, y: snake[0].y }
  73.                                break;
  74.                            case 1://left
  75.                                snake[0] = { x: snake[0].x - 1, y: snake[0].y }
  76.                                break;
  77.                            case 2://up
  78.                                snake[0] = { x: snake[0].x, y: snake[0].y - 1 }
  79.                                break;
  80.                            case 3://down
  81.                                snake[0] = { x: snake[0].x, y: snake[0].y + 1 }
  82.                                break;
  83.                        }
  84.  
  85.                        //check if the snake hits the wall
  86.                        if (snake[0].x < 0 || snake[0].x >= 20 || snake[0].y < 0 || snake[0].y >= 20) {
  87.                            gameOver();
  88.                            return;
  89.                        }
  90.  
  91.                        //check if we hit a food and add a piece to snake
  92.                        if (map[snake[0].x][snake[0].y] === 1) {
  93.                            score += 1;
  94.                            map = dFood(map);
  95.                            //add a piece to snake
  96.                            snake.push({ x: snake[snake.length - 1].x, y: snake[snake.length - 1].y });
  97.                            map[snake[snake.length - 1].x][snake[snake.length - 1].y] = 2;
  98.                            //if score is 10,20,30... increase lvl(speed)
  99.                            if ((score % 10) == 0) {
  100.                                level += 1;
  101.                            }
  102.                        }
  103.                            //check if the snake hits a part of her body
  104.                        else if (map[snake[0].x][snake[0].y] === 2) {
  105.                            gameOver();
  106.                            return;
  107.                        }
  108.                        map[snake[0].x][snake[0].y] = 2;
  109.                    }
  110.                    else {
  111.                        if (i === (snake.length - 1)) {
  112.                            map[snake[i].x][snake[i].y] = null;
  113.                        }
  114.                        snake[i] = { x: snake[i - 1].x, y: snake[i - 1].y };
  115.                        map[snake[i].x][snake[i].y] = 2;
  116.                    }
  117.                }
  118.  
  119.                //border and score draw
  120.                drawMain();
  121.                //matrix cycling
  122.                for (var x = 0; x < map.length; x++) {
  123.                    for (var y = 0; y < map[0].length; y++) {
  124.                        if (map[x][y] === 1) {
  125.                            ctx.fillStyle = 'red';
  126.                            ctx.fillRect(x * 10, y * 10 + 20, 10, 10);
  127.                        }
  128.                        else if (map[x][y] === 2) {
  129.                            ctx.fillStyle = 'black';
  130.                            ctx.fillRect(x * 10, y * 10 + 20, 10, 10);
  131.                        }
  132.                    }
  133.                }
  134.                //speeding up and leveling
  135.                if (active) {
  136.                    setTimeout(drawGame, speed - (level * 50));
  137.                }
  138.            }
  139.            function drawMain() {
  140.                ctx.lineWidth = 2;
  141.                ctx.strokeStyle = 'black';
  142.                //moving the border to leaving space for interface
  143.                ctx.strokeRect(2, 20, canvas.width - 4, canvas.height - 24);
  144.                ctx.font = "12px sans-serif";
  145.  
  146.                ctx.fillText("Score:" + score + " Level:" + level, 2, 12);
  147.            }
  148.  
  149.            
  150.            
  151.  
  152.            function dFood(map) {
  153.                //random position
  154.                var rX = Math.round(Math.random() * 19);
  155.                var rY = Math.round(Math.random() * 19);
  156.                //not placing the food on the snake
  157.                while (map[rX][rY] === 2) {
  158.                    rX = Math.round(Math.random() * 19);
  159.                    rY = Math.round(Math.random() * 19);
  160.                }
  161.                map[rX][rY] = 1;
  162.                return map;
  163.            }
  164.            
  165.  
  166.  
  167.            function dSnake(map) {
  168.                //random HEAD position
  169.                var rX = Math.round(Math.random() * 19);
  170.                var rY = Math.round(Math.random() * 19);
  171.  
  172.                //the other two body pieces
  173.                while ((rX - snake.length) < 0) {
  174.                    rX = Math.round(Math.random() * 19);
  175.                }
  176.  
  177.                for (var i = 0; i < snake.length; i++) {
  178.                    snake[i] = { x: rX - i, y: rY };
  179.                    map[rX - i][rY] = 2;
  180.                }
  181.                return map;
  182.            }
  183.  
  184.            function gameOver() {
  185.                active = false;
  186.                ctx.clearRect(0, 0, canvas.width, canvas.height);
  187.                ctx.fillStyle = "red";
  188.                ctx.font = "17px sans-serif";
  189.                ctx.fillText("Game Over!", ((canvas.width / 2) - (ctx.measureText("Game Over!").width / 2)), 50);
  190.                ctx.font = "13px sans-serif";
  191.                ctx.fillText("Your Score:" + score, ((canvas.width / 2) - (ctx.measureText("Your Score:" + score).width / 2)), 70);
  192.  
  193.            }
  194.        };
  195.     </script>
  196. </body>
  197. </html>
  198.             Hope you enjoy it :);):D
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement