-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscript-v2.js
More file actions
315 lines (263 loc) · 7.18 KB
/
Copy pathscript-v2.js
File metadata and controls
315 lines (263 loc) · 7.18 KB
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
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
//#region Variáveis globais
let board = [];
let currentPlayer = "X";
let difficulty = "easy";
//#endregion
//#region Eventos
// Adicione um ouvinte de evento onchange ao <select>
const selectElement = document.getElementById("difficulty");
selectElement.addEventListener("change", handleDifficultyChange);
//#endregion
//#region Métodos úteis
// Método para gerar aletóriamente um numero 0 ou 1;
function randomZeroOrOne() {
// Gere um número aleatório entre 0 e 1 (inclusive)
const randomNumber = Math.random();
// Arredonde o número para 0 ou 1
const result = Math.round(randomNumber);
return result;
}
// Função para lidar com a mudança no <select>
function handleDifficultyChange() {
const selectElement = document.getElementById("difficulty");
const selectedOption = selectElement.value;
// Defina o novo nível de dificuldade na variável global
difficulty = selectedOption;
}
//#endregion
//#region Funções de check
// Função para verificar se o jogo terminou (alguém venceu ou empatou)
function checkGameOver() {
return checkWinner("X") || checkWinner("O") || checkDraw();
}
// Função para verificar o vencedor
function checkWinner(player) {
// Verificar linhas
for (let i = 0; i < 3; i++) {
if (
board[i][0] === player &&
board[i][1] === player &&
board[i][2] === player
) {
return true;
}
}
// Verificar colunas
for (let i = 0; i < 3; i++) {
if (
board[0][i] === player &&
board[1][i] === player &&
board[2][i] === player
) {
return true;
}
}
// Verificar diagonais
if (
board[0][0] === player &&
board[1][1] === player &&
board[2][2] === player
) {
return true;
}
if (
board[0][2] === player &&
board[1][1] === player &&
board[2][0] === player
) {
return true;
}
return false;
}
// Função para verificar empate
function checkDraw() {
for (let row = 0; row < 3; row++) {
for (let col = 0; col < 3; col++) {
if (board[row][col] === "") {
return false; // Ainda existem células vazias, o jogo não é um empate.
}
}
}
return true; // Todas as células estão preenchidas, é um empate.
}
//#endregion
//#region Funções de estratégia.
// Função para fazer uma jogada aleatória
function makeRandomMove() {
let emptyCells = [];
// Encontra todas as células vazias
for (let row = 0; row < 3; row++) {
for (let col = 0; col < 3; col++) {
if (board[row][col] === "") {
emptyCells.push({ row, col });
}
}
}
// Escolhe uma célula vazia aleatoriamente
const randomIndex = Math.floor(Math.random() * emptyCells.length);
const selectedCell = emptyCells[randomIndex];
// Faz a jogada do computador
const row = selectedCell.row;
const col = selectedCell.col;
board[row][col] = "O";
const cell = document.querySelector(`[data-row="${row}"][data-col="${col}"]`);
cell.textContent = "O";
// Verifica o resultado após a jogada do computador
if (checkWinner("O")) {
alert("O computador venceu!");
resetGame();
} else if (checkDraw()) {
alert("Empate!");
resetGame();
} else {
currentPlayer = "X";
}
}
// Função para a estratégia de jogada do computador (nível "hard")
function makeHardMove() {
// Verifica se há uma ação de vitória iminente para o computador
for (let row = 0; row < 3; row++) {
for (let col = 0; col < 3; col++) {
if (board[row][col] === "") {
board[row][col] = "O";
if (checkWinner("O")) {
// Se a jogada levar à vitória, faça essa jogada
updateBoard(row, col);
return;
}
board[row][col] = ""; // Desfaz a jogada
}
}
}
// Verifica se há uma ação de derrota iminente para o jogador humano
for (let row = 0; row < 3; row++) {
for (let col = 0; col < 3; col++) {
if (board[row][col] === "") {
board[row][col] = "X";
if (checkWinner("X")) {
// Bloqueia a vitória do jogador humano
updateBoard(row, col);
return;
}
board[row][col] = ""; // Desfaz a jogada
}
}
}
// Se não há ação de vitória iminente ou derrota iminente, faça uma jogada aleatória
makeRandomMove();
}
function makeMediumMove() {
const numRandom = randomZeroOrOne();
if (numRandom === 1) {
makeRandomMove();
} else {
makeHardMove();
}
}
//#endregion
//#region Funções do tabuleiro
// Função para iniciar o jogo
function startGame() {
const difficultySelect = document.getElementById("difficulty");
difficulty = difficultySelect.value;
createBoard();
}
// Função para fazer uma jogada e atualizar o tabuleiro
function updateBoard(row, col) {
board[row][col] = "O";
const cell = document.querySelector(`[data-row="${row}"][data-col="${col}"]`);
cell.textContent = "O";
// Verifica o resultado após a jogada do computador
if (checkWinner("O")) {
alert("O computador venceu!");
resetGame();
} else if (checkDraw()) {
alert("Empate!");
resetGame();
} else {
currentPlayer = "X";
}
}
// Função para criar o tabuleiro
function createBoard() {
const boardElement = document.getElementById("board");
boardElement.innerHTML = "";
for (let row = 0; row < 3; row++) {
const rowArray = [];
for (let col = 0; col < 3; col++) {
const cell = document.createElement("div");
cell.dataset.row = row;
cell.dataset.col = col;
cell.addEventListener("click", cellClick);
rowArray.push("");
boardElement.appendChild(cell);
}
board.push(rowArray);
}
}
// Função para lidar com o clique nas células
function cellClick(event) {
const row = event.target.dataset.row;
const col = event.target.dataset.col;
if (board[row][col] === "" && !checkGameOver()) {
event.target.textContent = currentPlayer;
board[row][col] = currentPlayer;
if (checkWinner(currentPlayer)) {
alert(`O jogador ${currentPlayer} venceu!`);
resetGame();
return;
}
if (checkDraw()) {
alert("Empate!");
resetGame();
return;
}
currentPlayer = currentPlayer === "X" ? "O" : "X";
// Se o computador estiver jogando (dificuldade média ou difícil)
if (currentPlayer === "O") {
setTimeout(computerMove, 500);
}
}
}
// Função para resetar o jogo
function resetGame() {
board = [];
currentPlayer = "X";
createBoard();
}
//#endregion
//#region Movimento do Computador
// Função para a jogada do computador
function computerMove() {
if (currentPlayer !== "O") {
return;
}
computerMoveStrategy(difficulty);
}
// Função para a estratégia de jogada do computador
function computerMoveStrategy(difficulty) {
switch (difficulty) {
case "easy":
// Jogada aleatória (nível fácil)
makeRandomMove();
break;
case "medium":
// Jogada aleatória entre fácil e dificil.
makeMediumMove();
break;
case "hard":
// Jogada de nível dificil.
makeHardMove();
break;
}
}
// Função para a jogada do computador (nível "hard")
function computerMoveHard() {
if (currentPlayer !== "O") {
return;
}
makeHardMove();
}
//#endregion
// Iniciar o jogo quando a página carregar
window.onload = startGame;