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);
        }
Beispiel #7
0
        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);
        }
Beispiel #8
0
        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();
        }
Beispiel #10
0
        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);
        }
Beispiel #15
0
        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();
            }
        }
Beispiel #16
0
 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);
            }
        }
Beispiel #18
0
 public void Save()
 {
     _db.SaveChanges();
 }
Beispiel #19
0
 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();
        }