142 lines
4.5 KiB
JavaScript
142 lines
4.5 KiB
JavaScript
class TicTacToeGame {
|
|
constructor() {
|
|
this.board = ['', '', '', '', '', '', '', '', ''];
|
|
this.currentPlayer = 'X';
|
|
this.gameActive = true;
|
|
this.scores = {
|
|
X: parseInt(localStorage.getItem('scoreX') || '0'),
|
|
O: parseInt(localStorage.getItem('scoreO') || '0'),
|
|
draw: parseInt(localStorage.getItem('scoreDraw') || '0')
|
|
};
|
|
|
|
this.initializeGame();
|
|
}
|
|
|
|
initializeGame() {
|
|
this.renderBoard();
|
|
this.updateScores();
|
|
this.updateCurrentPlayer();
|
|
|
|
// Add event listeners
|
|
document.getElementById('reset-btn').addEventListener('click', () => this.resetGame());
|
|
document.getElementById('reset-scores-btn').addEventListener('click', () => this.resetScores());
|
|
}
|
|
|
|
renderBoard() {
|
|
const gameBoard = document.getElementById('game-board');
|
|
gameBoard.innerHTML = '';
|
|
|
|
this.board.forEach((cell, index) => {
|
|
const cellElement = document.createElement('div');
|
|
cellElement.classList.add('cell');
|
|
cellElement.textContent = cell;
|
|
|
|
if (cell === 'X') cellElement.classList.add('x');
|
|
if (cell === 'O') cellElement.classList.add('o');
|
|
|
|
cellElement.addEventListener('click', () => this.makeMove(index));
|
|
gameBoard.appendChild(cellElement);
|
|
});
|
|
}
|
|
|
|
makeMove(index) {
|
|
if (this.board[index] !== '' || !this.gameActive) return;
|
|
|
|
this.board[index] = this.currentPlayer;
|
|
this.renderBoard();
|
|
|
|
const winResult = this.checkWinner();
|
|
if (winResult.isWin) {
|
|
this.handleWin(winResult.winner, winResult.winningCells);
|
|
} else if (this.isBoardFull()) {
|
|
this.handleDraw();
|
|
} else {
|
|
this.switchPlayer();
|
|
}
|
|
}
|
|
|
|
checkWinner() {
|
|
const winPatterns = [
|
|
[0, 1, 2], [3, 4, 5], [6, 7, 8], // Rows
|
|
[0, 3, 6], [1, 4, 7], [2, 5, 8], // Columns
|
|
[0, 4, 8], [2, 4, 6] // Diagonals
|
|
];
|
|
|
|
for (const pattern of winPatterns) {
|
|
const [a, b, c] = pattern;
|
|
if (this.board[a] && this.board[a] === this.board[b] && this.board[a] === this.board[c]) {
|
|
return { isWin: true, winner: this.board[a], winningCells: pattern };
|
|
}
|
|
}
|
|
|
|
return { isWin: false, winner: null, winningCells: [] };
|
|
}
|
|
|
|
isBoardFull() {
|
|
return this.board.every(cell => cell !== '');
|
|
}
|
|
|
|
handleWin(winner, winningCells) {
|
|
this.gameActive = false;
|
|
this.scores[winner]++;
|
|
localStorage.setItem(`score${winner}`, this.scores[winner].toString());
|
|
|
|
// Highlight winning cells
|
|
const cells = document.querySelectorAll('.cell');
|
|
winningCells.forEach(index => {
|
|
cells[index].classList.add('winning-cell');
|
|
});
|
|
|
|
document.getElementById('game-status').textContent = `玩家 ${winner} 获胜!`;
|
|
this.updateScores();
|
|
}
|
|
|
|
handleDraw() {
|
|
this.gameActive = false;
|
|
this.scores.draw++;
|
|
localStorage.setItem('scoreDraw', this.scores.draw.toString());
|
|
|
|
document.getElementById('game-status').textContent = '平局!';
|
|
this.updateScores();
|
|
}
|
|
|
|
switchPlayer() {
|
|
this.currentPlayer = this.currentPlayer === 'X' ? 'O' : 'X';
|
|
this.updateCurrentPlayer();
|
|
}
|
|
|
|
updateCurrentPlayer() {
|
|
document.getElementById('current-player').textContent = this.currentPlayer;
|
|
}
|
|
|
|
resetGame() {
|
|
this.board = ['', '', '', '', '', '', '', '', ''];
|
|
this.currentPlayer = 'X';
|
|
this.gameActive = true;
|
|
|
|
document.getElementById('game-status').textContent = '游戏中';
|
|
this.renderBoard();
|
|
this.updateCurrentPlayer();
|
|
}
|
|
|
|
resetScores() {
|
|
this.scores = { X: 0, O: 0, draw: 0 };
|
|
localStorage.setItem('scoreX', '0');
|
|
localStorage.setItem('scoreO', '0');
|
|
localStorage.setItem('scoreDraw', '0');
|
|
|
|
this.updateScores();
|
|
this.resetGame();
|
|
}
|
|
|
|
updateScores() {
|
|
document.getElementById('score-x').textContent = this.scores.X;
|
|
document.getElementById('score-o').textContent = this.scores.O;
|
|
document.getElementById('score-draw').textContent = this.scores.draw;
|
|
}
|
|
}
|
|
|
|
// Initialize the game when the page loads
|
|
document.addEventListener('DOMContentLoaded', () => {
|
|
new TicTacToeGame();
|
|
}); |