Implementação do Static Chess
- Implementação de xadrez comum, com apenas os recursos essenciais
- Todas as páginas são compostas apenas por HTML e CSS
- Todos os movimentos de xadrez são feitos clicando em links
- O jogo funciona enviando um link para um amigo, a outra pessoa faz a jogada e envia o link de volta
- Animações desnecessárias ou elementos interativos chamativos não atrapalham a jogabilidade
- Fico curioso se o Google conseguiria calcular todos os movimentos possíveis de xadrez ao indexar este site
Limitações de recursos e bugs
- Os recursos são bem limitados e pode ser que não funcione direito
- Se encontrar algum bug, por favor avise
Ideia que inspirou o projeto
- Inspirado por uma discussão no Hacker News sobre um site que mostra todos os estados possíveis de um jogo da velha
Planos futuros
- Há planos de expandir para dar suporte a partidas reais
- Parece que isso poderia virar uma interface simples para jogar partidas longas com amigos
- Também parece que seria divertido adicionar um modo para enfrentar uma IA estática
- Se houver algum recurso que você gostaria de ver adicionado, PRs são bem-vindos
Código 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>;
})();
// 생략...
}
}
Opinião do GN⁺
- Implementar um jogo de xadrez na web usando apenas HTML/CSS é uma tentativa interessante. Mas transformar todos os estados em páginas estáticas levanta dúvidas sobre a praticidade.
- Pensando na usabilidade real, no fim das contas isso provavelmente teria que virar um modelo em que o backend gerencia o estado e o frontend chama uma API.
- Pré-calcular todos os estados em páginas estáticas é uma ideia divertida, mas não parece ter grande utilidade para usuários reais.
- Fazer SSR com React é uma abordagem válida, mas parece haver bastante espaço para melhorar o desempenho com cache, prefetching e afins.
- Um projeto open source semelhante é o lichess. Vale a pena usar como referência, já que oferece muitos recursos e uma UI excelente.
- Se quiser dar suporte a um modo com IA integrado ao engine de xadrez, usar WASM também pode ser uma opção a considerar.
1 comentários
Comentários do Hacker News
https://fav.farmehttps://val.town.