-
Notifications
You must be signed in to change notification settings - Fork 0
/
script.js
170 lines (147 loc) · 4.55 KB
/
script.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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
// Criando elemento canvas e definindo contexto 2D (também pode ser 3d ou bitmap)
const canvas = document.getElementById("gameCanvas");
const ctx = canvas.getContext('2d');
// cores usadas
const snkColor = 'white';
const aplColor = 'red';
// Dimensoes do canvas
const width = canvas.width;
const height = canvas.height;
// criando a cobrinha
ctx.fillStyle = snkColor;
ctx.fillRect(50, 50, 10, 10);
// tamanho de cada bloco da cobra
const snakeSize = 20;
const spawn = 0
// Lista contendo um dicionario com as posições dos blocos da cobra
let snake = [
{x: spawn, y: spawn}
]
// movimentos vertical e horizontal
movement = {
dx: 0,
dy: snakeSize,
up: function() {
// Prevents turning in the opposite direction
if (this.dy > 0) {
return;
}
this.dy = snakeSize * -1; // Tornando o vetor vertical negativo
this.dx = 0; // Zerando dx para mover apenas verticalmente
},
down: function () {
if (this.dy < 0) {
return;
}
this.dy = snakeSize;
this.dx = 0;
},
left: function () {
if (this.dx > 0) {
return;
}
this.dx = snakeSize * -1;
this.dy = 0;
},
right: function() {
if (this.dx < 0) {
return;
}
this.dx = snakeSize;
this.dy = 0;
}
}
document.addEventListener('keydown', function(event) {
let key = event.key;
if (key == 'ArrowLeft') { // Para a tecla esquerda
movement.left();
}
else if (key == 'ArrowUp') { // Para a tecla para cima
movement.up()
}
else if (key == 'ArrowRight') { // Para a tecla direita
movement.right()
}
else if (key == 'ArrowDown') { // Para a tecla para baixo
movement.down()
}
})
// função de checar se valor está nos limites do canvas
function bounds(pos) {
if (pos >= width) {
pos = 0;
}
else if (pos < 0) {
pos = width;
}
return pos;
}
// função de desenhar a cobra, que limpa o canvas a cada frame e preenche o canvas na posição indicada em cada elemento da lista
function drawSnake() {
ctx.clearRect(0, 0, width, height);
ctx.fillStyle = snkColor;
snake.forEach(part => {
ctx.fillRect(part.x, part.y, snakeSize, snakeSize)
});
}
// random createApple position
function randomPos() {
x = Math.floor(Math.random()*(width/snakeSize)) * snakeSize;
y = Math.floor(Math.random()*(width/snakeSize)) * snakeSize;
return {x, y};
}
function drawApple(x, y) {
ctx.fillStyle = aplColor;
ctx.fillRect(x, y, snakeSize, snakeSize);
}
let applePos = randomPos();
let score = 0;
function UpdateScore() {
let ScoreDiv = document.getElementById("score");
ScoreDiv.innerHTML = `Score: ${score+=1}`;
}
// Função de esconder o botão restart e reiniciar o jogo
function restart() {
let restartButton = document.getElementById("restart-button");
restartButton.style.transform = "scale(0)";
score = 0;
game=setInterval(gameloop, 100);
}
// Mostra o botão restart ao receber gameover
function showRestart() {
let restartButton = document.getElementById("restart-button");
restartButton.style.transform = "scale(1)";
}
// função de atualizar a posição da cobra
function updateSnake() {
// Atualiza a cabeça da cobra, ao pegar a posição atual da cabeça e somar com o vetor de direção
const head = {x: bounds(snake[0].x + movement.dx), y: bounds(snake[0].y + movement.dy) };
// Adiciona a cabeça ao inicio do array
snake.unshift(head);
// Colisão com self, checa todas as posições da cobra e vê se bate com a cabeça
for (let i = 1; i < snake.length; i++) {
if (head.x == snake[i].x && head.y == snake[i].y) {
clearInterval(game);
snake.length = 2;
snake[0].x = spawn, snake[0].y=spawn;
showRestart();
}
}
// Remove a ultima parte da cobra
snake.pop();
// Cria uma nova maçã no contato, e aumenta o tamanho da cobra
if (head.x == applePos.x && head.y == applePos.y) {
applePos = randomPos();
let lastSegment = snake[snake.length-1];
let newSegment = {x: lastSegment, y: lastSegment};
snake.push(newSegment);
UpdateScore();
}
}
// função principal
function gameloop() {
drawSnake();
drawApple(applePos.x, applePos.y);
updateSnake();
}
game = setInterval(gameloop, 100);