Advertisement
Guest User

Untitled

a guest
Jan 17th, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.22 KB | None | 0 0
  1. <html>
  2. <head>
  3. <title>Test</title>
  4. <script language="javascript">
  5. var scoreElement, score;
  6. var ctx, canvasWidth, canvasHeight;
  7. var gameTimer;
  8. var fieldWidth, fieldHeight, objectRadius;
  9. var snakeDirection, snakeData, foodData;
  10.  
  11. var GAME_SPEED = 65;
  12.  
  13. var OBJECT_WIDTH = 10;
  14. var OBJECT_HEIGHT = 10;
  15.  
  16. var DIRECTION_LEFT = 1;
  17. var DIRECTION_RIGHT = 2;
  18. var DIRECTION_UP = 3;
  19. var DIRECTION_DOWN = 4;
  20.  
  21. var COLOR_FIELD = "DarkKhaki";
  22. var COLOR_SNAKE = "Green";
  23. var COLOR_FOOD = "Gold";
  24.  
  25. var VK_ESCAPE = 27;
  26. var VK_LEFT = 37;
  27. var VK_UP = 38;
  28. var VK_RIGHT = 39;
  29. var VK_DOWN = 40;
  30.  
  31. function drawField() {
  32. ctx.fillStyle = COLOR_FIELD;
  33. ctx.fillRect(0, 0, canvasWidth, canvasHeight);
  34. }
  35.  
  36. function drawSnake() {
  37. var centerX = snakeData[0].x * OBJECT_WIDTH + OBJECT_WIDTH / 2;
  38. var centerY = snakeData[0].y * OBJECT_HEIGHT + OBJECT_HEIGHT / 2;
  39. ctx.fillStyle = COLOR_SNAKE;
  40. ctx.beginPath();
  41. ctx.moveTo(centerX, centerY);
  42. switch (snakeDirection) {
  43. case DIRECTION_LEFT:
  44. ctx.arc(centerX, centerY, objectRadius, -0.75 * Math.PI, 0.75 * Math.PI, false);
  45. break;
  46. case DIRECTION_RIGHT:
  47. ctx.arc(centerX, centerY, objectRadius, 0.25 * Math.PI, -0.25 * Math.PI, false);
  48. break;
  49. case DIRECTION_UP:
  50. ctx.arc(centerX, centerY, objectRadius, -0.25 * Math.PI, 1.25 * Math.PI, false);
  51. break;
  52. case DIRECTION_DOWN:
  53. ctx.arc(centerX, centerY, objectRadius, 0.75 * Math.PI, 0.25 * Math.PI, false);
  54. break;
  55. }
  56. ctx.lineTo(centerX, centerY);
  57. ctx.fill();
  58. for (i = 1; i < snakeData.length; i++) {
  59. ctx.beginPath();
  60. centerX = snakeData[i].x * OBJECT_WIDTH + OBJECT_WIDTH / 2;
  61. centerY = snakeData[i].y * OBJECT_HEIGHT + OBJECT_HEIGHT / 2;
  62. ctx.arc(centerX, centerY, objectRadius, 0, 2 * Math.PI, false);
  63. ctx.fill();
  64. }
  65. }
  66.  
  67. function drawFood() {
  68. var centerX = foodData.x * OBJECT_WIDTH + OBJECT_WIDTH / 2;
  69. var centerY = foodData.y * OBJECT_HEIGHT + OBJECT_HEIGHT / 2;
  70. ctx.fillStyle = COLOR_FOOD;
  71. ctx.beginPath();
  72. ctx.arc(centerX, centerY, objectRadius, 0, 2 * Math.PI, false);
  73. ctx.fill();
  74. }
  75.  
  76. function updateScoreElement() {
  77. if (scoreElement != null) {
  78. scoreElement.innerHTML = score;
  79. }
  80. }
  81.  
  82. function getRandomDirection() {
  83. return Math.floor(Math.random() * 4) + 1;
  84. }
  85.  
  86. function getRandomFood() {
  87. var x, y;
  88. var empty = false;
  89. while (!empty) {
  90. x = Math.floor(Math.random() * (fieldWidth - 1));
  91. y = Math.floor(Math.random() * (fieldHeight - 1));
  92. empty = true;
  93. for (i in snakeData) {
  94. if (snakeData[i][0] == x && snakeData[i][1] == y) {
  95. empty = false;
  96. }
  97. }
  98. }
  99. return {"x": x, "y": y};
  100. }
  101.  
  102. function getNewSnake(headX, headY) {
  103. var tailX, tailY;
  104. switch (snakeDirection) {
  105. case DIRECTION_LEFT:
  106. tailX = headX + 1;
  107. tailY = headY;
  108. break;
  109. case DIRECTION_RIGHT:
  110. tailX = headX - 1;
  111. tailY = headY;
  112. break;
  113. case DIRECTION_UP:
  114. tailX = headX;
  115. tailY = headY + 1;
  116. break;
  117. case DIRECTION_DOWN:
  118. tailX = headX;
  119. tailY = headY - 1;
  120. break;
  121. }
  122. return [{"x": headX, "y": headY}, {"x": tailX, "y": tailY}];
  123. }
  124.  
  125. function moveSnake() {
  126. var i;
  127. switch (snakeDirection) {
  128. case DIRECTION_LEFT:
  129. if (snakeData[0].x > 0) {
  130. for (i = snakeData.length - 1; i >= 1; i--) {
  131. snakeData[i].x = snakeData[i - 1].x;
  132. snakeData[i].y = snakeData[i - 1].y;
  133. }
  134. snakeData[0].x--;
  135. } else {
  136. return false;
  137. }
  138. break;
  139. case DIRECTION_RIGHT:
  140. if (snakeData[0].x < fieldWidth - 1) {
  141. for (i = snakeData.length - 1; i >= 1; i--) {
  142. snakeData[i].x = snakeData[i - 1].x;
  143. snakeData[i].y = snakeData[i - 1].y;
  144. }
  145. snakeData[0].x++;
  146. } else {
  147. return false;
  148. }
  149. break;
  150. case DIRECTION_UP:
  151. if (snakeData[0].y > 0) {
  152. for (i = snakeData.length - 1; i >= 1; i--) {
  153. snakeData[i].x = snakeData[i - 1].x;
  154. snakeData[i].y = snakeData[i - 1].y;
  155. }
  156. snakeData[0].y--;
  157. } else {
  158. return false;
  159. }
  160. break;
  161. case DIRECTION_DOWN:
  162. if (snakeData[0].y < fieldHeight - 1) {
  163. for (i = snakeData.length - 1; i >= 1; i--) {
  164. snakeData[i].x = snakeData[i - 1].x;
  165. snakeData[i].y = snakeData[i - 1].y;
  166. }
  167. snakeData[0].y++;
  168. } else {
  169. return false;
  170. }
  171. break;
  172. }
  173. return true;
  174. }
  175.  
  176. function hasBite() {
  177. var flag = false;
  178. var i = 1;
  179. while (i < snakeData.length && !flag) {
  180. if (snakeData[i].x == snakeData[0].x &&
  181. snakeData[i].y == snakeData[0].y) {
  182. flag = true;
  183. } else {
  184. i++;
  185. }
  186. }
  187. return flag;
  188. }
  189.  
  190. function eatFood(lastX, lastY) {
  191. if (snakeData[0].x == foodData.x && snakeData[0].y == foodData.y) {
  192. snakeData.push({'x': lastX, 'y': lastY});
  193. score++;
  194. updateScoreElement();
  195. foodData = getRandomFood();
  196. }
  197. }
  198.  
  199. function gameKeyDown(e) {
  200. if (gameTimer == null)
  201. return;
  202. if (e.keyCode == VK_ESCAPE) {
  203. clearInterval(gameTimer);
  204. gameTimer = null;
  205. } else if (e.keyCode == VK_LEFT) {
  206. if (snakeDirection != DIRECTION_RIGHT) {
  207. snakeDirection = DIRECTION_LEFT;
  208. }
  209. } else if (e.keyCode == VK_RIGHT) {
  210. if (snakeDirection != DIRECTION_LEFT) {
  211. snakeDirection = DIRECTION_RIGHT;
  212. }
  213. } else if (e.keyCode == VK_UP) {
  214. if (snakeDirection != DIRECTION_DOWN) {
  215. snakeDirection = DIRECTION_UP;
  216. }
  217. } else if (e.keyCode == VK_DOWN) {
  218. if (snakeDirection != DIRECTION_UP) {
  219. snakeDirection = DIRECTION_DOWN;
  220. }
  221. }
  222. }
  223.  
  224. function endGame() {
  225. clearInterval(gameTimer);
  226. gameTimer = null;
  227. }
  228.  
  229. function updateGame() {
  230. var lastX = snakeData[snakeData.length - 1].x;
  231. var lastY = snakeData[snakeData.length - 1].y;
  232. var flag = moveSnake();
  233. if (flag) {
  234. flag = !hasBite();
  235. }
  236. if (flag) {
  237. eatFood(lastX, lastY);
  238. } else {
  239. endGame();
  240. }
  241. drawField();
  242. drawSnake();
  243. drawFood();
  244. }
  245.  
  246. function startGame() {
  247. score = 0;
  248. updateScoreElement();
  249. fieldWidth = canvasWidth / OBJECT_WIDTH;
  250. fieldHeight = canvasHeight / OBJECT_HEIGHT;
  251. if (OBJECT_WIDTH <= OBJECT_HEIGHT)
  252. objectRadius = OBJECT_WIDTH / 2;
  253. else
  254. objectRadius = OBJECT_HEIGHT / 2;
  255. snakeDirection = getRandomDirection();
  256. snakeData = getNewSnake(fieldWidth / 2, fieldHeight / 2);
  257. foodData = getRandomFood();
  258. gameTimer = setInterval(updateGame, GAME_SPEED);
  259. }
  260.  
  261. function init() {
  262. var score = document.getElementById("gameScore");
  263. if (score != null) {
  264. scoreElement = score;
  265. }
  266. var canvas = document.getElementById("gameCanvas");
  267. if (canvas != null) {
  268. canvasWidth = canvas.width;
  269. canvasHeight = canvas.height;
  270. ctx = canvas.getContext("2d");
  271. if (ctx != null) {
  272. document.body.onkeydown = gameKeyDown;
  273. startGame();
  274. } else {
  275. alert("Cannot get 2D context for canvas.");
  276. }
  277. } else {
  278. alert("Game canvas element not found.");
  279. }
  280. }
  281. </script>
  282. </head>
  283. <body onload="init()">
  284. <div><p>SCORE: <span id="gameScore">0</span></p></div>
  285. <div>
  286. <canvas id="gameCanvas" width = "400" height="400">This game requires HTML5 support.</canvas>
  287. </div>
  288. </body>
  289. </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement