예제 #1
0
        public static List <Coordinates> GetWinCoordinates(GameProcessStatistic gameProcessStatistic)
        {
            var resultList = new List <Coordinates>();

            if (gameProcessStatistic.WinStatistic.MoveDirection == MoveDirection.Left)
            {
                for (var x = 0; x < GameFieldConstants.CellsCountToWin; x++)
                {
                    resultList.Add(new Coordinates
                    {
                        X = gameProcessStatistic.WinStatistic.X - x,
                        Y = gameProcessStatistic.WinStatistic.Y
                    });
                }

                return(resultList);
            }

            if (gameProcessStatistic.WinStatistic.MoveDirection == MoveDirection.Up)
            {
                for (var y = 0; y < GameFieldConstants.CellsCountToWin; y++)
                {
                    resultList.Add(new Coordinates
                    {
                        X = gameProcessStatistic.WinStatistic.X,
                        Y = gameProcessStatistic.WinStatistic.Y - y
                    });
                }

                return(resultList);
            }

            if (gameProcessStatistic.WinStatistic.MoveDirection == MoveDirection.LeftUp)
            {
                for (var factor = 0; factor < GameFieldConstants.CellsCountToWin; factor++)
                {
                    resultList.Add(new Coordinates
                    {
                        X = gameProcessStatistic.WinStatistic.X - factor,
                        Y = gameProcessStatistic.WinStatistic.Y - factor
                    });
                }

                return(resultList);
            }

            for (var factor = 0; factor < GameFieldConstants.CellsCountToWin; factor++)
            {
                resultList.Add(new Coordinates
                {
                    X = gameProcessStatistic.WinStatistic.X + factor,
                    Y = gameProcessStatistic.WinStatistic.Y - factor
                });
            }

            return(resultList);
        }
        public void GenerateNextGeneration(TicTacToeContext context)
        {
            var indivadualIds = this.GetIndividualIds(context);

            foreach (var indivadualId in indivadualIds)
            {
                var isCross = true;

                for (var gameNumber = 0; gameNumber < 50; gameNumber++)
                {
                    var gameId                     = this.CreateNewGame(context);
                    var isGeneticBotTurn           = isCross;
                    GameProcessStatistic statistic = null;

                    do
                    {
                        statistic        = isGeneticBotTurn ? this.MakeGeneticBotStep(gameId, context) : this.MakeMonkeyBotStep(gameId, context);
                        isGeneticBotTurn = !isGeneticBotTurn;
                    }while (statistic.GameStatus == GameStatus.InProgress);

                    if (statistic.GameStatus == GameStatus.Draw)
                    {
                        this.TakeDraw(gameId, indivadualId, context);
                    }
                    else
                    {
                        this.Win(gameId, indivadualId, isCross, context);
                    }

                    isCross = !isCross;
                }
            }

            var winners = this.TakeThreeWinners(context);

            this.AddMutations(winners, context);
            this.AddIntersections(winners, context);
            this.AddNewMember(winners[0], context);
        }