CS-Tao / ts-fir

基于 TS 类型推导实现的五子棋

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

tsc

TS-FIR

基于 TS 类型推导实现的五子棋

在线体验

TypeScript Playground

效果

落子和渲染

初始棋盘 黑棋第一步 (二, 三)
0.png B1.png
白棋第一步 (三, 三) 黑棋第二步 (三, 四)
W1.png B2.png
import { 初始五子棋盘, 渲染五子棋盘, 落子 } from "./src";

type 初始结果 = 渲染五子棋盘<初始五子棋盘>;

type 黑第一步 = 落子<初始五子棋盘, "黑", "二", "三">;
type 黑第一步结果 = 渲染五子棋盘<黑第一步>;

type 白第一步 = 落子<黑第一步, "白", "三", "三">;
type 白第一步结果 = 渲染五子棋盘<白第一步>;

type 黑第二步 = 落子<白第一步, "黑", "三", "四">;
type 黑第二步结果 = 渲染五子棋盘<黑第二步>;

计算结果

「五子棋」计算结果时递归次数会超出 ts 限制,只能计算「井字棋」的结果

初始棋盘 黑棋第一步 (一, 一) 白棋第一步 (三, 一)
0.png B1.png W1.png
黑棋第二步 (二, 二) 白棋第二步 (三, 二) 黑棋第三步 (三, 三)
B2.png W2.png B3.png
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

About

基于 TS 类型推导实现的五子棋

License:MIT License


Languages

Language:TypeScript 100.0%