Implementierung von Static Chess
- Eine Schachimplementierung, die gewöhnlich ist und nur die wesentlichen Funktionen bietet
- Alle Seiten bestehen ausschließlich aus HTML und CSS
- Alle Schachzüge erfolgen durch das Anklicken von Links
- Das Spiel läuft so ab, dass man einem Freund einen Link schickt, dieser zieht und dann wieder einen Link zurückschickt
- Unnötige Animationen oder auffällige interaktive Elemente stören das Gameplay nicht
- Es stellt sich die Frage, ob Google beim Indexieren dieser Website alle möglichen Schachzüge berechnen kann
Funktionseinschränkungen und Bugs
- Der Funktionsumfang ist sehr eingeschränkt und es kann sein, dass es nicht funktioniert
- Wenn du einen Bug findest, melde ihn bitte
Idee und Inspiration
- Inspiriert durch eine Hacker-News-Diskussion über eine Website, die alle möglichen Zustände eines Tic-Tac-Toe-Spiels zeigt
Zukünftige Pläne
- Geplant ist eine Erweiterung zur Unterstützung von echtem Gameplay
- Es könnte eine einfache Oberfläche werden, mit der man lange Partien mit Freunden spielen kann
- Es wäre auch interessant, eine Funktion für Partien gegen eine statische KI hinzuzufügen
- Wenn du Funktionen hast, die ergänzt werden sollten, sind PRs willkommen
Wichtiger Code
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>;
})();
// 생략...
}
}
Meinung von GN⁺
- Die Umsetzung eines Web-Schachspiels nur mit HTML/CSS ist ein interessanter Versuch. Ob es jedoch praktisch ist, alle Zustände als statische Seiten zu erzeugen, ist fraglich.
- Wenn man an realistische Nutzbarkeit denkt, müsste der Zustand am Ende wohl doch im Backend verwaltet werden, während das Frontend eine API aufruft.
- Alle Zustände vorab als statische Seiten zu berechnen, ist als Idee unterhaltsam, scheint für echte Nutzer aber wenig Bedeutung zu haben.
- SSR mit React ist ein vernünftiger Ansatz, aber bei Performance-Optimierungen wie Caching oder Prefetching scheint es noch Spielraum zu geben.
- Ein ähnliches Open-Source-Projekt ist lichess. Es bietet umfangreiche Funktionen und eine ansprechende UI und könnte als Referenz dienen.
- Wenn ein KI-Modus durch Anbindung an eine Schach-Engine unterstützt werden soll, könnte man auch den Einsatz von WASM in Betracht ziehen.
1 Kommentare
Hacker-News-Kommentare
https://fav.farmundhttps://val.townentdeckt.