-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
169 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,169 @@ | ||
<!DOCTYPE html> | ||
|
||
<!-- forked by Woland from Steven Lambert's Basic Snake HTML and JavaScript Game --> | ||
|
||
<html> | ||
<head> | ||
<title> Snake Game With Vim Keys </title> | ||
<meta charset="UTF-8"> | ||
<style> | ||
html, body { | ||
height: 100%; | ||
margin: 0; | ||
} | ||
|
||
body { | ||
background:#3C3836; | ||
display: flex; | ||
align-items: center; | ||
justify-content: center; | ||
} | ||
canvas { | ||
border: 1px solid #a89984; | ||
} | ||
</style> | ||
</head> | ||
<body> | ||
<canvas width="600" height="600" id="game"></canvas> | ||
<script> | ||
var canvas = document.getElementById('game'); | ||
var context = canvas.getContext('2d'); | ||
|
||
// the canvas width & height, snake x & y, and the apple x & y, all need to be a multiples of the grid size in order for collision detection to work | ||
// (e.g. 16 * 25 = 400) | ||
var grid = 16; | ||
var count = 0; | ||
|
||
var snake = { | ||
x: 160, | ||
y: 160, | ||
|
||
// snake velocity. moves one grid length every frame in either the x or y direction | ||
dx: grid, | ||
dy: 0, | ||
|
||
// keep track of all grids the snake body occupies | ||
cells: [], | ||
|
||
// length of the snake. grows when eating an apple | ||
maxCells: 4 | ||
}; | ||
var apple = { | ||
x: 320, | ||
y: 320 | ||
}; | ||
|
||
// get random whole numbers in a specific range | ||
function getRandomInt(min, max) { | ||
return Math.floor(Math.random() * (max - min)) + min; | ||
} | ||
|
||
// game loop | ||
function loop() { | ||
requestAnimationFrame(loop); | ||
|
||
// slow game loop to 15 fps instead of 60 (60/15 = 4) | ||
if (++count < 4) { | ||
return; | ||
} | ||
|
||
count = 0; | ||
context.clearRect(0,0,canvas.width,canvas.height); | ||
|
||
// move snake by it's velocity | ||
snake.x += snake.dx; | ||
snake.y += snake.dy; | ||
|
||
// wrap snake position horizontally on edge of screen | ||
if (snake.x < 0) { | ||
snake.x = canvas.width - grid; | ||
} | ||
else if (snake.x >= canvas.width) { | ||
snake.x = 0; | ||
} | ||
|
||
// wrap snake position vertically on edge of screen | ||
if (snake.y < 0) { | ||
snake.y = canvas.height - grid; | ||
} | ||
else if (snake.y >= canvas.height) { | ||
snake.y = 0; | ||
} | ||
|
||
// keep track of where snake has been. front of the array is always the head | ||
snake.cells.unshift({x: snake.x, y: snake.y}); | ||
|
||
// remove cells as we move away from them | ||
if (snake.cells.length > snake.maxCells) { | ||
snake.cells.pop(); | ||
} | ||
|
||
// draw apple | ||
context.fillStyle = 'orange'; | ||
context.fillRect(apple.x, apple.y, grid-1, grid-1); | ||
|
||
// draw snake one cell at a time | ||
context.fillStyle = 'green'; | ||
snake.cells.forEach(function(cell, index) { | ||
|
||
// drawing 1 px smaller than the grid creates a grid effect in the snake body so you can see how long it is | ||
context.fillRect(cell.x, cell.y, grid-1, grid-1); | ||
|
||
// snake ate apple | ||
if (cell.x === apple.x && cell.y === apple.y) { | ||
snake.maxCells++; | ||
|
||
// canvas is 400x400 which is 25x25 grids | ||
apple.x = getRandomInt(0, 25) * grid; | ||
apple.y = getRandomInt(0, 25) * grid; | ||
} | ||
|
||
// check collision with all cells after this one (modified bubble sort) | ||
for (var i = index + 1; i < snake.cells.length; i++) { | ||
|
||
// snake occupies same space as a body part. reset game | ||
if (cell.x === snake.cells[i].x && cell.y === snake.cells[i].y) { | ||
snake.x = 160; | ||
snake.y = 160; | ||
snake.cells = []; | ||
snake.maxCells = 4; | ||
snake.dx = grid; | ||
snake.dy = 0; | ||
|
||
apple.x = getRandomInt(0, 25) * grid; | ||
apple.y = getRandomInt(0, 25) * grid; | ||
} | ||
} | ||
}); | ||
} | ||
|
||
// listen to keyboard events to move the snake | ||
document.addEventListener('keydown', function(e) { | ||
|
||
// left H | ||
if (e.which === 72 && snake.dx === 0) { | ||
snake.dx = -grid; | ||
snake.dy = 0; | ||
} | ||
// up K | ||
else if (e.which === 75 && snake.dy === 0) { | ||
snake.dy = -grid; | ||
snake.dx = 0; | ||
} | ||
// right L | ||
else if (e.which === 76 && snake.dx === 0) { | ||
snake.dx = grid; | ||
snake.dy = 0; | ||
} | ||
// down J | ||
else if (e.which === 74 && snake.dy === 0) { | ||
snake.dy = grid; | ||
snake.dx = 0; | ||
} | ||
}); | ||
|
||
// start the game | ||
requestAnimationFrame(loop); | ||
</script> | ||
</body> | ||
</html> |