Snake Game using Javascript

Language
In this tutorial, I am going to teach on how to create a snake game in javascript. Just download the source code and follow the instructions below.

DIRECTIONS

HTML Code

  1. <<!DOCTYPE HTML>
  2.   <head>
  3.     <style>
  4.       body {
  5.         margin: 0px;
  6.         padding: 0px;
  7.                 background-color:#eee;
  8.                
  9.       }
  10.          
  11.     </style>
  12.   </head>
  13.   <body>
  14.  
  15.     <canvas id="myCanvas" width="640" height="640" style="border:1px solid #000000;margin:0px auto;width:800px;"></canvas>
  16.  
  17.     <script>
  18.       var canvas = document.getElementById('myCanvas');
  19.       var context = canvas.getContext('2d');
  20.     </script>
  21. <script src="snake_core.js"></script>
  22.  
  23.  
  24.   </body>
  25. </html>

Javascript Code

  1. window.addEventListener("keydown", moveSnake, false);
  2. var game_over = false;
  3. var snake = new Array(4);
  4. var snakeLen = 4;
  5. var dir = "right";
  6. var food = "";
  7. var level = new Array();
  8. var total_height = 640;
  9. var total_width = 640;
  10. var lvl_width = 20;
  11. var lvl_height = 20;
  12. var speed = 16;
  13.  
  14. snakeHeadImage = new Image();
  15. snakeHeadImage.src = "resources/head.png";
  16. snakeBodyImage = new Image();
  17. snakeBodyImage.src = "resources/body.png";
  18. snakeTailImage = new Image();
  19. snakeTailImage.src = "resources/tail.png";
  20.  
  21. //food
  22. foodImage = new Image();
  23. foodImage.src = "resources/food.png";
  24.  
  25. create_snake();
  26. create_food();
  27.  
  28. for(i = 0; i < lvl_width; i++)
  29. {
  30.         level[i] = new Array(lvl_height);
  31.         for(var ii = 0; ii < lvl_height; ii++)
  32.         {
  33.                 level[i][ii] = -1;
  34.         }
  35. }
  36.  
  37. window.requestAnimFrame = (function(callback)
  38. {
  39.         return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame ||
  40.         function(callback)
  41.         {
  42.                 window.setTimeout(callback, 1000);
  43.         };
  44. })();
  45.  
  46.  
  47. var the_date = new Date();
  48. var test1 = the_date.getTime();
  49. var stamp = the_date.getTime() + 250;
  50.  
  51. function animate()
  52. {
  53.         the_date = new Date();
  54.         test1 = the_date.getTime();
  55.         if(stamp <= test1)
  56.         {
  57.                 move_snake();
  58.                 the_date = new Date();
  59.                 stamp = the_date.getTime() + 250;
  60.         }
  61.         if(game_over == false)
  62.         {
  63.                 // clear
  64.                 context.clearRect(0, 0, canvas.width, canvas.height);
  65.                 displayText("Score: " + (snakeLen - 4));
  66.                 display();
  67.         }
  68.         else
  69.         {
  70.                 displayText("You so Sux.. Game Over homie");
  71.         }
  72.         //context.drawImage(aniblock, aniblock_x, aniblock_y);
  73.  
  74.         // request new frame
  75.         requestAnimFrame(function()
  76.         {
  77.           animate();
  78.         });
  79. }
  80.  
  81. function displayText(what)
  82. {
  83.         context.font = "30px Arial";
  84.         context.fillText(what, 50, 50);
  85. }
  86.  
  87. function checkSnakeCollide()
  88. {
  89.         if( snake[0].xx == food.xx && snake[0].yy == food.yy )
  90.         {
  91.                 create_food();
  92.                 return true;
  93.         }
  94.         else
  95.         {
  96.                 //if head moving right
  97.                 if(dir == "right")
  98.                 {
  99.                         if(snake[0].xx > lvl_width - 1)
  100.                         {
  101.                                 game_over = true;
  102.                         }
  103.                 }
  104.                 else if(dir == "left")
  105.                 {
  106.                         if(snake[0].xx < 0)
  107.                         {
  108.                                 game_over = true;
  109.                         }
  110.                 }
  111.                 else if(dir == "up")
  112.                 {
  113.                         if(snake[0].yy <= -1)
  114.                         {
  115.                                 game_over = true;
  116.                         }
  117.                 }
  118.                 else if(dir = "down")
  119.                 {
  120.                         if(snake[0].yy >= lvl_height)
  121.                         {
  122.                                 game_over = true;
  123.                         }
  124.                 }
  125.                
  126.                 for(i = 2; i < snakeLen; i++)
  127.                 {
  128.                         if( (snake[0].xx == snake[i].xx) && (snake[0].yy == snake[i].yy) )
  129.                         {
  130.                                 game_over = true;
  131.                                 break;
  132.                         }
  133.                 }
  134.                
  135.                 return false;
  136.         }
  137. }
  138.  
  139. setTimeout(function() {
  140. animate();
  141. }, 1000);
  142.  
  143. function moveSnake(e)
  144. {
  145.     switch(e.keyCode)
  146.         {
  147.         case 37:
  148.                         if(dir != "right")
  149.                         {
  150.                                 dir = "left";
  151.                         }
  152.             break;
  153.                 case 38:
  154.                         if(dir != "down")
  155.                         {
  156.                                 dir = "up";
  157.                         }
  158.                         break;
  159.         case 39:
  160.                         if(dir != "left")
  161.                         {
  162.                                 dir = "right";
  163.                         }                      
  164.                         break;
  165.         case 40:
  166.                         if(dir != "up")
  167.                         {
  168.                                 dir = "down";
  169.                         }
  170.             break;  
  171.     }  
  172. }
  173.  
  174. function checkAllowMove(x, y)
  175. {
  176.         if(x < 32)
  177.         {
  178.                 var x_index = 0;
  179.         }
  180.         else
  181.         {
  182.                 var x_index = Math.round(x / 32);
  183.         }
  184.        
  185.         if(y < 32)
  186.         {
  187.                 var y_index = 19;
  188.         }
  189.         else
  190.         {
  191.                 var y_index = (total_height / 32) - Math.round(y / 32);
  192.         }
  193.        
  194.         if(level[x_index][y_index] == -1)
  195.         {
  196.                 return true;
  197.         }
  198.         else
  199.         {
  200.                 return false;
  201.         }
  202. }
  203.  
  204. function create_food()
  205. {
  206.         var x = 0;
  207.         var y = 0;
  208.         var recreate = false;
  209.         do
  210.         {
  211.                 recreate = false;
  212.                 x =  Math.floor((Math.random() * (lvl_width-1)));
  213.                 y =  Math.floor((Math.random() * (lvl_height-1)));
  214.                
  215.                 for(i = 0; i < snakeLen; i++)
  216.                 {
  217.                         if( (snake[i].xx == x) && (snake[i].yy == y) )
  218.                         {
  219.                                 recreate = true;
  220.                                 break;
  221.                         }
  222.                 }
  223.         }while(recreate == true);
  224.         food = {xx: x, yy: y};
  225. }
  226.  
  227. function create_snake()
  228. {
  229.         //var x =  Math.floor((Math.random() * (lvl_width-1)));
  230.         //var y =  Math.floor((Math.random() * (lvl_height-1)));
  231.         snake[0] = {xx: 4, yy: 1};
  232.         snake[1] = {xx: 3, yy: 1};
  233.         snake[2] = {xx: 2, yy: 1};
  234.         snake[3] = {xx: 1, yy: 1};
  235.         dir = "right";
  236. }
  237.  
  238. function move_snake()
  239. {
  240.         var temp_x = 0;
  241.         var temp_y = 0;
  242.         var temp_xx = 0;
  243.         var temp_yy = 0;
  244.         var swap = true;
  245.  
  246.         //move snake forward
  247.         for(var ii = 0; ii < snakeLen; ii++)
  248.         {              
  249.                 if(ii == 0)
  250.                 {
  251.                         temp_x = snake[ii].xx;
  252.                         temp_y = snake[ii].yy;
  253.  
  254.                         //if head moving right
  255.                         if(dir == "right")
  256.                         {
  257.                                 snake[0] = {xx: (snake[0].xx + 1), yy: snake[0].yy};
  258.                         }
  259.                         else if(dir == "left")
  260.                         {
  261.                                 snake[0] = {xx: (snake[0].xx - 1), yy: snake[0].yy};
  262.                         }
  263.                         else if(dir == "up")
  264.                         {
  265.                                 snake[0] = {xx: snake[0].xx, yy: (snake[0].yy - 1)};
  266.                         }
  267.                         else if(dir = "down")
  268.                         {
  269.                                 snake[0] = {xx: snake[0].xx, yy: (snake[0].yy + 1)};
  270.                         }
  271.                        
  272.                         if(checkSnakeCollide())
  273.                         {
  274.                                 snake.push({xx: snake[(snake.length-1)].xx, yy: snake[(snake.length-1)].yy});
  275.                                 snakeLen++;
  276.                         }
  277.                 }
  278.                 else
  279.                 {
  280.                         if(swap == true)
  281.                         {
  282.                                 temp_xx = snake[ii].xx;
  283.                                 temp_yy = snake[ii].yy;
  284.                                 snake[ii] = {xx: temp_x, yy: temp_y};
  285.  
  286.                                 swap = false;
  287.                         }
  288.                         else
  289.                         {
  290.                                 temp_x = snake[ii].xx;
  291.                                 temp_y = snake[ii].yy;
  292.                                 snake[ii] = {xx: temp_xx, yy: temp_yy};
  293.                                 swap = true;
  294.                         }
  295.                 }
  296.         }
  297.  
  298. }
  299.  
  300. function display()
  301. {
  302.        
  303.         for(var i = 0; i < snakeLen; i++)
  304.         {
  305.                 if(i == 0)
  306.                 {
  307.                         switch (dir)
  308.                         {
  309.                                 case "left":
  310.                                         context.drawImage(snakeHeadImage, (snake[i].xx * 32), (snake[i].yy * 32) );
  311.                                         break;
  312.                                 case "right":
  313.                                         drawRotatedImage(snakeHeadImage,(snake[i].xx * 32), (snake[i].yy * 32), 180);
  314.                                         break;
  315.                                 case "up":
  316.                                         drawRotatedImage(snakeHeadImage,(snake[i].xx * 32), (snake[i].yy * 32), 90);
  317.                                         break;
  318.                                 case "down":
  319.                                         drawRotatedImage(snakeHeadImage,(snake[i].xx * 32), (snake[i].yy * 32), 270);
  320.                                         break;
  321.                         }
  322.                 }
  323.                 else if(i == (snakeLen - 1) )
  324.                 {
  325.                         //following left
  326.                         if(snake[i].xx > snake[i-1].xx)
  327.                         {
  328.                                 context.drawImage(snakeTailImage, (snake[i].xx * 32), (snake[i].yy * 32) );
  329.                         }
  330.                         //following right
  331.                         else if(snake[i].xx < snake[i-1].xx)
  332.                         {
  333.                                 drawRotatedImage(snakeTailImage,(snake[i].xx * 32), (snake[i].yy * 32), 180);
  334.                         }
  335.                         //following up
  336.                         else if(snake[i].yy > snake[i-1].yy)
  337.                         {
  338.                                 drawRotatedImage(snakeTailImage,(snake[i].xx * 32), (snake[i].yy * 32), 90);
  339.                         }
  340.                         //following down
  341.                         else if(snake[i].yy < snake[i-1].yy)
  342.                         {
  343.                                 drawRotatedImage(snakeTailImage,(snake[i].xx * 32), (snake[i].yy * 32), 270);
  344.                         }
  345.                 }
  346.                 else
  347.                 {
  348.                         context.drawImage(snakeBodyImage, (snake[i].xx * 32), (snake[i].yy * 32) );
  349.                 }
  350.  
  351.         }
  352.        
  353.         context.drawImage(foodImage, (food.xx * 32), (food.yy * 32) );
  354.  
  355. }
  356.  
  357. function drawRotatedImage(image, x, y, angle)
  358. {
  359.         var TO_RADIANS = Math.PI/180;
  360.  
  361.         // save the current co-ordinate system
  362.         // before we screw with it
  363.         context.save();
  364.  
  365.         // move to the middle of where we want to draw our image
  366.         context.translate(x, y);
  367.  
  368.         // rotate around that point, converting our
  369.         // angle from degrees to radians
  370.         context.rotate(angle * TO_RADIANS);
  371.  
  372.         // draw it up and to the left by half the width
  373.         // and height of the image
  374.         context.drawImage(image, -(image.width/2), -(image.height/2));
  375.  
  376.         // and restore the co-ords to how they were when we began
  377.         context.restore();
  378. }
If you have any questions and suggestions just comment below or email me at [email protected]. Hope this simple project will help to in your systems or projects.

Note: Due to the size or complexity of this submission, the author has submitted it as a .zip file to shorten your download time. After downloading it, you will need a program like Winzip to decompress it.

Virus note: All files are scanned once-a-day by SourceCodester.com for viruses, but new viruses come out every day, so no prevention program can catch 100% of them.

FOR YOUR OWN SAFETY, PLEASE:

1. Re-scan downloaded files using your personal virus checker before using it.
2. NEVER, EVER run compiled files (.exe's, .ocx's, .dll's etc.)--only run source code.

Add new comment