public void AddIntersection(GeneticIndividual first, GeneticIndividual second, TicTacToeContext context) { var newIndividual = new GeneticIndividual { GenerationNumber = first.GenerationNumber, ImportanceOrder = 7, PlayedGames = 0, Score = 0, }; context.Set <GeneticIndividual>().Add(newIndividual); context.SaveChanges(); var firstFactors = context.Set <GeneticFactor>() .Where(factor => factor.GeneticIndividualId == first.GeneticIndividualId) .ToList(); var secondFactors = context.Set <GeneticFactor>() .Where(factor => factor.GeneticIndividualId == second.GeneticIndividualId) .ToList(); var newFactors = (from firstFactor in firstFactors join secondFactor in secondFactors on firstFactor.FieldId equals secondFactor.FieldId select new GeneticFactor { Factor = (firstFactor.Factor + secondFactor.Factor) / 2, FieldId = firstFactor.FieldId, GeneticIndividualId = newIndividual.GeneticIndividualId }).ToList(); context.Set <GeneticFactor>().AddRange(newFactors); context.SaveChanges(); }
public void AddNewMember(GeneticIndividual individual, TicTacToeContext context) { var newIndividual = new GeneticIndividual { GenerationNumber = individual.GenerationNumber, ImportanceOrder = 10, PlayedGames = 0, Score = 0, }; context.Set <GeneticIndividual>().Add(newIndividual); context.SaveChanges(); var factors = context.Set <GeneticFactor>() .Where(factor => factor.GeneticIndividualId == individual.GeneticIndividualId) .ToList(); var newFactors = factors.Select(factor => new GeneticFactor { GeneticIndividualId = newIndividual.GeneticIndividualId, Factor = this.random.Next(0, 100), FieldId = factor.FieldId }).ToList(); context.Set <GeneticFactor>().AddRange(newFactors); context.SaveChanges(); }
public PlayerDTO GetPlayerInfo(Guid?playerId = null, string name = "Anonymous") { if (playerId != null) { var player = _dbContext.Players.Find(playerId); if (player == null) { player = new Player { Id = Guid.NewGuid(), Name = name, CreateTime = DateTime.UtcNow }; _dbContext.Players.Add(player); _dbContext.SaveChanges(); } return(_mapper.Map <Player, PlayerDTO>(player)); } else { var player = new Player { Id = Guid.NewGuid(), Name = String.IsNullOrEmpty(name) ? "Anonymous" : name, CreateTime = DateTime.UtcNow }; _dbContext.Players.Add(player); var i = _dbContext.SaveChanges(); return(_mapper.Map <Player, PlayerDTO>(player)); } }
public IActionResult Create([FromBody] Object o) { if (o == null) { return(BadRequest()); } TicTacToeItem result = new TicTacToeItem(); result.gameState = o.ToString(); _context.TicTacToeItems.Add(result); _context.SaveChanges(); return(new NoContentResult()); }
public GameProcessStatistic MakeMonkeyBotStep(int gameId, TicTacToeContext context) { var game = context.Set <Game>().Include(game1 => game1.Field).FirstOrDefault(game1 => game1.GameId == gameId); var field = game.Field; var fieldCode = GameHelper.GetFieldByNumber(game.FieldNumber, field); var gameField = this.fieldStateConverter.StringToGameField(fieldCode); var nextStep = this.monkeyBot.GetStep(gameField); var nextGameField = this.stepMaker.MakeStep(gameField, nextStep.X, nextStep.Y); var nextFieldCode = this.fieldStateConverter.GameFieldToString(nextGameField); var nextField = GameHelper.GetFieldByCode(nextFieldCode, context); var nextNumber = GameHelper.GetCodeNumber(nextFieldCode, nextField); var result = this.gameProcessStatisticProvider.GetGameProcessStatistic(nextGameField); game.Field = nextField; game.FieldNumber = nextNumber; game.Proccess += "|" + nextField.FieldId; context.Set <Game>().AddOrUpdate(game); context.SaveChanges(); return(result); }
public PlayerVsPlayerTakeDrawCommandResult ExecuteCommand(PlayerVsPlayerTakeDrawCommand command) { PlayerVsPlayerTakeDrawCommandResult result; using (var context = new TicTacToeContext()) { var game = context.Set <Game>().Include(game1 => game1.Field).FirstOrDefault(game1 => game1.GameId == command.GameId); var field = game.Field; var fieldCode = GameHelper.GetFieldByNumber(game.FieldNumber, field); var gameField = this.fieldStateConverter.StringToGameField(fieldCode); GameHelper.RefreshStatistic(game.GameId, GameStatus.Draw, context); context.Set <Game>().Remove(game); context.SaveChanges(); result = new PlayerVsPlayerTakeDrawCommandResult { CellSize = GameFieldConstants.LineLength, GameField = gameField, }; } return(result); }
public PlayerVsMonkeyBotWinGameCommandResult ExecuteCommand(PlayerVsMonkeyBotWinGameCommand command) { PlayerVsMonkeyBotWinGameCommandResult result; using (var context = new TicTacToeContext()) { var game = context.Set <Game>().Include(game1 => game1.Field).FirstOrDefault(game1 => game1.GameId == command.GameId); var field = game.Field; var fieldCode = GameHelper.GetFieldByNumber(game.FieldNumber, field); var gameField = this.fieldStateConverter.StringToGameField(fieldCode); var gameProcessStatistic = this.gameProcessStatisticProvider.GetGameProcessStatistic(gameField); var winCoordinates = GameHelper.GetWinCoordinates(gameProcessStatistic); GameHelper.RefreshStatistic(game.GameId, gameProcessStatistic.GameStatus, context); context.Set <Game>().Remove(game); context.SaveChanges(); result = new PlayerVsMonkeyBotWinGameCommandResult { CellSize = GameFieldConstants.LineLength, GameField = gameField, WinCoordinates = winCoordinates }; } return(result); }
public PlayerVsMonkeyBotNewGameCommandResult ExecuteCommand(PlayerVsMonkeyBotNewGameCommand command) { PlayerVsMonkeyBotNewGameCommandResult result; using (var context = new TicTacToeContext()) { var gameField = this.newGameFieldCreator.CreateNewGameField(); var fieldCode = this.fieldStateConverter.GameFieldToString(gameField); var field = GameHelper.GetFieldByCode(fieldCode, context); var number = GameHelper.GetCodeNumber(fieldCode, field); var game = new Game { Field = field, FieldNumber = number, Proccess = field.FieldId.ToString() }; context.Set <Game>().Add(game); context.SaveChanges(); var gameId = game.GameId; result = new PlayerVsMonkeyBotNewGameCommandResult { GameField = gameField, GameId = gameId, CellSize = GameFieldConstants.LineLength, IsBotTurn = random.Next(2) == 0 }; } return(result); }
public void TakeDraw(int gameId, int geneticIndividualId, TicTacToeContext context) { var game = context.Set <Game>().Include(game1 => game1.Field).FirstOrDefault(game1 => game1.GameId == gameId); GameHelper.RefreshStatistic(game.GameId, GameStatus.Draw, context); context.Set <Game>().Remove(game); context.SaveChanges(); var individual = context.Set <GeneticIndividual>() .FirstOrDefault(geneticIndividual => geneticIndividual.GeneticIndividualId == geneticIndividualId); individual.Score += 0.5; individual.PlayedGames++; context.Set <GeneticIndividual>().AddOrUpdate(individual); context.SaveChanges(); }
public PlayerVsMonkeyBotMakeStepCommandResult ExecuteCommand(PlayerVsMonkeyBotMakeStepCommand command) { PlayerVsMonkeyBotMakeStepCommandResult result; using (var context = new TicTacToeContext()) { var game = context.Set <Game>().Include(game1 => game1.Field).FirstOrDefault(game1 => game1.GameId == command.GameId); var field = game.Field; var fieldCode = GameHelper.GetFieldByNumber(game.FieldNumber, field); var gameField = this.fieldStateConverter.StringToGameField(fieldCode); CellCondition[,] nextGameField; try { nextGameField = this.stepMaker.MakeStep(gameField, command.X, command.Y); } catch (Exception) { var previousProcessStatistic = this.gameProcessStatisticProvider.GetGameProcessStatistic(gameField); return(new PlayerVsMonkeyBotMakeStepCommandResult { CellSize = GameFieldConstants.LineLength, GameId = command.GameId, GameField = gameField, GameProcessStatistic = previousProcessStatistic, }); } var nextFieldCode = this.fieldStateConverter.GameFieldToString(nextGameField); var nextField = GameHelper.GetFieldByCode(nextFieldCode, context); var nextNumber = GameHelper.GetCodeNumber(nextFieldCode, nextField); var gameProcessStatistic = this.gameProcessStatisticProvider.GetGameProcessStatistic(nextGameField); game.Field = nextField; game.FieldNumber = nextNumber; game.Proccess += "|" + nextField.FieldId; context.Set <Game>().AddOrUpdate(game); context.SaveChanges(); result = new PlayerVsMonkeyBotMakeStepCommandResult { CellSize = GameFieldConstants.LineLength, GameId = command.GameId, GameField = nextGameField, GameProcessStatistic = gameProcessStatistic }; } return(result); }
public void AddMutation(GeneticIndividual individual, TicTacToeContext context) { var newIndividual = new GeneticIndividual { GenerationNumber = individual.GenerationNumber, ImportanceOrder = 4, PlayedGames = 0, Score = 0, }; context.Set <GeneticIndividual>().Add(newIndividual); context.SaveChanges(); var factors = context.Set <GeneticFactor>() .Where(factor => factor.GeneticIndividualId == individual.GeneticIndividualId) .ToList(); var newFactors = factors.Select(factor => new GeneticFactor { GeneticIndividualId = newIndividual.GeneticIndividualId, Factor = this.winFactors.ContainsKey(factor.FieldId) ? factor.Factor + this.winFactors[factor.FieldId] * 5 : factor.Factor + this.random.Next(11) - 5, FieldId = factor.FieldId }) .Select(factor => new GeneticFactor { GeneticIndividualId = factor.GeneticIndividualId, Factor = factor.Factor > 100 ? 100 : factor.Factor < 0 ? 0 : factor.Factor, FieldId = factor.FieldId }).ToList(); context.Set <GeneticFactor>().AddRange(newFactors); context.SaveChanges(); }
public int CreateNewGame(TicTacToeContext context) { var gameField = this.newGameFieldCreator.CreateNewGameField(); var fieldCode = this.fieldStateConverter.GameFieldToString(gameField); var field = GameHelper.GetFieldByCode(fieldCode, context); var number = GameHelper.GetCodeNumber(fieldCode, field); var game = new Game { Field = field, FieldNumber = number, Proccess = field.FieldId.ToString() }; context.Set <Game>().Add(game); context.SaveChanges(); var gameId = game.GameId; return(gameId); }
public static void FillDb() { using(TicTacToeContext db = new TicTacToeContext()) { Player human = new Player { Age = 20, Email = "*****@*****.**", Name = "Stanly" }; Player Ai = new Player { Age = 100, Email = "*****@*****.**", Name = "Brainston" }; db.Players.AddRange(new List<Player> { human, Ai }); db.SaveChanges(); } }
public List <GeneticIndividual> TakeThreeWinners(TicTacToeContext context) { var individuals = context.Set <GeneticIndividual>() .OrderByDescending(individual => individual.Score / individual.PlayedGames) .ToList(); var result = individuals.OrderByDescending(individual => individual.Score / individual.PlayedGames).Take(3).ToList(); for (var order = 0; order < result.Count; order++) { result[order].ImportanceOrder = order; result[order].GenerationNumber++; context.Set <GeneticIndividual>().AddOrUpdate(result[order]); } var individualsToRemove = individuals.Except(result).ToList(); foreach (var individual in individualsToRemove) { var factors = context.Set <GeneticFactor>() .Where(factor => factor.GeneticIndividualId == individual.GeneticIndividualId) .ToList(); foreach (var factor in factors) { context.Set <GeneticFactor>().Remove(factor); } context.Set <GeneticIndividual>().Remove(individual); } context.SaveChanges(); return(result); }
public static void RefreshStatistic(int gameId, GameStatus status, TicTacToeContext context) { var game = context.Set <Game>().FirstOrDefault(game1 => game1.GameId == gameId); var fieldIds = game.Proccess.Split('|').Select(int.Parse).ToList(); //// var winPowerFactor = 0.6 - fieldIds.Count * 0.1; if (status == GameStatus.CircleWon) { var isCircle = true; foreach (var fieldId in fieldIds) { var fieldStatistic = context.Set <FieldStatistic>().FirstOrDefault(field1 => field1.FieldId == fieldId); if (isCircle) { fieldStatistic.Score += 1; //// + winPowerFactor; } else { fieldStatistic.Score += 0; //// - winPowerFactor; } fieldStatistic.PlayedGames++; context.Set <FieldStatistic>().AddOrUpdate(fieldStatistic); context.SaveChanges(); isCircle = !isCircle; } return; } if (status == GameStatus.CrossWon) { var isCross = false; foreach (var fieldId in fieldIds) { var fieldStatistic = context.Set <FieldStatistic>().FirstOrDefault(field1 => field1.FieldId == fieldId); if (isCross) { fieldStatistic.Score += 1; //// + winPowerFactor; } else { fieldStatistic.Score += 0; //// - winPowerFactor; } fieldStatistic.PlayedGames++; context.Set <FieldStatistic>().AddOrUpdate(fieldStatistic); context.SaveChanges(); isCross = !isCross; } return; } foreach (var fieldId in fieldIds) { var fieldStatistic = context.Set <FieldStatistic>().FirstOrDefault(field1 => field1.FieldId == fieldId); fieldStatistic.Score += 0.5; fieldStatistic.PlayedGames++; context.Set <FieldStatistic>().AddOrUpdate(fieldStatistic); context.SaveChanges(); } }
public virtual void Commit() { _context.SaveChanges(); }
public GameDTO MakeMove(Guid playerId, Guid gameId, short position) { using (var transaction = _dbContext.Database.BeginTransaction()) { if (!_dbContext.Players.AsQueryable().Where(p => p.Id == playerId).Any()) { transaction.Rollback(); throw new NotFoundException("Player"); } var game = _dbContext.Games .AsQueryable() .Include(g => g.GamePlayers) .Include(g => g.Movements) .Where(g => g.Id == gameId && g.GamePlayers.Where(gp => gp.PlayerId == playerId).Any()) .FirstOrDefault(); if (game == null) { transaction.Rollback(); throw new NotFoundException("Game"); } if (game.IsCompleted) { transaction.Rollback(); throw new GameException("The game is already over."); } var gameDto = _mapper.Map <DAL.Entities.Game, GameDTO>(game); var playerMovement = new MovementDTO { PlayerId = playerId, GameId = gameId, Position = position, Number = (short)game.Movements.Count() }; gameDto.Movements.Add(playerMovement); var gameIsValid = BLL.GameUtils.Game.GameIsValid(gameDto.Movements, out string message); if (!gameIsValid) { transaction.Rollback(); throw new GameException(message); } _dbContext.Movements.Add(_mapper.Map <MovementDTO, Movement>(playerMovement)); var winnerId = BLL.GameUtils.Game.GetWinnerId(gameDto.Movements, out short?[] winNumbers); if (winnerId != Guid.Empty) { gameDto.WinnerId = winnerId; gameDto.WinNumbers = winNumbers; var winner = _dbContext.Players.Find(playerId); winner.WinsCount += 1; winner.GamesCount += 1; _dbContext.Players.Update(winner); var loser = _dbContext.Players.Find(_gameBot.Id); loser.FailuresCount += 1; loser.GamesCount += 1; _dbContext.Players.Update(loser); } else if (!GameUtils.Game.MovementsIsLeft(gameDto.Movements)) { var gameBot = _dbContext.Players.Find(_gameBot.Id); gameBot.GamesCount += 1; _dbContext.Players.Update(gameBot); var player = _dbContext.Players.Find(playerId); player.GamesCount += 1; _dbContext.Players.Update(player); } gameDto.IsCompleted = winnerId != Guid.Empty || !GameUtils.Game.MovementsIsLeft(gameDto.Movements); if (!gameDto.IsCompleted) { var botMovement = _gameBot.MakeMove(gameDto.Movements); botMovement.GameId = gameDto.Id; gameDto.Movements.Add(botMovement); gameIsValid = BLL.GameUtils.Game.GameIsValid(gameDto.Movements, out message); if (!gameIsValid) { transaction.Rollback(); throw new GameException(message); } _dbContext.Movements.Add(_mapper.Map <MovementDTO, Movement>(botMovement)); winnerId = BLL.GameUtils.Game.GetWinnerId(gameDto.Movements, out winNumbers); if (winnerId != Guid.Empty) { gameDto.WinnerId = winnerId; gameDto.WinNumbers = winNumbers; var winner = _dbContext.Players.Find(_gameBot.Id); winner.WinsCount += 1; winner.GamesCount += 1; _dbContext.Players.Update(winner); var loser = _dbContext.Players.Find(playerId); loser.FailuresCount += 1; loser.GamesCount += 1; _dbContext.Players.Update(loser); } else if (!GameUtils.Game.MovementsIsLeft(gameDto.Movements)) { var gameBot = _dbContext.Players.Find(_gameBot.Id); gameBot.GamesCount += 1; _dbContext.Players.Update(gameBot); var player = _dbContext.Players.Find(playerId); player.GamesCount += 1; _dbContext.Players.Update(player); } gameDto.IsCompleted = winnerId != Guid.Empty || !GameUtils.Game.MovementsIsLeft(gameDto.Movements); } game.IsCompleted = gameDto.IsCompleted; game.WinnerId = gameDto.WinnerId; _dbContext.Games.Update(game); _dbContext.SaveChanges(); transaction.Commit(); return(gameDto); } }
public void Save() { _db.SaveChanges(); }
public void AddResult(GameResult result) { _context.GameResults.Add(result); _context.SaveChanges(); }
public void Win(int gameId, int geneticIndividualId, bool isCross, TicTacToeContext context) { var game = context.Set <Game>().Include(game1 => game1.Field).FirstOrDefault(game1 => game1.GameId == gameId); var field = game.Field; var fieldCode = GameHelper.GetFieldByNumber(game.FieldNumber, field); var gameField = this.fieldStateConverter.StringToGameField(fieldCode); var gameProcessStatistic = this.gameProcessStatisticProvider.GetGameProcessStatistic(gameField); GameHelper.RefreshStatistic(game.GameId, gameProcessStatistic.GameStatus, context); context.Set <Game>().Remove(game); context.SaveChanges(); var fieldIds = game.Proccess.Split('|').Select(int.Parse).ToList(); var winPowerFactor = 0.6 - fieldIds.Count * 0.1; var isCrossWinner = fieldIds.Count % 2 == 0; var individual = context.Set <GeneticIndividual>() .FirstOrDefault(geneticIndividual => geneticIndividual.GeneticIndividualId == geneticIndividualId); individual.Score += (isCross == isCrossWinner) ? (1 + winPowerFactor) : (0 - winPowerFactor); individual.PlayedGames++; if (isCross == isCrossWinner) { if (isCross) { for (var i = 1; i < fieldIds.Count; i++) { if (i % 2 != 0) { if (this.winFactors.ContainsKey(fieldIds[i])) { this.winFactors[fieldIds[i]]++; } else { this.winFactors.Add(fieldIds[i], 1); } } } } else { for (var i = 1; i < fieldIds.Count; i++) { if (i % 2 == 0) { if (this.winFactors.ContainsKey(fieldIds[i])) { this.winFactors[fieldIds[i]]++; } else { this.winFactors.Add(fieldIds[i], 1); } } } } } else { if (isCross) { for (var i = 1; i < fieldIds.Count; i++) { if (i % 2 != 0) { if (this.winFactors.ContainsKey(fieldIds[i])) { this.winFactors[fieldIds[i]]--; } else { this.winFactors.Add(fieldIds[i], -1); } } } } else { for (var i = 1; i < fieldIds.Count; i++) { if (i % 2 == 0) { if (this.winFactors.ContainsKey(fieldIds[i])) { this.winFactors[fieldIds[i]]--; } else { this.winFactors.Add(fieldIds[i], -1); } } } } } context.Set <GeneticIndividual>().AddOrUpdate(individual); context.SaveChanges(); }