foreq-if-statment w / Linq条件给出了意想不到的结果

时间:2016-06-29 17:56:57

标签: c# linq

这是Tic-Tac-Toe游戏的一部分。 checkmate方法返回一个字符串,该字符串将被另一个函数(此处未显示)用于进行tic-tack-toe move。

这是棋盘,玩家在顶行排成两排:

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)将初始随机放置在四个角之一或中间前两轮

2 个答案:

答案 0 :(得分:1)

您需要对所有可能的获取动作执行每个单独的测试。并非每次测试都在第一次获胜时移动,然后是第二次获胜移动的每次测试,等等。因此,如果没有任何循环找到匹配项,请在每次测试中包围一个for循环并保持随机块运行。

答案 1 :(得分:0)

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

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

EDIT!

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