基于 TS 类型推导实现的五子棋
初始棋盘 | 黑棋第一步 (二, 三) |
---|---|
白棋第一步 (三, 三) | 黑棋第二步 (三, 四) |
import { 初始五子棋盘, 渲染五子棋盘, 落子 } from "./src";
type 初始结果 = 渲染五子棋盘<初始五子棋盘>;
type 黑第一步 = 落子<初始五子棋盘, "黑", "二", "三">;
type 黑第一步结果 = 渲染五子棋盘<黑第一步>;
type 白第一步 = 落子<黑第一步, "白", "三", "三">;
type 白第一步结果 = 渲染五子棋盘<白第一步>;
type 黑第二步 = 落子<白第一步, "黑", "三", "四">;
type 黑第二步结果 = 渲染五子棋盘<黑第二步>;
「五子棋」计算结果时递归次数会超出 ts 限制,只能计算「井字棋」的结果
初始棋盘 | 黑棋第一步 (一, 一) | 白棋第一步 (三, 一) |
---|---|---|
黑棋第二步 (二, 二) | 白棋第二步 (三, 二) | 黑棋第三步 (三, 三) |
import { 初始井字棋盘, 渲染井字棋盘, 落子 } from "./src";
type 初始结果 = 渲染井字棋盘<初始井字棋盘>;
type 黑第一步 = 落子<初始井字棋盘, "黑", "一", "一">;
type 黑第一步结果 = 渲染井字棋盘<黑第一步>;
type 白第一步 = 落子<黑第一步, "白", "三", "一">;
type 白第一步结果 = 渲染井字棋盘<白第一步>;
type 黑第二步 = 落子<白第一步, "黑", "二", "二">;
type 黑第二步结果 = 渲染井字棋盘<黑第二步>;
type 白第二步 = 落子<黑第二步, "白", "三", "二">;
type 白第二步结果 = 渲染井字棋盘<白第二步>;
type 黑第三步 = 落子<白第二步, "黑", "三", "三">;
type 黑第三步结果 = 渲染井字棋盘<黑第三步>;
// => {
// 一: "⎪ 🔴 ➕ 🟢 ⎪";
// 二: "⎪ ➕ 🔴 🟢 ⎪";
// 三: "⎪ ➕ ➕ 🔴 ⎪";
// 获胜: "黑-🔴";
// }
type 重复落子 = 落子<白第一步, "黑", "三", "一">;
// @ts-expect-error 重复落子: { 出错: "原因: 当前位置「三, 一」已有棋子「🟢」"; }
type 重复落子结果 = 渲染井字棋盘<重复落子>;
type 不能继续落子 = 落子<黑第三步, "白", "二", "三">;
// @ts-expect-error 不能继续落子: { 出错: "原因: 不能落子,「黑-🔴」已获胜"; }
type 不能继续落子结果 = 渲染井字棋盘<不能继续落子>;
@Inspired by type-chess