-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsnake.js
148 lines (118 loc) · 3.6 KB
/
snake.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
const cvs = document.getElementById("snake");
const ctx = cvs.getContext("2d");
const btnReset = document.getElementById("btn");
// carregando os arquivos de áudio
const colidir = new Audio();
const comer = new Audio();
const esquerda = new Audio();
const cima = new Audio();
const direita = new Audio();
const baixo = new Audio();
colidir.src = "audio/dead.mp3"
comer.src = "audio/eat.mp3"
esquerda.src = "audio/left.mp3"
cima.src = "audio/up.mp3"
direita.src = "audio/right.mp3"
baixo.src = "audio/down.mp3"
// criando as unidades (caixas)
const box = 32;
// criando os load das imagens (chão - ground e comida)
const ground = new Image();
ground.src = "img/ground.png";
const foodImg = new Image();
foodImg.src = "img/food.png";
// criando a snake (cobrinha)
let snake = [];
snake[0] = {
x : 9 * box, // 9 * 32
y : 10 * box // 10 * 32
}
// criando a comida Randômica
let food = {
x : Math.floor(Math.random()*17+1) * box,
y : Math.floor(Math.random()*15+3) * box
}
// criando os pontos do jogo
let score = 0;
//criar um botão reset
btnReset.addEventListener("click", function btnReset(){
location.reload();
})
// controle da snake (cobrinha)
let d;
document.addEventListener("keydown", direction);
// condição : caso a snake estiver indo para direita não teria como ir para esquerda logo apertando a tecla
function direction(event){
let key = event.keyCode;
if( key == 37 && d != "RIGHT"){
esquerda.play();
d = "LEFT";
}else if( key == 38 && d != "DOWN" ){
cima.play();
d = "UP";
}else if( key == 39 && d != "LEFT" ){
direita.play();
d = "RIGHT";
}else if( key == 40 && d != "UP" ){
baixo.play();
d = "DOWN";
}
}
// função para verificar a colisão da cobra
function collision(head, array){
for(let i = 0; i < array.length; i++){
if(head.x == array[i].x && head.y == array[i].y){
return true; // caso tenha colisão vai retornar verdadeiro
}
}
return false;// caso não tenha colisão vai retornar falso
}
// desenhar tudo na tela
function draw(){
ctx.drawImage(ground,0,0);
for (let i = 0; i < snake.length ; i++){
ctx.fillStyle = (i == 0)? "green" : "white";
ctx.fillRect(snake[i].x,snake[i].y,box,box);
ctx.strokeStyle = "red";
ctx.strokeRect(snake[i].x,snake[i].y,box,box);
}
ctx.drawImage(foodImg, food.x, food.y ); // chamada para a comida aparecer Randômica
// posição antiga da cabeça da cobra
let snakeX = snake[0].x;
let snakeY = snake[0].y;
// qual direção
if(d == "LEFT") snakeX -= box;
if(d == "UP") snakeY -= box;
if(d == "RIGHT") snakeX += box;
if(d == "DOWN") snakeY += box;
// evento da cobra comer a comida
if(snakeX == food.x && snakeY == food.y){
score++;
comer.play();
food = {
x : Math.floor(Math.random()*17+1) * box,
y : Math.floor(Math.random()*15+3) * box
}
// não vai remover a cauda
}else{
// remover a cauda da cobra
snake.pop();
}
// adicionar uma nova cabeça
let newHead = {
x : snakeX,
y : snakeY
}
// game over
if(snakeX < box || snakeX > 17 * box || snakeY < 3 * box || snakeY > 17 * box || collision(newHead, snake)){
clearInterval(game);
colidir.play();
alert("Game Over !"+" "+"Pontos: "+ score);
}
snake.unshift(newHead);
ctx.fillStyle = "white";
ctx.font = "45px Roboto";
ctx.fillText(score, 2*box, 1.6*box);
}
// função de desenho de chamada a cada 100 ms
let game = setInterval(draw,100);