7b45e4fbeb
./script.js:9517054/1115 ./index.html:9517054/927 ./style.css:9517054/139
128 lines
2.8 KiB
JavaScript
128 lines
2.8 KiB
JavaScript
const info = document.getElementById("info");
|
|
const canvas = document.getElementById("canvas");
|
|
const ctx = canvas.getContext("2d");
|
|
const game = {
|
|
size: 15,
|
|
snake: {
|
|
body: [
|
|
[3, 7],
|
|
[4, 7],
|
|
[5, 7],
|
|
[6, 7],
|
|
[7, 7],
|
|
],
|
|
dir: null,
|
|
newdir: null,
|
|
},
|
|
apple: [12, 7],
|
|
};
|
|
|
|
// reset the game board (but not the highscore)
|
|
function reset() {
|
|
game.apple = [12, 7];
|
|
game.snake.body = [
|
|
[3, 7],
|
|
[4, 7],
|
|
[5, 7],
|
|
[6, 7],
|
|
[7, 7],
|
|
];
|
|
game.snake.dir = null;
|
|
game.snake.newdir = null;
|
|
}
|
|
|
|
// check if the x and y coordinate is part of the snek
|
|
function inSnake(x, y) {
|
|
for (let part of game.snake.body) {
|
|
if (part[0] === x && part[1] === y) return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
// draw the game board
|
|
function draw() {
|
|
const size = 25;
|
|
ctx.clearRect(0, 0, 500, 500);
|
|
for (let i = 0; i < game.size; i++) {
|
|
for (let j = 0; j < game.size; j++) {
|
|
ctx.fillStyle = inSnake(i, j)
|
|
? "#38e070"
|
|
: i === game.apple[0] && j === game.apple[1]
|
|
? "#eb4034"
|
|
: "#333333";
|
|
ctx.fillRect(i * size, j * size, size, size);
|
|
}
|
|
}
|
|
}
|
|
|
|
// update the game board
|
|
function update() {
|
|
game.snake.dir = game.snake.newdir;
|
|
|
|
const b = game.snake.body;
|
|
const l = b[b.length - 1];
|
|
const next = move();
|
|
|
|
// check if the snek ate the apple
|
|
if (game.apple[0] === next[0] && game.apple[1] === next[1]) {
|
|
const x = Math.floor(Math.random() * game.size);
|
|
const y = Math.floor(Math.random() * game.size);
|
|
game.apple = [x, y];
|
|
} else {
|
|
b.shift();
|
|
}
|
|
|
|
// check if the snek crashed into itself
|
|
if (inSnake(next[0], next[1])) {
|
|
reset();
|
|
}
|
|
|
|
// check if the snek fell out of the world
|
|
if (l[0] < 0 || l[0] >= game.size || l[1] < 0 || l[1] >= game.size) {
|
|
reset();
|
|
}
|
|
|
|
b.push(next); // move the snek
|
|
|
|
// update score display
|
|
if(game.dir !== null) info.innerText = `${b.length < 15 ? "length" : "longth"}: ${b.length - 5}`;
|
|
|
|
// calculate where the snek will move to
|
|
function move() {
|
|
const [x, y] = l;
|
|
switch (game.snake.dir) {
|
|
case "left":
|
|
return [x - 1, y];
|
|
case "right":
|
|
return [x + 1, y];
|
|
case "up":
|
|
return [x, y - 1];
|
|
case "down":
|
|
return [x, y + 1];
|
|
default:
|
|
return [x, y];
|
|
}
|
|
}
|
|
}
|
|
|
|
// change direction on keypress
|
|
document.addEventListener("keydown", (e) => {
|
|
const s = game.snake;
|
|
if(s.dir !== s.newdir) update();
|
|
switch (e.key) {
|
|
case "ArrowLeft":
|
|
return s.dir !== "right" ? (s.newdir = "left") : 0;
|
|
case "ArrowRight":
|
|
return s.dir !== "left" ? (s.newdir = "right") : 0;
|
|
case "ArrowUp":
|
|
return s.dir !== "down" ? (s.newdir = "up") : 0;
|
|
case "ArrowDown":
|
|
return s.dir !== "up" ? (s.newdir = "down") : 0;
|
|
}
|
|
});
|
|
|
|
// the main game loop
|
|
setInterval(() => {
|
|
update();
|
|
draw();
|
|
}, 1000 / 15);
|