Score tracks X wins, O wins, draws in-memory for current session. Jenkinsfile rewritten as scripted pipeline with named execute functions and per-branch strategy closures (mirrors BasePipeline pattern). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
70 lines
2.0 KiB
JavaScript
70 lines
2.0 KiB
JavaScript
(function () {
|
|
const WINS = [
|
|
[0,1,2],[3,4,5],[6,7,8],
|
|
[0,3,6],[1,4,7],[2,5,8],
|
|
[0,4,8],[2,4,6]
|
|
];
|
|
|
|
let board, current, over;
|
|
const score = { X: 0, O: 0, draw: 0 };
|
|
const cells = document.querySelectorAll('.cell');
|
|
const status = document.getElementById('status');
|
|
const resetBtn = document.getElementById('reset');
|
|
const scoreX = document.getElementById('score-x');
|
|
const scoreO = document.getElementById('score-o');
|
|
const scoreDraw = document.getElementById('score-draw');
|
|
|
|
function init() {
|
|
board = Array(9).fill(null);
|
|
current = 'X';
|
|
over = false;
|
|
cells.forEach(c => {
|
|
c.textContent = '';
|
|
c.className = 'cell';
|
|
});
|
|
status.textContent = "Player X's turn";
|
|
}
|
|
|
|
function checkWinner() {
|
|
for (const [a, b, c] of WINS) {
|
|
if (board[a] && board[a] === board[b] && board[a] === board[c]) {
|
|
return { winner: board[a], line: [a, b, c] };
|
|
}
|
|
}
|
|
return board.every(Boolean) ? { winner: null, draw: true } : null;
|
|
}
|
|
|
|
function handleClick(e) {
|
|
const idx = parseInt(e.target.dataset.index);
|
|
if (over || board[idx]) return;
|
|
|
|
board[idx] = current;
|
|
const cell = cells[idx];
|
|
cell.textContent = current;
|
|
cell.classList.add('taken', current.toLowerCase());
|
|
|
|
const result = checkWinner();
|
|
if (result) {
|
|
over = true;
|
|
if (result.draw) {
|
|
score.draw++;
|
|
scoreDraw.textContent = score.draw;
|
|
status.textContent = "It's a draw!";
|
|
} else {
|
|
score[result.winner]++;
|
|
(result.winner === 'X' ? scoreX : scoreO).textContent = score[result.winner];
|
|
result.line.forEach(i => cells[i].classList.add('winner'));
|
|
status.textContent = `Player ${result.winner} wins!`;
|
|
}
|
|
} else {
|
|
current = current === 'X' ? 'O' : 'X';
|
|
status.textContent = `Player ${current}'s turn`;
|
|
}
|
|
}
|
|
|
|
cells.forEach(c => c.addEventListener('click', handleClick));
|
|
resetBtn.addEventListener('click', init);
|
|
|
|
init();
|
|
})();
|