【问题标题】:foreach-if-statment w/ Linq conditional giving unexpected results带有/ Linq 条件的 foreach-if-statement 给出意外结果
【发布时间】:2016-11-01 14:13:38
【问题描述】:

这是井字游戏的一部分。 checkmate 方法返回一个字符串,该字符串将被另一个函数(此处未显示)用于进行井字棋移动。

这是棋盘,玩家在最上面一排排了两块棋子:

public static char[] board = { '+', '+', 'E',
                               'A', 'S', 'D',
                               'Z', 'X', 'C' };

这是决定下一步行动的代码:

private static string checkmate()
{      
    List<char[]> dalist = new List<char[]> 
    {
        new char[3] { board[3], board[4], board[5] },
        new char[3] { board[0], board[4], board[8] },
        new char[3] { board[2], board[4], board[6] },
        new char[3] { board[1], board[4], board[7] },

        new char[3] { board[0], board[1], board[2] },
        new char[3] { board[6], board[7], board[8] },
        new char[3] { board[0], board[3], board[6] },
        new char[3] { board[2], board[5], board[8] }
    };

    foreach (var item in dalist)
    {
        if (item.Where(x => x == '+').Count() == 2)
            return new string(item.Where(x => x != '+').ToArray());

        else if (item.Where(x => x == '-').Count() == 2)
            return new string(item.Where(x => x != '-').ToArray());

        else if (item.Where(x => x == '+').Count() == 1)
            return item.Where(x => x != '+').First().ToString();

        else
        {
            Random random = new Random();
            int rList = random.Next(0, 3);
            int rPosition = random.Next(0, 2);
            return dalist.ElementAt(rList).GetValue(rPosition).ToString();
        }
    }
    return "AA";
}

该方法将单个字母作为字符串返回,该字符串对应于棋盘上的移动。

该方法通过创建 tic-tack-toe 中 8 种可能获胜模式的列表来分析棋盘,并根据棋盘上已有的内容对其进行测试

在 foreach 循环中按 ifelse 条件顺序工作的逻辑四个组件。 对于当前,该方法应返回“E”并在第一个 if 语句处中断循环。相反,程序会遍历整个循环并返回最后的 else 语句? 为什么不识别第一个 if 条件的匹配?

循环应该遍历 8 个列表项中的每一个,直到找到匹配项。

1) checkmate 如果有可用的棋子,它将返回获胜的棋子

2) 如果没有将死棋,则此步将检查对手是否有将死棋并阻挡路径

3)link two如果没有将死棋子获胜或阻止,这将放置第二个棋子以链接到获胜路径

4) 将首字母随机放置在前两轮的四个角之一或中间

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    您需要对所有可能的获胜动作执行每项单独测试。不是对第一个获胜动作的每个测试,然后对第二个获胜动作的每个测试,等等。因此,在每个测试周围包裹一个 for 循环,如果没有一个循环找到匹配项,则让随机块运行。

    【讨论】:

    • 是的,离开电脑吃了个蛋,得出了同样的结论。
    【解决方案2】:

    如果我理解正确,您认为第一个 if 语句应该为真,因此函数应该返回。我猜你认为第一个item{'+' ,'+', 'E'}

    但这是不正确的。第一个item{'A', 'S', 'D'},因为当您创建dalist 时,第一个字符数组是{ board[3], board[4], board[5] }

    编辑!

    我现在看到你的函数保证在 for-each 循环的第一次迭代时返回,因为每个执行路径都有一个 return 语句。所以它永远不会到达{'+' ,'+', 'E'}的行。

    【讨论】:

    • 这也是我最初的想法,但我认为第一个条件从未满足,即使dalist中的第5个元素也不满足
    • @MongZhu 啊,我明白你在说什么。我不确定OP在这里做什么。在我看来,在 foreach 的第一个循环中,最后一个 else 将执行,函数将返回。所以它永远不会到达任何其他 dalist 项目。无论哪种方式,循环中的所有执行路径都会在第一次迭代期间从函数返回。
    • Eli,我希望根据第一个 if 条件检查每个 List 项,以便在检查完列表中的所有 8 个数组之前,它不会移动到第二个 else-if 语句。等等..
    • 它应该匹配第五个列表项(索引 #4)并返回字符串 'E' 至少这就是我想要做的
    • @Aarondv1 我认为 Eli 是对的,你永远不会到达第五个元素,因为你的循环在第一次迭代后结束
    猜你喜欢
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    相关资源
    最近更新 更多