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; }