Download templates/client.html from Geek7/players2: direct link, hf CLI and curl.
- Browser
- Download file 3.28 kB
-
https://huggingface.co/spaces/Geek7/players2/resolve/main/templates/client.html
- Command line
-
hf download hf://spaces/Geek7/players2/templates/client.html
-
curl -L -o client.html https://huggingface.co/spaces/Geek7/players2/resolve/main/templates/client.html
3.28 kB
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8" /> | |
| <title>Online Checkers</title> | |
| <style> | |
| body { font-family: sans-serif; text-align: center; } | |
| table { border-collapse: collapse; margin: 20px auto; } | |
| td { | |
| width: 60px; height: 60px; text-align: center; vertical-align: middle; | |
| border: 1px solid #444; font-size: 24px; | |
| } | |
| .black { background-color: #444; color: white; } | |
| .red { background-color: red; color: white; } | |
| .empty { background-color: #eee; } | |
| .highlight { background-color: yellow ; } | |
| </style> | |
| </head> | |
| <body> | |
| <h1>Online Checkers</h1> | |
| <p id="status">Connecting...</p> | |
| <table id="board"></table> | |
| <script src="https://cdn.socket.io/4.7.2/socket.io.min.js"></script> | |
| <script> | |
| const socket = io(); | |
| let myColor = null; | |
| let selected = null; | |
| const boardElement = document.getElementById('board'); | |
| const statusElement = document.getElementById('status'); | |
| socket.on('connect', () => { | |
| const name = prompt("Enter your name:"); | |
| socket.emit('set_name', { name: name || 'Player' }); | |
| }); | |
| socket.on('match_found', data => { | |
| myColor = data.color; | |
| statusElement.innerText = `Matched! You are ${myColor}. Opponent: ${data.opponent}`; | |
| }); | |
| socket.on('opponent_move', data => { | |
| fetch('/state') | |
| .then(res => res.json()) | |
| .then(updateBoard); | |
| }); | |
| socket.on('multi_jump', data => { | |
| selected = data.from; | |
| renderBoard(); // highlight piece | |
| }); | |
| socket.on('game_over', data => { | |
| statusElement.innerText = `Game over! Winner: ${data.winner}`; | |
| }); | |
| socket.on('opponent_disconnected', () => { | |
| statusElement.innerText = "Opponent disconnected. Game ended."; | |
| }); | |
| function updateBoard(data) { | |
| renderBoard(data.board); | |
| } | |
| function renderBoard(boardData = null) { | |
| boardElement.innerHTML = ''; | |
| fetch('/state') | |
| .then(res => res.json()) | |
| .then(data => { | |
| const board = data.board; | |
| for (let i = 0; i < 8; i++) { | |
| const row = document.createElement('tr'); | |
| for (let j = 0; j < 8; j++) { | |
| const cell = document.createElement('td'); | |
| const piece = board[i][j]; | |
| cell.className = (i + j) % 2 === 1 ? 'black' : 'empty'; | |
| if (piece === 'r') cell.innerText = 'r'; | |
| if (piece === 'R') cell.innerText = 'R'; | |
| if (piece === 'b') cell.innerText = 'b'; | |
| if (piece === 'B') cell.innerText = 'B'; | |
| if (selected && selected[0] === i && selected[1] === j) | |
| cell.classList.add('highlight'); | |
| cell.onclick = () => handleClick(i, j, board); | |
| row.appendChild(cell); | |
| } | |
| boardElement.appendChild(row); | |
| } | |
| }); | |
| } | |
| function handleClick(i, j, board) { | |
| const piece = board[i][j]; | |
| if (selected) { | |
| socket.emit('move', { from: selected, to: [i, j] }); | |
| selected = null; | |
| } else if (piece && myColor[0] === piece.toLowerCase()) { | |
| selected = [i, j]; | |
| renderBoard(); // highlight selected | |
| } | |
| } | |
| setInterval(renderBoard, 1500); // Keep board in sync | |
| </script> | |
| </body> | |
| </html> |