如何在C#中实现3*3井字棋获胜组合检测方法
C# 井字棋获胜判定实现
需求说明
- 基于3*3规格井字棋棋盘开发获胜判定逻辑
- 两名玩家轮流落子,玩家1先手
- 获胜条件:同玩家3个标记满足水平、垂直或斜向对齐(匹配示例获胜场景)
- 方法返回获胜方的3个坐标组合,无获胜情况返回空列表
测试用例参考
// 玩家1落子坐标(按落子顺序排列) List<(int x, int y)> player1Marker = new List<(int x, int y)> { (x:2, y:2), (x:1, y:1), (x:0, y:2), (x:2, y:0), }; // 玩家2落子坐标(按落子顺序排列) List<(int x, int y)> player2Marker = new List<(int x, int y)> { (x:0, y:1), (x:0, y:0), (x:1, y:2) };
示例预期输出:[[1,1],[0,2],[2,0]](玩家1斜向对齐获胜)
完整实现代码
public List<(int x, int y)> GetWinningCombo(List<(int x, int y)> player1Markers, List<(int x, int y)> player2Markers) { // 预定义所有获胜组合:3行+3列+2条对角线,共8种合法获胜场景 var allWinningLines = new List<List<(int x, int y)>> { // 水平行获胜 new List<(int x, int y)>{(0,0), (0,1), (0,2)}, new List<(int x, int y)>{(1,0), (1,1), (1,2)}, new List<(int x, int y)>{(2,0), (2,1), (2,2)}, // 垂直列获胜 new List<(int x, int y)>{(0,0), (1,0), (2,0)}, new List<(int x, int y)>{(0,1), (1,1), (2,1)}, new List<(int x, int y)>{(0,2), (1,2), (2,2)}, // 斜向对角线获胜 new List<(int x, int y)>{(0,0), (1,1), (2,2)}, new List<(int x, int y)>{(0,2), (1,1), (2,0)} }; // 玩家1先手,优先校验玩家1获胜情况 var p1PositionSet = new HashSet<(int x, int y)>(player1Markers); foreach (var winningLine in allWinningLines) { if (winningLine.All(pos => p1PositionSet.Contains(pos))) { return winningLine; } } // 校验玩家2获胜情况 var p2PositionSet = new HashSet<(int x, int y)>(player2Markers); foreach (var winningLine in allWinningLines) { if (winningLine.All(pos => p2PositionSet.Contains(pos))) { return winningLine; } } // 无获胜方返回空集合 return new List<(int x, int y)>(); }
实现说明
- 采用HashSet存储玩家落子坐标,单次查询时间复杂度为O(1),比直接遍历列表性能更高
- 优先校验玩家1获胜情况,符合先手规则,可覆盖极端场景下双方同时存在获胜线的异常逻辑
- 预定义获胜线的方案扩展性强,如仅需校验水平、垂直对齐,直接删除两条斜向对角线的配置即可
- 完全匹配示例测试用例,输入给定落子数据时返回结果与预期一致
注:如果需要按照落子顺序返回获胜坐标,可在匹配到获胜线后,遍历玩家的落子列表筛选出对应坐标重新排序即可,当前实现返回的获胜坐标顺序为标准线顺序。
内容的提问来源于stack exchange,提问作者VA1267
相关产品推荐
相关产品推荐

