【问题标题】:Finding out Horizontal/Vertically aligned markers in a matrix找出矩阵中水平/垂直对齐的标记
【发布时间】:2021-12-11 18:37:17
【问题描述】:

如何解决 C# 中的井字游戏问题。

游戏规则是,在一个 3*3 的方格棋盘中,玩家轮流进行。 当玩家有 3 个水平或垂直对齐的标记时,玩家获胜。

player1Marker =  new List<(int x, int y)>
    {
       (x:2, y:2),
       (x:1, y:1),
       (x:0, y:2),
       (x:2, y:0),
    }

player2Marker =  new List<(int x, int y)>
        {
           (x:0, y:1),
           (x:0, y:0),
           (x:1, y:2)
        }

游戏从 player1 开始。 玩家 1 第 1 步:[2,2] 玩家 2 第 1 步:[0,1] 等等。

玩家 1 获胜,输出为 [[1,1],[0,2],[2,0]]

public List<(int x, int y)> GetWinningCombo(List<(int x, int y)> player1Markers, List<(int x, int y)> player2Markers)
    {
        
        return new List<(int x, int y)>();
    }

【问题讨论】:

  • 我不确定这里的实际问题是什么。您可以假设我们都知道井字游戏的工作原理,但您对它的实际编程问题是什么?
  • 好的,你是说你的GetWinningCombo(...)函数没有完成,你需要帮助来完成它吗?
  • @RBarryYoung:是的,达到了获胜组合 [[1,1],[0,2],[2,0]]。任何实现这一目标的指南/方法都会有所帮助。

标签: c# .net algorithm matrix


【解决方案1】:

这是一种方法:

    public List<(int x, int y)> GetWinningCombo(List<(int x, int y)> player1Markers, List<(int x, int y)> player2Markers)
    {
        // make the board
        int[,] brd = new int[3, 3];
        // add player1 markers
        foreach ((int x, int y) mrk in player1Markers)
        {
            brd[mrk.x, mrk.y] = 1;
        }
        // add player2 markers
        foreach ((int x, int y) mrk in player2Markers)
        {
            brd[mrk.x, mrk.y] = 2;
        }

        // check horizontals
        for(int i=0; i<=2; i++)
        {
            if (brd[i, 0] > 0 && brd[i, 0] == brd[i, 1] && brd[i, 1] == brd[i, 2])
                return new List<(int x, int y)> { (i, 0), (i, 1), (i, 2) };
        }

        // check veritcals
        for (int i = 0; i <= 2; i++)
        {
            if (brd[0, i] > 0 && brd[0, i] == brd[1, i] && brd[1, i] == brd[2, i])
                return new List<(int x, int y)> { (0, i), (1, i), (2, i) };
        }

        // check diagonals
        if (brd[0, 0] > 0 && brd[0, 0] == brd[1, 1] && brd[1, 1] == brd[2, 2])
            return new List<(int x, int y)> { (0, 0), (1, 1), (2, 2) };
        if (brd[2, 0] > 0 && brd[2, 0] == brd[1, 1] && brd[1, 1] == brd[0, 2])
            return new List<(int x, int y)> { (2, 0), (1, 1), (0, 2) };

        // no wins, return empty list
        return new List<(int x, int y)>();
    }

【讨论】:

    猜你喜欢
    • 2010-10-29
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 2014-12-05
    相关资源
    最近更新 更多