| <!DOCTYPE html> |
| <html> |
| <head> |
| <title>Checkers</title> |
| <style> |
| body { font-family: Arial; text-align: center; } |
| #board { display: grid; grid-template: repeat(8, 60px) / repeat(8, 60px); margin: auto; } |
| .cell { width: 60px; height: 60px; display: flex; align-items: center; justify-content: center; } |
| .black { background: #769656; } |
| .white { background: #EEEED2; } |
| .piece { width: 40px; height: 40px; border-radius: 50%; } |
| .r { background: red; } |
| .b { background: black; } |
| .R, .B { border: 2px solid gold; } |
| </style> |
| </head> |
| <body> |
| <h1>Checkers</h1> |
| <input id="nameInput" placeholder="Enter name" /> |
| <button onclick="setName()">Join</button> |
| <h2 id="status"></h2> |
| <div id="board"></div> |
|
|
| <script src="https://cdn.socket.io/4.6.1/socket.io.min.js"></script> |
| <script> |
| const socket = io("http://localhost:5000"); |
| let myColor = null, board = [], selected = null; |
| |
| socket.on("connect", () => console.log("Connected")); |
| |
| function setName() { |
| const name = document.getElementById("nameInput").value; |
| socket.emit("set_name", { name }); |
| } |
| |
| socket.on("match_found", ({ color, opponent }) => { |
| myColor = color; |
| document.getElementById("status").innerText = `You are ${color}, playing vs ${opponent}`; |
| fetch("/state") |
| .then(res => res.json()) |
| .then(data => { board = data.board; render(); }); |
| }); |
| |
| socket.on("opponent_move", move => { |
| applyMove(move); |
| render(); |
| }); |
| |
| socket.on("multi_jump", ({ from }) => { |
| selected = from; |
| }); |
| |
| socket.on("game_over", ({ winner }) => alert(`${winner} wins!`)); |
| socket.on("opponent_disconnected", () => alert("Opponent disconnected.")); |
| |
| function render() { |
| const boardDiv = document.getElementById("board"); |
| boardDiv.innerHTML = ""; |
| for (let r = 0; r < 8; r++) { |
| for (let c = 0; c < 8; c++) { |
| const div = document.createElement("div"); |
| div.className = `cell ${(r + c) % 2 ? "black" : "white"}`; |
| div.onclick = () => handleClick(r, c); |
| const piece = board[r][c]; |
| if (piece) { |
| const p = document.createElement("div"); |
| p.className = `piece ${piece}`; |
| div.appendChild(p); |
| } |
| boardDiv.appendChild(div); |
| } |
| } |
| } |
| |
| function handleClick(r, c) { |
| const piece = board[r][c]; |
| if (selected) { |
| socket.emit("move", { |
| from: selected, |
| to: [r, c], |
| captured: null |
| }); |
| selected = null; |
| } else if (piece && piece[0] === myColor[0]) { |
| selected = [r, c]; |
| } |
| } |
| |
| function applyMove({ from, to, captured }) { |
| const [fr, fc] = from, [tr, tc] = to; |
| board[tr][tc] = board[fr][fc]; |
| board[fr][fc] = null; |
| if (captured) { |
| const [cr, cc] = captured; |
| board[cr][cc] = null; |
| } |
| } |
| </script> |
| </body> |
| </html> |