players2 / templates /client.html
Geek7's picture
Update templates/client.html
df03365 verified
<!DOCTYPE html>
<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 !important; }
</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>