<!DOCTYPE html> <html lang="de"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> html{ font-family: system-ui, sans-serif; } body{ display:flex; flex-direction:column; align-items: center; width: 360px; margin:auto; } table{ border-spacing:0px; border-collapse: collapse; } td{ box-sizing: border-box; display: inline-grid; place-items: center; width:100px; height:100px; background:blue; font-weight:bold; font-size: 4em; cursor:pointer; user-select: none; margin:2px; } td:hover{ background: silver; } button{ margin: 1em 0; font-size:2em; padding: 0.25em 1em; font-weight:bold; } ::backdrop { opacity: 0.75; backdrop-filter: blur(3px); } </style> </head> <body> <h1>TicTacToe</h1> <table id=board></table> <button>new Game</button> <dialog id=dialog> <h2 id=winner></h2> <form method="dialog"> <button>OK</button> </form> </dialog> <script> var player = "X" const clearBoard = () => board.innerHTML = '<tr><td><td><td>'.repeat(3) clearBoard() board.onclick = (el, cell=el.target) => { if (cell.tagName == 'TD' && cell.innerText == ''){ cell.innerText = player cell.style.background = "silver" let vert = diaglr = diagrl = '' for (let i=0; i<3; i++){ let row = board.rows[i].cells vert += row[cell.cellIndex].textContent diaglr += row[i].textContent diagrl += row[2-i].textContent } if ([cell.parentNode.textContent, vert, diaglr, diagrl].includes(player.repeat(3))){ winner.textContent=`Winner player "${player}" !` dialog.showModal() } else { if(board.textContent.length==9){ winner.textContent="The game ends in a tie" dialog.showModal() } } player = player === 'X' ? 'O' : 'X' } } document.querySelectorAll('button').forEach( el => el.addEventListener('click', () => clearBoard())) </script> </body> </html>
This HTML and JavaScript code represents a simple implementation of the Tic-Tac-Toe game. Let me explain the code step by step:
HTML Part:
<!DOCTYPE html> <html lang="de"> <head> <!-- Meta tags for character set and viewport settings --> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <!-- Internal CSS styles for the document --> <style> /* CSS styles for various HTML elements */ </style> </head> <body> <!-- Game title and game board rendered as a table --> <h1>TicTacToe</h1> <table id=board></table> <!-- Button to start a new game and a dialog box for displaying game results --> <button>new Game</button> <dialog id=dialog> <h2 id=winner></h2> <!-- Form inside the dialog box with an OK button --> <form method="dialog"> <button>OK</button> </form> </dialog> <script> // JavaScript code for game logic </script> </body> </html>
CSS Part:
- The CSS styles define the appearance of various HTML elements, including the game board cells, buttons, and dialog box. It sets the layout, colors, and interactions for the Tic-Tac-Toe game.
JavaScript Part:
-
Initialization:
-
var player = "X"
initializes the current player as "X". -
const clearBoard = () => board.innerHTML = '<tr><td><td><td>'.repeat(3)
clears the game board by resetting the inner HTML of the table to three rows with three empty cells each.
-
-
Event Handling:
-
board.onclick
handles click events on the game board. It checks if a clicked cell is empty and sets it to the current player ("X" or "O"). It then checks for winning conditions in rows, columns, and diagonals. If a player wins, a dialog is displayed with the winner's message. If the game ends in a tie, a tie message is displayed.
-
-
document.querySelectorAll('button').forEach(...)
adds a click event listener to all buttons in the document. When a button is clicked, it calls theclearBoard
function to reset the game board.
// Initialize the current player as "X" var player = "X"; // Function to clear the game board by resetting HTML content const clearBoard = () => board.innerHTML = '<tr><td><td><td>'.repeat(3); // Clear the board when the page loads clearBoard(); // Event handler for clicks on the game board board.onclick = (el, cell = el.target) => { // Check if the clicked element is a cell and is empty if (cell.tagName == 'TD' && cell.innerText == '') { // Set the cell text to the current player ("X" or "O") cell.innerText = player; cell.style.background = "silver"; // Variables to store values of current row, column, and diagonals let vert = diaglr = diagrl = ''; // Loop through rows to check for winning conditions for (let i = 0; i < 3; i++) { let row = board.rows[i].cells; vert += row[cell.cellIndex].textContent; // Vertical diaglr += row[i].textContent; // Diagonal from top-left to bottom-right diagrl += row[2 - i].textContent; // Diagonal from top-right to bottom-left } // Check if any of the winning conditions are met if ([cell.parentNode.textContent, vert, diaglr, diagrl].includes(player.repeat(3))) { // Display winner message in the dialog box winner.textContent = `Winner player "${player}" !`; dialog.showModal(); } else { // If the board is full and there is no winner, display a tie message if (board.textContent.length == 9) { winner.textContent = "The game ends in a tie"; dialog.showModal(); } } // Switch players for the next turn player = player === 'X' ? 'O' : 'X'; } }; // Event listener for all buttons to start a new game document.querySelectorAll('button').forEach( el => el.addEventListener('click', () => clearBoard()) );
Overall Summary:
This code creates a functional Tic-Tac-Toe game. Players can click on the cells to make their moves, and the game checks for win or draw conditions after each move. The game interface includes a "new Game" button to reset the board and a dialog box to display the game result messages. The styling is kept minimal, focusing on the game functionality.
Top comments (0)