-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.js
134 lines (123 loc) · 3.21 KB
/
main.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
let board = ['', '', '', '', '', '', '', '', ''];
let human = 'X';
let computer = 'O';
let currentPlayer = human;
function updateBoard(index) {
board[index] = currentPlayer;
document.getElementById(index).innerText = currentPlayer;
document.getElementById(index).removeEventListener('click', handleClick);
checkForWinner();
currentPlayer = currentPlayer === human ? computer : human;
if (currentPlayer === computer) {
setTimeout(computerMove, 300);
}
}
function handleClick(event) {
updateBoard(event.target.id);
}
const winningCombinations = [
[0, 1, 2],
[3, 4, 5],
[6, 7, 8],
[0, 3, 6],
[1, 4, 7],
[2, 5, 8],
[0, 4, 8],
[2, 4, 6],
];
function checkForWinner() {
for (let i = 0; i < winningCombinations.length; i++) {
const [a, b, c] = winningCombinations[i];
if (board[a] && board[a] === board[b] && board[a] === board[c]) {
alert(`${board[a]} wins!`);
resetBoard();
return;
}
}
if (board.every((cell) => cell !== '')) {
alert("It's a tie!");
resetBoard();
}
}
function resetBoard() {
board = ['', '', '', '', '', '', '', '', ''];
document.querySelectorAll('.square').forEach((square) => {
square.innerText = '';
square.addEventListener('click', handleClick);
});
}
function computerMove() {
const emptySquares = board.reduce((acc, value, index) => {
if (value === '') {
acc.push(index);
}
return acc;
}, []);
const bestMoves = findBestMoves(emptySquares);
const move = bestMoves[Math.floor(Math.random() * bestMoves.length)];
updateBoard(move);
}
function findBestMoves(emptySquares) {
let bestMoves = [];
let bestScore = -Infinity;
for (let i = 0; i < emptySquares.length; i++) {
board[emptySquares[i]] = computer;
const score = minimax(0, false);
board[emptySquares[i]] = '';
if (score > bestScore) {
bestScore = score;
bestMoves = [emptySquares[i]];
} else if (score === bestScore) {
bestMoves.push(emptySquares[i]);
}
}
return bestMoves;
}
function minimax(depth, isMaximizing) {
const result = checkForMinimaxWinner();
if (result !== null) {
return result;
}
if (isMaximizing) {
let bestScore = -Infinity;
for (let i = 0; i < board.length; i++) {
if (board[i] === '') {
board[i] = computer;
const score = minimax(depth + 1, false);
board[i] = '';
bestScore = Math.max(score, bestScore);
}
}
return bestScore;
} else {
let bestScore = Infinity;
for (let i = 0; i < board.length; i++) {
if (board[i] === '') {
board[i] = human;
const score = minimax(depth + 1, true);
board[i] = '';
bestScore = Math.min(score, bestScore);
}
}
return bestScore;
}
}
function checkForMinimaxWinner() {
for (let i = 0; i < winningCombinations.length; i++) {
const [a, b, c] = winningCombinations[i];
if (board[a] && board[a] === board[b] && board[a] === board[c]) {
if (board[a] === computer) {
return 10;
} else {
return -10;
}
}
}
if (board.every((cell) => cell !== '')) {
return 0;
}
return null;
}
document.querySelectorAll('.square').forEach((square) => {
square.addEventListener('click', handleClick);
});