Пример #1
0
        private (Player Winner, int[] Positions)? DetectGameOver()
        {
            // check vertical for winner
            for (var i = 0; i < 3; i++)
            {
                var vertWin = CheckLine(i, i + 3, i + 6);
                if (vertWin.Winner != Player.Nobody)
                {
                    return(vertWin);
                }
            }

            // check horizontal for winner
            for (var i = 0; i < 9; i += 3)
            {
                var horizWin = CheckLine(i, i + 1, i + 2);
                if (horizWin.Winner != Player.Nobody)
                {
                    return(horizWin);
                }
            }

            // check top-left to bottom-right for winner
            var diag1Win = CheckLine(0, 4, 8);

            if (diag1Win.Winner != Player.Nobody)
            {
                return(diag1Win);
            }

            // check top-right to bottom-left for winner
            var diag2Win = CheckLine(2, 4, 6);

            if (diag2Win.Winner != Player.Nobody)
            {
                return(diag2Win);
            }

            // check tie
            if (Board.All(b => b != Player.Nobody))
            {
                return(Player.Nobody, new int[0]);
            }

            return(null);

            (Player Winner, int[] Positions) CheckLine(int a, int b, int c)
            {
                if (Board[a] == Board[b] && Board[a] == Board[c])
                {
                    return(Board[a], new[] { a, b, c });
                }

                return(Player.Nobody, new int[0]);
            }
        }