Implémentation de Static Chess
- Une implémentation d’échecs ordinaire, avec uniquement les fonctionnalités essentielles
- Toutes les pages sont composées uniquement de HTML et de CSS
- Tous les déplacements aux échecs se font en cliquant sur des liens
- La partie se déroule en envoyant un lien à un ami, qui joue ensuite un coup et renvoie à son tour le lien
- Les animations inutiles ou les éléments d’interaction tape-à-l’œil ne perturbent pas le gameplay
- Je me demande si Google pourrait calculer tous les coups d’échecs possibles lorsqu’il indexe ce site
Limites de fonctionnalités et bugs
- Les fonctionnalités sont très limitées et il se peut que cela ne fonctionne pas
- Si vous trouvez un bug, merci de le signaler
Idée d’origine
- Inspiré par une discussion sur Hacker News à propos d’un site montrant tous les états possibles d’une partie de morpion
Plans futurs
- Prévu pour être étendu afin de prendre en charge de vraies parties
- Cela pourrait devenir une interface simple pour jouer à des parties longues avec des amis
- Ajouter une fonctionnalité pour affronter une IA statique pourrait aussi être amusant
- Si vous souhaitez voir une fonctionnalité ajoutée, les PR sont les bienvenues
Code principal
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>;
})();
// 생략...
}
}
Avis de GN⁺
- Implémenter un jeu d’échecs web uniquement en HTML/CSS est une tentative intéressante. En revanche, faire de tous les états des pages statiques semble discutable sur le plan pratique.
- En tenant compte d’un usage réaliste, il faudrait sans doute au final une architecture où l’état est géré côté back-end et où le front-end appelle une API.
- Pré-calculer tous les états sous forme de pages statiques est une idée amusante, mais cela ne semble pas apporter beaucoup à de vrais utilisateurs.
- Faire du SSR avec React est une approche correcte, mais il semble y avoir encore de la marge pour améliorer les performances, notamment avec le caching ou le prefetching.
- Parmi les projets open source similaires, on peut citer lichess. Avec ses nombreuses fonctionnalités et son excellente UI, il peut servir de référence.
- Pour proposer un mode IA relié à un moteur d’échecs, il pourrait aussi être intéressant d’envisager l’usage de WASM.
1 commentaires
Commentaires sur Hacker News
https://fav.farmethttps://val.town.