You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否仅用Java Streams实现井字棋胜负判定逻辑?

仅用Java Streams实现井字棋胜负判定

可以仅用Java Streams实现符合井字棋规则的胜负判定(横向、纵向或对角线三连),你提供的原有方案仅做全局重复元素统计,无法满足井字棋的胜负逻辑——因为即使某个元素出现3次,若未形成有效连线也不算获胜。

实现思路

井字棋的3x3棋盘共有8种有效获胜连线,我们可以预先定义这些连线对应的棋盘索引(假设棋盘用List<String>存储,索引从0到8对应棋盘的9个位置),再通过Streams遍历这些连线,检查每条连线的三个元素是否完全一致。

具体代码实现

  1. 先定义所有有效获胜连线的索引组合:
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)  // 副对角线
);
  1. 使用Streams判断是否存在获胜者:
    假设棋盘列表listTicTacToe中,玩家标记为"X"或"O",初始数字已被替换,判断逻辑如下:
boolean isWinner = winningLines.stream()
    // 对每条获胜线,取出对应的三个棋盘元素
    .map(line -> line.stream()
        .map(listTicTacToe::get)
        // 检查三个元素是否完全相同(去重后数量为1)
        .distinct()
        .count() == 1)
    // 只要有一条线满足条件,就判定有获胜者
    .anyMatch(Boolean::booleanValue);
  1. 兼容初始数字的场景(如果棋盘初始是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 05:05:29