能否仅用Java Streams实现井字棋胜负判定逻辑?
仅用Java Streams实现井字棋胜负判定
可以仅用Java Streams实现符合井字棋规则的胜负判定(横向、纵向或对角线三连),你提供的原有方案仅做全局重复元素统计,无法满足井字棋的胜负逻辑——因为即使某个元素出现3次,若未形成有效连线也不算获胜。
实现思路
井字棋的3x3棋盘共有8种有效获胜连线,我们可以预先定义这些连线对应的棋盘索引(假设棋盘用List<String>存储,索引从0到8对应棋盘的9个位置),再通过Streams遍历这些连线,检查每条连线的三个元素是否完全一致。
具体代码实现
- 先定义所有有效获胜连线的索引组合:
import java.util.Arrays; import java.util.List; // 定义所有获胜连线的索引(3x3棋盘索引0-8) List<List<Integer>> winningLines = Arrays.asList( Arrays.asList(0, 1, 2), // 第一行 Arrays.asList(3, 4, 5), // 第二行 Arrays.asList(6, 7, 8), // 第三行 Arrays.asList(0, 3, 6), // 第一列 Arrays.asList(1, 4, 7), // 第二列 Arrays.asList(2, 5, 8), // 第三列 Arrays.asList(0, 4, 8), // 主对角线 Arrays.asList(2, 4, 6) // 副对角线 );
- 使用Streams判断是否存在获胜者:
假设棋盘列表listTicTacToe中,玩家标记为"X"或"O",初始数字已被替换,判断逻辑如下:
boolean isWinner = winningLines.stream() // 对每条获胜线,取出对应的三个棋盘元素 .map(line -> line.stream() .map(listTicTacToe::get) // 检查三个元素是否完全相同(去重后数量为1) .distinct() .count() == 1) // 只要有一条线满足条件,就判定有获胜者 .anyMatch(Boolean::booleanValue);
- 兼容初始数字的场景(如果棋盘初始是1-9,需要排除未被玩家下过的位置):
boolean isWinner = winningLines.stream() .map(line -> line.stream() .map(listTicTacToe::get) // 过滤掉初始的数字元素,只检查玩家标记 .filter(s -> !s.matches("\\d+")) .distinct() .count() == 1) .anyMatch(Boolean::booleanValue);
与原有方案的区别
你提供的两个方案仅统计全局范围内某个元素的出现次数,无法区分元素是否形成有效连线。比如某个标记出现3次但分散在非连线位置时,原有方案会误判为获胜,而上述Streams实现则严格遵循井字棋的胜负规则,只检查有效连线的元素一致性。
内容的提问来源于stack exchange,提问作者leccepen
相关产品推荐
相关产品推荐

