/// <summary> /// Execute an action on an agent /// </summary> public void Execute(Agent agent, Action action) { if (action == null) { return; } var executed = false; switch (action.Type) { case ActionType.Move: executed |= MoveAgent(agent, agent.Direction); break; case ActionType.Turn: var turnAction = action as TurnAction; var turnDirection = agent.Direction.GetRelative(turnAction.GetDirection()); if (Maze.CanGoInDirection(agent.Location, turnDirection)) { agent.Direction = turnDirection; executed = true; } break; case ActionType.Look: var lookAction = action as LookAction; var reaction = lookAction.Reaction(agent.Direction, Maze.Look(agent.Location)); agent.Direction = Maze.CanGoInDirection(agent.Location, reaction) ? reaction : Maze.GetAvailableLocationDirections(agent.Location) .First(location => location.Direction != agent.Direction) .Direction; executed = true; break; } agent.CurrentAction = null; if (executed) { agent.ActionsExecuted++; } SetActionsText(agent.Type, agent.GetActionCount()); }
/// <summary> /// Prints current Gene values and resets the environment with new genes selected /// </summary> public void Reset() { AddLine(AgentType.Pacman, string.Format("\nGeneration: {3}/{0} Actions: {2} Fitness: {1}", _pacmanGeneIndex, GetFitnessValue(Pacman), Pacman.GetActionCount(), Pacman.Evolutions), true); AddLine(AgentType.Ghost, string.Format("\nGeneration: {3}/{0} Actions: {2} Fitness: {1}", _ghostGeneIndex, GetFitnessValue(Ghost), Ghost.GetActionCount(), Ghost.Evolutions), true); Maze.MoveAgent(Pacman, Pacman.Reset()); Maze.MoveAgent(Ghost, Ghost.Reset()); Maze.ReplaceFruits(_settings.RandomFruitPositions); SetNextGenes(); _fruitsCollected = 0; SetFruitsCollected(0); SetActionsText(AgentType.Ghost, 0); SetActionsText(AgentType.Pacman, 0); _isPlaying = true; }