public IPuzzleMove selectMove(IPuzzleState gameState) { if (rnd.NextDouble() < inertiaProbability) { List <IPuzzleMove> moves = gameState.GetMoves(); SokobanGameState state = (SokobanGameState)gameState; foreach (IPuzzleMove m in moves) { SokobanPushMove push = (SokobanPushMove)m; if (push.MoveList.Count() == 0) { return(m); } } } return(gameState.GetRandomMove()); }
public static GoalMacro GenerateGoalMacro(Position playerPosition, Position goal, Position entrance, List <Position> boxesInGoal, SokobanGameState state) { SokobanGameState clone = (SokobanGameState)state.Clone(); clone.ClearBoardForGoalMacro(boxesInGoal, goal, entrance); if (clone.Board[playerPosition.X, playerPosition.Y] == SokobanGameState.EMPTY || clone.Board[playerPosition.X, playerPosition.Y] == SokobanGameState.GOAL) { clone.SetPlayerPosition(playerPosition); AbstractSokobanState clearState = new AbstractSokobanState(clone.ToString(), clone.RewardType, false, false, false, false, clone.SimulationStrategy, null); SokobanPushMove pushMove = SolveMacro(clearState); if (pushMove != null) { return(new GoalMacro(playerPosition, pushMove)); } } return(null); }
private void Init(SokobanGameState state, RewardType rewardType, bool useNormalizedPosition, bool useGoalMacro, bool useTunnelMacro, bool useGoalCut, ISPSimulationStrategy simulationStrategy, MersenneTwister rng = null) { this.useNormalizedPosition = useNormalizedPosition; this.state = (SokobanGameState)state; if (simulationStrategy == null) { simulationStrategy = new SokobanRandomStrategy(); } if (rng == null) { rng = new MersenneTwister(); } this.rng = rng; this.rewardType = rewardType; this.simulationStrategy = simulationStrategy; normalizedPlayerPosition = new Position(state.PlayerX, state.PlayerY); availableMoves = null; this.useGoalMacro = useGoalMacro; this.useTunnelMacro = useTunnelMacro; this.useGoalCut = useGoalCut; if (useGoalMacro) { goalMacroTree = GoalMacroWrapper.BuildMacroTree(this); if (goalMacroTree.Roots.Length > 0) { currentGoalMacroNode = GetInitialMacroNode(goalMacroTree.Roots[0], state.GetGoalMacroHash(goalMacroTree.GoalsInRoom)); if (currentGoalMacroNode == null) { this.useGoalMacro = false; } } else { this.useGoalMacro = false; } } }
public AbstractSokobanState(SokobanGameState state, RewardType rewardType, bool useNormalizedPosition, bool useGoalMacro, bool useTunnelMacro, bool useGoalCut, ISPSimulationStrategy simulationStrategy = null, MersenneTwister rng = null) { Init(state, rewardType, useNormalizedPosition, useGoalMacro, useTunnelMacro, useGoalCut, simulationStrategy, rng); }