Skip to content

Instantly share code, notes, and snippets.

@ZiKT1229
Forked from straker/README.md
Created November 6, 2018 07:03
Show Gist options
  • Save ZiKT1229/5935a10ce818ea7b851ea85ecf55b4da to your computer and use it in GitHub Desktop.
Save ZiKT1229/5935a10ce818ea7b851ea85ecf55b4da to your computer and use it in GitHub Desktop.
Basic Snake HTML Game

Basic Snake HTML Game

Snake is a fun game to make as it doesn't require a lot of code (less than 100 lines with all comments removed). This is a basic implementation of the snake game, but it's missing a few things intentionally and they're left as further exploration for the reader.

Further Exploration

  • Score
    • When the snake eats an apple, the score should increase by one. Use context.fillText() to display the score to the screen
  • Mobile and touchscreen support
  • Better apple spawning
    • Currently the apple spawns in any random grid in the game, even if the snake is already on that spot. Improve it so it only spanws in empty grid locations
<!DOCTYPE html>
<html>
<head>
<title></title>
<style>
html, body {
height: 100%;
margin: 0;
}
body {
background: black;
display: flex;
align-items: center;
justify-content: center;
}
canvas {
border: 1px solid white;
}
</style>
</head>
<body>
<canvas width="400" height="400" id="game"></canvas>
<script>
var canvas = document.getElementById('game');
var context = canvas.getContext('2d');
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
// @see https://stackoverflow.com/a/1527820/2124254
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 = 'red';
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) {
// prevent snake from backtracking on itself by checking that it's
// not already moving on the same axis (pressing left while moving
// left won't do anything, and pressing right while moving left
// shouldn't let you collide with your own body)
// left arrow key
if (e.which === 37 && snake.dx === 0) {
snake.dx = -grid;
snake.dy = 0;
}
// up arrow key
else if (e.which === 38 && snake.dy === 0) {
snake.dy = -grid;
snake.dx = 0;
}
// right arrow key
else if (e.which === 39 && snake.dx === 0) {
snake.dx = grid;
snake.dy = 0;
}
// down arrow key
else if (e.which === 40 && snake.dy === 0) {
snake.dy = grid;
snake.dx = 0;
}
});
// start the game
requestAnimationFrame(loop);
</script>
</body>
</html>
@ZuuZoo
Copy link

ZuuZoo commented Nov 9, 2023

How can i change that to everytime when the snake ates a apple it's spawns a new delayed and i don't want the delay. How can i fix that?

@J0513-301
Copy link

J0513-301 commented Nov 9, 2023

How do I set it to tell the player if it win or lose

So In the code there’s a function (this one): `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;
  } `

So after snake.dy = 0; the game is restarting so you can put anything after that line to make it show the player won or lost. I suggest making a div that is blank from the start and then the game restart function makes the div equal to a specific text such as you died. To make a you won screen you would have to implement a few more things depending on what you consider as winning. Let me know if you need any more help

@ImthySafa
Copy link

Nice bro

@svenwlive
Copy link

Please help me with adding the score to the game. I'm not very good with programming, so im hoping someone is able to at least show me anything.
image
currently it looks something like this.

@J0513-301
Copy link

Please help me with adding the score to the game. I'm not very good with programming, so im hoping someone is able to at least show me anything.
image
currently it looks something like this.

So the picture is what it’s supposed to look like, so you are on the right track. Can you let me know what Software your using to place the code in? That way I know how to better assist you, and you can also check my previous comments and replies as I have answered similar questions before. Let me know =]

@svenwlive
Copy link

Please help me with adding the score to the game. I'm not very good with programming, so im hoping someone is able to at least show me anything.
image
currently it looks something like this.

So the picture is what it’s supposed to look like, so you are on the right track. Can you let me know what Software your using to place the code in? That way I know how to better assist you, and you can also check my previous comments and replies as I have answered similar questions before. Let me know =]

Im using VS Code connected to GitHub with codespaces.

@NwDEVIN
Copy link

NwDEVIN commented Apr 11, 2024

@J-zinu
Copy link

J-zinu commented May 14, 2024

@J-zinu
Copy link

J-zinu commented May 14, 2024

How do I control it(keys)?

you set key down arrows

triggered on key down not on key press

there is key down code

left = 37
up = 38
right = 39
down = 40

keep this values and you set this trigger code

@J-zinu
Copy link

J-zinu commented May 14, 2024

게임에 점수를 추가할 수 있도록 도와주세요. 저는 프로그래밍을 잘 하지 못해서 누군가가 최소한 무엇이든 보여줄 수 있기를 바랍니다. image 현재 이런 모습입니다.

you should apply this HTML code

take this example code

https://www.w3schools.com/graphics/game_score.asp

flowing this URL that's sample code and try your self

@J-zinu
Copy link

J-zinu commented May 14, 2024

how make a score btw?

you should apply this HTML code

take this example code

https://www.w3schools.com/graphics/game_score.asp

flowing this URL that's sample code and try your self

@J-zinu
Copy link

J-zinu commented May 14, 2024

Please help me with adding the score to the game. I'm not very good with programming, so im hoping someone is able to at least show me anything.
image
currently it looks something like this.

So the picture is what it’s supposed to look like, so you are on the right track. Can you let me know what Software your using to place the code in? That way I know how to better assist you, and you can also check my previous comments and replies as I have answered similar questions before. Let me know =]

Im using VS Code connected to GitHub with codespaces.

hello you should apply this HTML CODE

take this example code

https://www.w3schools.com/graphics/game_score.asp

flowing this url that's sample code
and you need score and you want this.

some code is not you want, but this code is simple and easy

@harisonfekadu
Copy link

I embedded this game into a QR code. Check it out here!

@jasicarose75
Copy link

jasicarose75 commented Oct 20, 2024

This was one of my first games written by me. Now I write much more complex games, including gambling. Recently I read about online casinos in Alberta, for me this is a new level. I want to create a poker game for the phone in the near future. It will take a lot of time, because I am still working, but it is possible to write code little by little.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment