【问题标题】:How to check if multiple values in an array are equal to one string?如何检查数组中的多个值是否等于一个字符串?
【发布时间】:2018-06-15 13:52:39
【问题描述】:

所以我在学习 C# 时正在为自己制作一个 X 和 O 的游戏作为一个小项目,并且想知道如何检查数组中的某些值是否等于一个字符串。

因此,我将网格上的所有值存储在一个名为 gridValues[] 的数组中,并且我正在创建一种方法来检查是否有人在执行完之后有一个。那么如何检查让我们说gridValues[0]gridValues[1]gridValues[2](顶行)是否都等于“X”。

还有没有更简单的方法来检查所有的组合?

【问题讨论】:

  • 我已经为你删除了你的visual-studio 标签。它仅用于与 Visual Studio 本身问题相关的标签,而不是在 Visual Studio 中编写的代码。常见标签有使用说明(请参阅tagging 了解更多信息),以帮助您确定它们是否适合您的问题。
  • 你能展示你如何定义你的数组吗?是 1d、2d 还是锯齿状的?
  • 数组是1d。
  • 那么我可以假设0-2代表第一横行,3-5代表第二行,6-8代表第三行吗?
  • 是的,这是正确的。但请记住,您还必须检查垂直和对角线。

标签: c# arrays winforms


【解决方案1】:

我更喜欢这个

    {
        if(
            IsEqual(gridValues, 0,1,2) || 
            IsEqual(gridValues, 3,4,5) || 
            IsEqual(gridValues, 6,7,8) ||
            IsEqual(gridValues, 0,4,8) || 
            IsEqual(gridValues, 6,4,2) || 
            IsEqual(gridValues, 0,3,6) || 
            IsEqual(gridValues, 1,4,7) || 
            IsEqual(gridValues, 2,5,8) )
            {
                /* is done */
            }
            else
            {
                /* not equal */
            }
    }

    public static bool IsEqual(string[] A,params int[] index)
    {
        if(index.Length==0)
            return false;
        for(int i=1;i<index.Length;i++)
            if(A[index[i]]!=A[0])
                return false;
        return true;
    }   

这可能是您正在寻找的确切代码

    public static bool IsDone(string[] gridValues, string O_X)
    {
        if (
            IsEqual(gridValues, O_X, 0, 1, 2) ||
            IsEqual(gridValues, O_X, 3, 4, 5) ||
            IsEqual(gridValues, O_X, 6, 7, 8) ||
            IsEqual(gridValues, O_X, 0, 4, 8) ||
            IsEqual(gridValues, O_X, 6, 4, 2) ||
            IsEqual(gridValues, O_X, 0, 3, 6) ||
            IsEqual(gridValues, O_X, 1, 4, 7) ||
            IsEqual(gridValues, O_X, 2, 5, 8))
            return true;
        return false;
    }

    public static bool IsEqual(string[] A, string a, params int[] index)
    { 
        for (int i = 0; i < index.Length; i++)
            if (A[index[i]] != a)
                return false;
        return true;
    } 

你可以这样使用它:IsDone(gridValues, 'X')

【讨论】:

  • 这看起来不错而且很干净,但我不喜欢使用我不理解的东西,尤其是在我学习的时候,所以你能解释一下 IsEqual 方法的作用吗?
  • 它只是检查数组 A 中具有给定索引的项目是否相等
【解决方案2】:

如果您要检查一行中是否有三个同一类型,则将网格值存储在 3x3 2D 数组中可能是一种更简单的方法。二维数组可以让您更轻松地遍历网格。

【讨论】:

  • 我正在考虑稍后尝试,但目前我只是掌握了游戏的基础知识。二维数组也可能更难对角线。
  • 二维数组更容易实现对角线。
【解决方案3】:

我推荐这样的东西。首先,我们为数组定义不同的获胜组合。接下来我们遍历每个索引集(获胜组合),将它们表示为数组的元素。接下来,我们检查第一个项目是否为 null 或空字符串(即它是一个播放项目),然后我们检查它们是否都匹配。如果有比赛,那就是一场胜利的比赛,我们会回来。否则,这是一场失败的比赛,所以我们尝试下一组。如果失败,我们返回 null。

这将比单独检查 X 和 O 更有效,因为我们只是连续查找 3 个。排除未玩牌的关键部分是!string.IsNullOrEmpty(elements[0])

private static string GetWinner(string[] grid)
{
    var indexSets = new []
    {
        // Horizontal
        new [] { 0, 1, 2 },
        new [] { 3, 4, 5 },
        new [] { 6, 7, 8 },

        // Vertical
        new [] { 0, 3, 6 },
        new [] { 1, 4, 7 },
        new [] { 2, 5, 8 },

        // Diagonal
        new [] { 0, 4, 8 },
        new [] { 6, 4, 2 }
    };

    foreach (var indices in indexSets)
    {
        var elements = indices.Select(i => grid[i]).ToArray();
        if (!string.IsNullOrEmpty(elements[0]) && elements[0] == elements[1] && elements[0] == elements[2])
        {
            return elements[0];
        }
    }

    return null;
}

使用示例:

public static void Main(string[] args)
{
    var testSet = new string[]
    {
        "X", "O", "O",
        "O", "X", "O",
        "O", "X", "X"
    };
    var winner = GetWinner(testSet);
    if (winner != null)
    {
        Console.WriteLine($"{winner} wins!");
    }
}

Try it online

【讨论】:

    【解决方案4】:

    要将三个数组元素与给定值进行比较,可以通过多种方式完成,但最直接的方法可能是简单地构建二进制真值语句并将其放入 if 语句中:

    if (gridValues[0] == 'X' && gridValues[1] == gridValues[0] && gridValues[2] == gridValues[0])
    {
        /* do something */
    }
    else
    {
        /* do something else */
    }
    

    也就是说,我认为我不会使用这种方法来解决您尝试在 3 x 3 网格中连续查找三个“X”的整体问题。

    【讨论】:

    • 用for循环不是更干净吗?
    • 我试图回答直接的问题,“那么我如何检查 gridValues[0]、gridValues[1] 和 gridValues[2](第一行)是否都等于 ' X'?”
    • 请看我的回答 :)
    • 我做到了。我不认为在循环中将三个变量与固定值进行比较比上面的if 语句更有效。
    • 虽然此代码 sn-p 可能是解决方案,但 including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
    【解决方案5】:

    如果它们是数组中唯一的值(我的意思是如果数组只包含要比较的值)

    linq 一行就可以搞定!

    这是一个例子:

    string[] arr = { "X", "X", "X" };
    var test = arr.All(x => x == "X");
    Console.WriteLine(test); // Will return true if all of them is X
    

    否则,您可以循环获取第一个值:

    for(int i=0;i<3;i++){
    if(gridValues[i] != "X")
      {
        Console.WriteLine("Not equls");
        break;
      }
    }
    

    【讨论】:

    • @john 好吧,我不是在设计他的游戏,我是在回答他关于将数组中的三个值与特定字符串进行比较的具体问题,这不是他的问题吗?
    • 但是您不是在比较数组中的 3 个值,而是在比较数组中的所有值。在你的第二个例子中,如果他想要比较的值不相邻会发生什么?
    • 我对第一个 linq 代码说:如果他的数组中只有他想要的三个元素,则使用 linq,否则:我编写了 for 循环 :) 所以我给了他两种方式,他可以拿走他需要的东西,因为他也没有指定数组长度:) 编辑:在您编辑评论之后:他要求将这三个与 X 进行比较,所以如果其中任何一个不正确,将会中断这就是他问的问题:)我是对的?
    • 他还说:“还有没有更简单的方法可以检查所有的组合?”
    • 是的,我给了他一行 linq 和 for 循环。再说一遍:仅回答他的具体问题 :) 考虑到这一行,他 在我学习 C# 时为自己编写了一个项目,所以我不想为他设计游戏,因为他什么都学不到 :)但是给他如何比较的想法,然后他可以设计它以从他的错误中吸取教训。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 2022-06-19
    • 2016-01-21
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    相关资源
    最近更新 更多