/// <summary> /// Represent vertical win condition delegate /// </summary> /// <param name="gameData"></param> /// <returns></returns> private IEnumerable <IBingoValue <int> > VerticalWinConditionCheck(IBingoGameSession <int> gameData) { var groupedValues = gameData.MatchesValues.GroupBy(val => val.VerticalPosition); var conditionResult = groupedValues.FirstOrDefault(gr => gr.Count() >= gameData.Board.BoardHeight); return(conditionResult); }
public (bool, IEnumerable <int>) CheckOnWin(IBingoGameSession <int> gameSessionData) { (bool, IEnumerable <int>)result = (false, null); var winConditionResult = this.GameEngnine.IsWinConditionFound(gameSessionData); result.Item1 = winConditionResult.Item1; result.Item2 = winConditionResult.Item2?.Select(item => item.BingoValue); return(result); }
/// <summary> /// Find of any win conditions results that satisfy the conditions /// </summary> /// <param name="gameSession">game session data</param> /// <returns>Tuple of (if win conditions founded + win values if they exists)</returns> public (bool, IEnumerable <IBingoValue <int> >) WinConditionProcessing(IBingoGameSession <int> gameSession) { (bool, IEnumerable <IBingoValue <int> >)winConditionResult = (false, null); var invokedProcessingResult = this.DefaultWinConditions.Select(condition => condition.Value.Invoke(gameSession)); var winValues = invokedProcessingResult.FirstOrDefault(res => res != null); winConditionResult.Item1 = winValues != null; winConditionResult.Item2 = winValues; return(winConditionResult); }
/// <summary> /// Repesents diagonal win condition delegate /// </summary> /// <param name="gameData">game session data</param> /// <returns></returns> private IEnumerable <IBingoValue <int> > DiagonalWinConditionCheck(IBingoGameSession <int> gameData) { IEnumerable <IBingoValue <int> > winElements = null; var matches = gameData.MatchesValues.Where(val => val.HorizontalPosition == val.VerticalPosition); if (matches.Count() >= gameData.Board.BoardHeight) { winElements = matches; } return(winElements); }
public IBingoGameSession <int> CreatePlayerSessionData() { IBingoGameSession <int> generatedData = null; try { generatedData = this.GameEngnine.InitializeGameSession(); } catch (Exception ex) { this.Log(ex.Message); throw; } return(generatedData); }
public int GameStepProcessing(IBingoGameSession <int> sessionData) { int randomValue = this.randomizer.Next(BingoStaticData.DefaultBingoMinValue, BingoStaticData.DefaultBingoMaxValue); while (sessionData.SessionExistingValues.Contains(randomValue)) { randomValue = this.randomizer.Next(BingoStaticData.DefaultBingoMinValue, BingoStaticData.DefaultBingoMaxValue); } sessionData.SessionExistingValues.Add(randomValue); for (int posX = 0; posX < sessionData.Board.BoardWidth; posX++) { for (int posY = 0; posY < sessionData.Board.BoardHeight; posY++) { if (sessionData.Board.BoardRepresentation[posX, posY] == randomValue) { var bingoPoint = new DefaultBingoValue(posX, posY, sessionData.Board.BoardRepresentation[posX, posY]); sessionData.MatchesValues.Add(bingoPoint); } } } return(randomValue); }
public int Roll(IBingoGameSession <int> gameSessionData) { int generatedValue = this.GameEngnine.GameStepProcessing(gameSessionData); return(generatedValue); }
public (bool, IEnumerable <IBingoValue <int> >) IsWinConditionFound(IBingoGameSession <int> sessionData) { var winResult = this.winProcessing.WinConditionProcessing(sessionData); return(winResult); }