JSFiddle - React, Tailwind, and code Playground
by Ilmv
JavaScript
var JS_SNAKE = {};
JS_SNAKE.equalCoordinates = function (coord1, coord2) {
return coord1[0] === coord2[0] && coord1[1] === coord2[1];
}
JS_SNAKE.checkCoordinateInArray = function (coord, arr) {
var isInArray = false;
$.each(arr, function (index, item) {
if (JS_SNAKE.equalCoordinates(coord, item)) {
isInArray = true;
}
});
return isInArray;
};
JS_SNAKE.game = (function () {
var canvas, ctx;
var $canvas;
var counter = 0;
var frameLength;
var snake;
var apple;
var score;
var timeout;
JS_SNAKE.width = 200;
JS_SNAKE.height = 200;
JS_SNAKE.blockSize = 10;
JS_SNAKE.widthInBlocks = JS_SNAKE.width / JS_SNAKE.blockSize;
JS_SNAKE.heightInBlocks = JS_SNAKE.height / JS_SNAKE.blockSize;
function init() {
$canvas = $('#jsSnake');
if ($canvas.length === 0) {
$('body').append('<canvas id="jsSnake">');
}
var $canvas = $('canvas');
$canvas.attr('width', JS_SNAKE.width);
$canvas.attr('height', JS_SNAKE.height);
canvas = $canvas[0];
ctx = canvas.getContext('2d');
ctx.fillStyle = "black";
score = 0;
frameLength = 50;
snake = JS_SNAKE.snake(ctx);
apple = JS_SNAKE.apple(ctx);
bindEvents();
gameLoop();
}
function gameLoop() {
counter++;
ctx.clearRect(0, 0, JS_SNAKE.width, JS_SNAKE.height);
snake.advance(apple);
draw();
if (snake.checkCollision()) {
snake.retreat(); //move snake back to previous position
snake.draw(); //draw snake in its previous position
gameOver();
}
else {
timeout = setTimeout(gameLoop, frameLength);
}
}
function draw() {
snake.draw();
drawBorder();
apple.draw();
drawScore();
}
function drawScore() {
ctx.save();
ctx.font = 'bold 102px sans-serif';
ctx.fillStyle = 'rgba(0, 0, 0, 0.3)';
ctx.textAlign = 'center';
ctx.textBaseline = 'middle';
var centreX = JS_SNAKE.width / 2;
var centreY = JS_SNAKE.width / 2;
...