Exemple #1
0
        public void Test()
        {
            string word = "blue hades";
            var problemnum = 2;
            int unitIndex = 2;
            int seedIndex = 5;

            var problem = ProblemsSet.GetProblem(problemnum);
            var originalUnit = problem.units[unitIndex];
            var prefix = new List<MoveType>();
            var spawnedUnit = Game.SpawnUnit(originalUnit, problem).Move(MoveType.SE).Move(MoveType.SW);
            var unit = spawnedUnit;
            var units = new List<Unit> { unit };

            foreach (var c in word)
            {
                var moveType = MoveTypeExt.Convert(c);
                unit = unit.Move(moveType.Value);
                units.Add(unit);
            }
            var minX = units.SelectMany(x => x.members).Min(t => t.x);
            while (minX < 0)
            {
                prefix.Add(MoveType.E);
                minX++;
            }
            while (minX > 0)
            {
                prefix.Add(MoveType.W);
                minX--;
            }
            prefix.Add(MoveType.SE);
            prefix.Add(MoveType.SW);

            var game = new SolverGame(problem, problem.sourceSeeds[seedIndex], new string[0]);
            game.Step();
            var danananananananananananananan = "danananananananananananananan";
            game.ApplyUnitSolution(danananananananananananananan);
            if (game.state != GameBase.State.End && game.state != GameBase.State.WaitUnit)
                throw new InvalidOperationException(string.Format("Invalid game state: {0}", game.state));
            game.Step();
            Assert.That(game.spawnedUnitIndex, Is.EqualTo(unitIndex));
            var staticPowerPhraseBuilder = new StaticPowerPhraseBuilder();
            var solution = staticPowerPhraseBuilder.Build(prefix) + word;
            Console.Out.WriteLine(danananananananananananananan + solution);
            game.ApplyUnitSolution(solution);

            var output = new Output
            {
                problemId = problemnum,
                seed = problem.sourceSeeds[seedIndex],
                solution = danananananananananananananan + solution
            };
        }
		    public SolverGame Clone()
		    {
		        var newgame = new SolverGame(problem, seed, this.knownMagicSpells);
                newgame.map = map.Clone();
                newgame.state = state;
                newgame.currentUnit = currentUnit;
                newgame.currentUnitIndex = currentUnitIndex;
                newgame.currentMovesScore = currentMovesScore;
                newgame.currentSpellsScore = currentSpellsScore;
                newgame.previouslyExplodedLines = previouslyExplodedLines;
                newgame.enteredString = new StringBuilder(enteredString.ToString());
                newgame.EnteredMagicSpells = new List<string>(EnteredMagicSpells);
                newgame.step = step;
                newgame.forbiddenSequenceChecker = forbiddenSequenceChecker;
                newgame.moves = new List<MoveType>(moves);
                newgame.spawnedUnitIndex = spawnedUnitIndex;
		        return newgame;
		    }
		public string Solve(Problem problem, int seed, string[] powerPhrases)
		{
			var finalPowerPhraseBuilder = new SimplePowerPhraseBuilder(powerPhrases);
			var spelledPhrases = new bool[powerPhrases.Length];
			var solution = new List<MoveType>();
			var game = new SolverGame(problem, seed, powerPhrases);
			while (true)
			{
				switch (game.state)
				{
					case GameBase.State.WaitUnit:
						game.Step();
						break;
					case GameBase.State.UnitInGame:
						var reachablePositions = new ReachablePositionsWithWords(game.map, powerPhrases, spelledPhrases);
						var evaluatePositions = new EvaluatePositions2(game.map);
						var endPositions = reachablePositions.EndPositions(game.currentUnit);
						var estimated = new Dictionary<Unit, double>();
						var bestPosition = endPositions.ArgMax(p =>
						{
							double value;
							if (estimated.TryGetValue(p.Item1, out value))
								return value;
							return estimated[p.Item1] = evaluatePositions.Evaluate(p.Item1);
						});
						var score = evaluatePositions.Evaluate(bestPosition.Item1);
						var wayToBestPosition = bestPosition.Item2;
						var unitSolution = staticPowerPhraseBuilder.Build(wayToBestPosition.path);
						SolutionAdded(game, unitSolution);
						game.ApplyUnitSolution(unitSolution);
						spelledPhrases = wayToBestPosition.spelledWords;
						solution.AddRange(wayToBestPosition.path);
						break;
					case GameBase.State.EndInvalidCommand:
					case GameBase.State.EndPositionRepeated:
						throw new InvalidOperationException(string.Format("Invalid state: {0}", game.state));
					case GameBase.State.End:
						return finalPowerPhraseBuilder.Build(solution);
					default:
						throw new ArgumentOutOfRangeException();
				}
			}
		}
        public override string Solve(Problem problem, int seed, string[] powerPhrases)
        {
            var finalPowerPhraseBuilder = new SimplePowerPhraseBuilder(powerPhrases);
            var spelledPhrases = new bool[powerPhrases.Length];
            var solution = new List<MoveType>();
            var game = new SolverGame(problem, seed, powerPhrases);
            while (true)
            {
                switch (game.state)
                {
                    case GameBase.State.WaitUnit:
                        game.Step();
                        break;
                    case GameBase.State.UnitInGame:
                        if (nextUnitsPositions == null || !nextUnitsPositions.Any())
                        {
                            var bestPositions = FindBestPositions_Recursive(unitsAhead, game.map.Clone(),
                                new[] { game.currentUnit }.Concat(game.GetAllRestUnits()).ToArray(), 0, powerPhrases, spelledPhrases);
                            nextUnitsPositions = bestPositions.Item2.ToList();
                        }
                        var wayToBestPosition = nextUnitsPositions.First();
                        nextUnitsPositions = nextUnitsPositions.Skip(1).ToList();

                        var unitSolution = staticPowerPhraseBuilder.Build(wayToBestPosition.Item2.path);
                        CallEvent(game, unitSolution);
                        game.ApplyUnitSolution(unitSolution);
                        solution.AddRange(wayToBestPosition.Item2.path);
                        spelledPhrases = wayToBestPosition.Item2.spelledWords;
                        break;
                    case GameBase.State.EndInvalidCommand:
                    case GameBase.State.EndPositionRepeated:
                        throw new InvalidOperationException(string.Format("Invalid state: {0}", game.state));
                    case GameBase.State.End:
                        return finalPowerPhraseBuilder.Build(solution);
                    default:
                        throw new ArgumentOutOfRangeException();
                }
            }
        }