การสร้าง Static Chess
- การสร้างหมากรุกแบบเรียบง่ายที่มีเฉพาะฟังก์ชันจำเป็น
- ทุกหน้าประกอบด้วย HTML และ CSS เท่านั้น
- การเดินหมากทั้งหมดทำผ่านการคลิกลิงก์
- ส่งลิงก์ให้เพื่อน จากนั้นอีกฝ่ายเดินหมากแล้วส่งลิงก์กลับมา เป็นวิธีการเล่นของเกมนี้
- ไม่มีแอนิเมชันที่ไม่จำเป็นหรือองค์ประกอบอินเทอร์แอ็กทีฟที่หวือหวาซึ่งรบกวนการเล่น
- สงสัยว่าเวลาที่ Google ทำดัชนีเว็บไซต์นี้ จะสามารถคำนวณการเดินหมากรุกที่เป็นไปได้ทั้งหมดได้หรือไม่
ข้อจำกัดของฟังก์ชันและบั๊ก
- ฟังก์ชันยังมีข้อจำกัดมากและอาจทำงานไม่ถูกต้อง
- หากพบบั๊ก กรุณาแจ้งเข้ามา
ไอเดียที่เป็นแรงบันดาลใจ
- ได้แรงบันดาลใจจากการพูดคุยบน Hacker News เกี่ยวกับเว็บไซต์ที่แสดงทุกสถานะที่เป็นไปได้ของเกม Tic-tac-toe
แผนในอนาคต
- มีแผนจะขยายให้รองรับการเล่นจริง
- ดูเหมือนว่าน่าจะกลายเป็นอินเทอร์เฟซเรียบง่ายสำหรับเล่นกระดานยาวกับเพื่อนได้
- การเพิ่มฟังก์ชันสู้กับ AI แบบสแตติกก็น่าจะสนุกดี
- หากมีฟังก์ชันที่อยากให้เพิ่ม ยินดีรับ PR
โค้ดหลัก
class StaticChess {
// omitted...
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>
{/* omitted... */}
<div className="board">
{this.rows.map(row => (
<div key={row} className="row">{this.squares.map(square => game.squareContent(row, square))}</div>
))}
</div>
{/* omitted... */}
</html>
),
{ headers: { "content-type": "text/html", "cache-control": "max-age=86400, public" } },
);
}
}
class Game {
// omitted...
squareContent(row: number, square: number) {
// omitted...
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>;
})();
// omitted...
}
}
ความเห็นของ GN⁺
- การสร้างเกมหมากรุกบนเว็บด้วย HTML/CSS เท่านั้นเป็นความพยายามที่น่าสนใจ แต่การทำให้ทุกสถานะเป็นหน้าสแตติกยังน่าสงสัยในแง่ความใช้งานจริง
- หากคำนึงถึงการใช้งานที่สมจริง ท้ายที่สุดก็น่าจะต้องเป็นรูปแบบที่แบ็กเอนด์จัดการสถานะ และฟรอนต์เอนด์เรียกใช้ API
- การคำนวณทุกสถานะล่วงหน้าเป็นหน้าแบบสแตติกนั้นเป็นไอเดียที่สนุก แต่สำหรับผู้ใช้จริงดูเหมือนจะไม่ได้มีความหมายมากนัก
- การทำ SSR ด้วย React เป็นแนวทางที่โอเค แต่ก็น่าจะยังมีช่องให้ปรับปรุงประสิทธิภาพได้อีกมาก เช่น caching หรือ prefetching
- โปรเจกต์โอเพนซอร์สที่คล้ายกันมี lichess ซึ่งมีฟังก์ชันครบและ UI สวยงาม จึงน่าลองดูเป็นตัวอย่าง
- หากจะรองรับโหมด AI ด้วยการเชื่อมต่อกับ chess engine ก็อาจพิจารณาใช้ WASM ได้เช่นกัน
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
https://fav.farmและhttps://val.town.