private Boolean IsGameOver(IEnumerable<GameCell> cells, Int32 gameTableSize)
        {
            var hasNoFreeCell = cells.All(cell => cell.Owner != Player.NonPlayer);

            var scores = new Int32[2*gameTableSize + 2];
            var players = Players.ToArray();

            foreach (var cell in cells)
            {
                var point = CalculatePoint(cell, players);
                var row = cell.Location.X;
                var column = cell.Location.Y;

                scores[row] += point;
                scores[gameTableSize + column] += point;
                if (row == column) scores[2*gameTableSize] += point;
                if (gameTableSize - 1 - column == row) scores[2*gameTableSize + 1] += point;
            }

            foreach (var score in scores)
            {
                if (score == gameTableSize)
                {
                    Winner = players[0];
                }
                else if (score == -gameTableSize)
                {
                    Winner = players[1];
                }
            }

            var hasWinner = Winner != Player.NonPlayer;

            return hasNoFreeCell || hasWinner;
        }
        public void StartGame(IEnumerable<Player> players)
        {
            if (players == null)
                throw new ArgumentNullException(nameof(players));

            if (players.Count() != 2)
                throw new ArgumentException("Only two players can play.");

            Players = players;
            Winner = Player.NonPlayer;

            GameStatus = GameStatus.Playing;
            currentPlayerIndex = 0;

            gameCells = GenerateGameTable(GameTableSize);
        }
        private static Int32 CalculatePoint(GameCell cell, Player[] players)
        {
            if (cell.Owner == players[0]) return 1;
            if (cell.Owner == players[1]) return -1;

            return 0;
        }