Triển khai Static Chess
- Một bản triển khai cờ vua đơn giản, chỉ có các tính năng thiết yếu
- Tất cả các trang chỉ được tạo bằng HTML và CSS
- Mọi nước đi cờ đều được thực hiện bằng cách nhấp vào liên kết
- Gửi liên kết cho bạn bè, đối phương đi quân rồi gửi lại liên kết để tiếp tục ván đấu
- Không có các hiệu ứng động không cần thiết hay yếu tố tương tác hào nhoáng làm cản trở việc chơi
- Tò mò không biết liệu Google có thể tính được mọi nước đi cờ khả dĩ khi lập chỉ mục trang này hay không
Hạn chế tính năng và lỗi
- Tính năng rất hạn chế và có thể không hoạt động
- Nếu phát hiện lỗi, vui lòng báo cáo
Ý tưởng truyền cảm hứng
- Lấy cảm hứng từ cuộc thảo luận trên Hacker News về một trang web hiển thị mọi trạng thái có thể có của trò chơi cờ caro
Kế hoạch sắp tới
- Có kế hoạch mở rộng để hỗ trợ chơi thực tế
- Có vẻ nó có thể trở thành một giao diện đơn giản để chơi những ván cờ kéo dài với bạn bè
- Thêm tính năng đấu với AI tĩnh cũng có thể sẽ rất thú vị
- Nếu có tính năng nào bạn muốn được bổ sung, rất hoan nghênh PR
Mã chính
class StaticChess {
// 생략...
async fetch(req: Request): Promise<Response> {
const gameInfo = parseURL(req.url);
if (gameInfo === undefined) {
return new Response("Not Found", { status: 404, headers: { "cache-control": "max-age=86400, public" } });
}
const game = new Game(gameInfo.game, gameInfo.selected);
return new Response(
renderToString(
<html>
{/* 생략... */}
<div className="board">
{this.rows.map(row => (
<div key={row} className="row">{this.squares.map(square => game.squareContent(row, square))}</div>
))}
</div>
{/* 생략... */}
</html>
),
{ headers: { "content-type": "text/html", "cache-control": "max-age=86400, public" } },
);
}
}
class Game {
// 생략...
squareContent(row: number, square: number) {
// 생략...
const squareContent = (() => {
if (this.selectable.includes(pos)) {
return <a href={`/${this.fen}/${pos}`}>{pieces[this.board[row][square]?.type]}</a>;
}
const nextMove = this.nextMoves[pos];
if (nextMove !== undefined) {
return (
<a href={`/${nextMove.after.replaceAll(" ", "_")}/`}>
{pieces[this.board[row][square]?.type]}
</a>
);
}
return <span>{pieces[this.board[row][square]?.type]}</span>;
})();
// 생략...
}
}
Ý kiến của GN⁺
- Đây là một thử nghiệm thú vị khi triển khai trò chơi cờ vua trên web chỉ bằng HTML/CSS. Tuy nhiên, việc biến mọi trạng thái thành trang tĩnh khiến tính thực tiễn còn gây nghi ngờ.
- Nếu xét đến khả năng sử dụng thực tế, có lẽ cuối cùng vẫn sẽ cần dạng quản lý trạng thái ở backend và frontend gọi API.
- Việc tính sẵn mọi trạng thái dưới dạng trang tĩnh là một ý tưởng vui, nhưng có vẻ không mang nhiều ý nghĩa với người dùng thực tế.
- SSR bằng React là một cách tiếp cận ổn, nhưng dường như vẫn còn nhiều dư địa để cải thiện hiệu năng như caching hay prefetching.
- Một dự án mã nguồn mở tương tự là lichess. Nó cung cấp tính năng phong phú và UI đẹp, nên khá đáng để tham khảo.
- Nếu muốn hỗ trợ chế độ AI bằng cách tích hợp với engine cờ vua, cũng có thể cân nhắc tận dụng WASM.
1 bình luận
Ý kiến Hacker News
https://fav.farmvàhttps://val.town.