
示例工程【免费下载链接】awesome-low-level-designLearn Low Level Design (LLD) and prepare for interviews using free resources.项目地址https://gitcode.com/GitHub_Trending/aw/awesome-low-level-design点击查看免费下载本篇文章以 solutions/golang/chessgame 目录下的完整 Go 实现为主体逐层拆解一个国际象棋Chess对局的低层设计LLD方案从需求分析、类/接口/枚举划分到棋盘、棋子移动规则、玩家走子与主循环的源码级实现。读完本文你将掌握如何在 Go 中组织多状态对象棋盘、棋子、玩家、对局的职责边界理解规则校验集中在棋子与棋盘、流程编排集中在 ChessGame的典型面试解法并能直接运行该示例进行验证。一、需求分析一个标准规则的双人国际象棋原文档README.md开篇给出了 8 条核心需求这也是任何 LLD 面试题的标准切入点对局遵循标准国际象棋规则支持两名玩家各自控制一整套棋子棋盘表示为 8×8 网格黑白格子交替每名玩家拥有 16 枚棋子1 王、1 后、2 车、2 象、2 马、8 兵校验每枚棋子的合法走法阻止非法移动检测将杀checkmate与逼和stalemate局面管理玩家回合两名玩家轮流走子提供玩家交互的用户界面。对照 board.go 的实现第 2、3、4 条需求在initializeBoard()中被直接落实pieces[0]与pieces[7]两行分别摆放白方与黑方的车、马、象、后、王、象、马、车pieces[1]与pieces[6]两行各放 8 个兵与标准开局完全一致。二、类、接口与枚举设计原文档将系统划分为 7 个核心类型。在 Go 实现中它们对应为文档中的设计Go 源码实现职责Piece抽象基类Piece接口 BasePiece结构体piece.go定义棋子公共行为与公共属性King/Queen/Rook/Bishop/Knight/Pawnpieces.go 中 6 个结构体各自实现CanMove移动规则BoardBoardboard.go管理棋子摆放、移动合法性、将杀与逼和判定PlayerPlayerplayer.go代表玩家执行走子MoveMovemove.go封装被移动的棋子与目标坐标GameChessGamechess_game.go编排整体对局流程ChessGame入口Run()chess_game_demo.go应用启动入口2.1 Piece 接口与 BasePiece用接口代替抽象类Go 没有继承因此原文档中的抽象基类用接口 内嵌结构体的模式实现Piece接口声明了CanMove(board *Board, destRow, destCol int) bool、GetColor()、GetRow()、GetCol()、SetPosition(row, col)五个方法BasePiece结构体持有color、row、col三个公共属性并实现了除CanMove之外的全部方法每种具体棋子通过内嵌BasePiece获得公共属性与方法再各自实现CanMove。这种模板方法 策略式写法让每种棋子的差异收敛到唯一的CanMove方法中新增棋种只需实现一个方法职责单一、扩展性好。2.2 Color 枚举color.go 用Color int类型加iota定义White、Black两个枚举值并为Color实现了String()方法使fmt.Printf(%ss turn.\n, player.color)能直接输出 White 或 Black。2.3 错误类型errors.go 定义了InvalidMoveError实现Error()接口用于向玩家反馈非法移动属于 Go 中轻量级的自定义错误设计。三、Board棋盘的摆放、越界与合法性校验Board内部用pieces [][]Piece8×8 二维切片表示棋盘NewBoard()创建后立即调用initializeBoard()完成开局布子。围绕移动合法性Board提供三层方法GetPiece(row, col)/SetPiece(row, col, piece)带越界保护的存取方法GetPiece对越界坐标返回nilIsValidMove(piece, destRow, destCol)先校验目标坐标是否越界再校验目标格是否为空或为对方棋子destPiece nil || destPiece.GetColor() ! piece.GetColor()最后才调用piece.CanMove(board, destRow, destCol)走子规则校验IsCheckmate(color)/IsStalemate(color)原文档要求检测将杀与逼和当前源码中这两处为 TODO 占位实现固定返回false。从源码结构可以推断这两处应在未来枚举所有合法走子、判断王是否处于被将军状态来实现属于本示例预留的扩展点完整判定需自行补齐。四、六种棋子的移动规则实现pieces.go 通过math.Abs计算行/列差绝对值逐一实现移动规则。各棋子的判定逻辑如下棋子规则源码条件Pawn白方向前行 1 格首行可走 2 格斜向 1 格且目标有子吃子rowDiff 1 colDiff 0p.row 1 rowDiff 2rowDiff 1 colDiff 1 目标非空黑方向符号相反Rook行或列直线移动r.row destRow \|\| r.col destColKnight走日字rowDiff 2 colDiff 1或反之Bishop对角线移动rowDiff colDiffQueen对角线或直线rowDiff colDiff \|\| q.row destRow \|\| q.col destColKing任意方向移动 1 格rowDiff 1 colDiff 1从源码实现来看当前版本的CanMove仅完成几何走法校验车、象、后的移动未检查路径上是否有其他棋子阻挡无扫清路径逻辑兵也未校验起始格棋子是否仍在原位等细粒度规则。这些属于可继续完善的边界读者可在此基础上加深校验作为练习。五、Player 与 Move走子的封装与执行Player仅持有color属性其MakeMove(board, move)方法体现了先校验、再落子的执行顺序player.go调用board.IsValidMove校验非法则返回InvalidMoveError通过move.piece.GetRow()/GetCol()获取源坐标SetPiece置空源格将棋子写入目标格调用piece.SetPosition同步棋子的内部坐标。Move结构体move.go则是一个轻量数据载体持有piece与目标坐标destRow、destCol由NewMove构造。六、ChessGame回合编排与命令行交互ChessGame持有board、players白方、黑方两个Player和currentPlayer下标。NewChessGame()完成初始化后Start()进入主循环chess_game.go通过isGameOver()检查将杀/逼和未结束则继续取当前玩家打印Whites turn.或Blacks turn.getPlayerMove用bufio.Reader从标准输入依次读取源行、源列、目标行、目标列四个整数并校验所选格子是否为当前玩家的棋子执行player.MakeMove若返回错误则打印并重新走子切换currentPlayer (currentPlayer 1) % 2实现交替走子对应需求 7。对局结束后displayResult()依据IsCheckmate/IsStalemate输出胜负或逼和结果。chess_game_demo.go中的Run()是入口负责构造游戏并启动。七、运行与验证该实现位于solutions/golang模块见 go.modmodule 为github.com/ashishps1/awesome-low-level-design/solutions/golangGo 版本 1.23.2。本地验证方式为# 在仓库根目录下进入 golang 解决方案目录 cd solutions/golang go run ./chessgame/chess_game_demo.go或以go run main.go配合模块内已有的入口运行。随后按提示依次输入源行、源列、目标行、目标列07即可走子例如白方王前兵开局的1 4 2 4或1 0 3 0等标准走法输入非法移动会得到Error: Invalid move!提示并允许重试。若需完整验证将杀/逼和判定可在 board.go 的IsCheckmate与IsStalemate处补充实现。八、设计要点小结从该示例可以提炼出一套可直接复用的 LLD 设计模式职责单一棋子负责能怎么走CanMove棋盘负责位置管理 通用合法性 终局判定玩家负责执行走子ChessGame负责回合编排与交互各层互不越界用接口表达多态Go 中以内嵌BasePiece 实现Piece接口的方式模拟抽象类继承天然适配策略化的移动规则扩展先校验后落子IsValidMove目标合法性→CanMove走法规则→ 落子与坐标同步是安全的移动执行流水线明确 TODO 边界将将杀/逼和这类复杂规则以 TODO 占位形式预留既保证示例可编译可运行也标明了后续扩展点。配套的 UML 类图可参考仓库 class-diagrams/chessgame-class-diagram.png用于对照源码理解各类型之间的依赖与继承关系。若需查看更多语言的同题实现可浏览 solutions 目录下的 cpp、csharp、java 等同名子目录。赞分享示例工程【免费下载链接】awesome-low-level-designLearn Low Level Design (LLD) and prepare for interviews using free resources.项目地址https://gitcode.com/GitHub_Trending/aw/awesome-low-level-design点击查看免费下载相关推荐QuickRecorder 快速教程:8 种录制模式的 macOS 轻量录屏,从安装到进阶输出QuickRecorder 快速教程:8 种录制模式的 macOS 轻量录屏,从安装到进阶输出 QuickRecorder 是一款基于苹果 ScreenCapt桌面应用音视频屏幕录制深入解析 YouTube.js 的 ListView 节点列表渲染器的数据结构与实战应用深入解析 YouTube.js 的 ListView 节点列表渲染器的数据结构与实战应用 导读 ListView 是 YouTube.js访问 YouTub示例工程awesome-low-level-design中的设计模式实现解析awesome low level design中的设计模式实现解析 在软件开发中设计模式是解决常见问题的最佳实践能够显著提升代码的可维护性和可扩展性。aw示例工程上一篇Chanify高级用法自定义消息格式和推送策略下一篇curl 命令行 --rate 选项详解按时间单位精确控制串行传输启动频率创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考