private void Button_Click(object sender, RoutedEventArgs e) { var position = SokobanPosition.LoadFromFile(defaultLevel); //position.GetSuccessors(); //this.Draw(canvas, position); //return; var solver = new Solver <SokobanPosition>(); this.solution = solver.AStar(position); string str = ""; if (solution.FinalPosition != null) { this.index = 0; this.path = SokobanUtil.GetFullPath(solution.GetPath().ToArray()); this.DrawStep(); str += string.Format("time: {0}\n", solution.Time); str += string.Format("pushes: {0}\n", solution.GetPath().Count - 1); str += string.Format("expanded: {0}\n", solution.ExpandedNodesCount); str += string.Format("visited: {0}\n", solution.VisitedNodesCount); str += string.Format("all steps: {0}\n", SokobanUtil.GetFullPath(solution.GetPath().ToArray()).Count - 1); } else { str = "Solution not found"; } textBox.Clear(); textBox.Text = str; }
private void Window_Initialized(object sender, EventArgs e) { var position = SokobanPosition.LoadFromFile(defaultLevel); position.GetSuccessors(); this.Draw(canvas, position); }
void SolveListener() { //读取地图符号 List <Level> stagelist = GameObject.Find("Level").GetComponent <Levels>().levels; int index = GameObject.Find("Level").GetComponent <Levels>().CurrentLevel - 1; Level currentStage = stagelist[index]; string stageDef = ""; for (int _y = 0; _y < currentStage.SizeY; _y++) { for (int _x = 0; _x < currentStage.SizeX; _x++) { char s = currentStage.levelDef[_x * currentStage.SizeY + _y][0]; stageDef += s; if (_x == currentStage.SizeX - 1) { stageDef += Environment.NewLine; } } } Debug.Log(stageDef); FileStream stream = File.Open("temp.txt", FileMode.OpenOrCreate, FileAccess.Write); stream.Seek(0, SeekOrigin.Begin); stream.SetLength(0); stream.Close(); StreamWriter sw = new StreamWriter("temp.txt", true, System.Text.Encoding.GetEncoding("gb2312")); sw.WriteLine(stageDef); sw.Flush(); sw.Close(); //算出路径 var position = SokobanPosition.LoadFromFile("temp.txt"); var solver = new Solver <SokobanPosition>(); Solution <SokobanPosition> solution = solver.AStar(position); if (solution.FinalPosition != null) { path = SokobanUtil.GetFullPath(solution.GetPath().ToArray()); SolveText.GetComponent <Text>().text = "Solution: \n" + path; } else { SolveText.GetComponent <Text>().text = "Solution not found."; } //按钮 播放动画 ↑↓←→ Button btn2 = GameObject.Find("UI/Button2").GetComponent <Button>(); btn2.interactable = true; btn2.onClick.AddListener(StartAnimate); }
public void SokobanPosition_GetUniqueId() { SokobanPosition pos = SokobanPosition.LoadFromFile("C:\\Projects\\git\\SokobanSolver\\levels\\sokoban1.txt"); var a = pos.GetUniqueId(); }
private void Draw(Canvas canvas, SokobanPosition position) { canvas.Children.Clear(); double dx = 20; double dy = 20; for (int x = 0; x < position.Width; x++) { for (int y = 0; y < position.Height; y++) { double sx = x * dx; double sy = y * dy; switch (position.Map[x, y]) { case Constants.WALL: canvas.Children.Add(this.CreateFilledRectangle(sx, sy, dx, dy, blackBrush)); break; case Constants.STONE: canvas.Children.Add(this.CreateFilledRectangle(sx, sy, dx, dy, whiteBrush)); canvas.Children.Add(this.CreateFilledEllipse(sx, sy, dx, dy, greenBrush)); break; case Constants.GOALSTONE: canvas.Children.Add(this.CreateFilledRectangle(sx, sy, dx, dy, yellowBrush)); canvas.Children.Add(this.CreateFilledEllipse(sx, sy, dx, dy, greenBrush)); break; case Constants.GOAL: canvas.Children.Add(this.CreateFilledRectangle(sx, sy, dx, dy, yellowBrush)); break; default: canvas.Children.Add(this.CreateFilledRectangle(sx, sy, dx, dy, whiteBrush)); break; } if (x == position.Player.X && y == position.Player.Y) { canvas.Children.Add(this.CreatePlayer(sx, sy, dx, dy, blueBrush)); } if (position.DeadlockMap != null) { if (position.DeadlockMap[x, y] && position.Map[x, y] != Constants.WALL) { canvas.Children.Add(this.CreateFilledRectangle(sx + 1, sy + 1, dx - 1, dy - 1, transparentRedBrush)); } } if (position.StonesMap[x, y] > 0) { canvas.Children.Add(this.CreateFilledRectangle(sx + 5, sy + 5, dx - 10, dy - 10, yellowBrush)); } } } for (int i = 0; i < position.Stones.Length; i++) { double sx = position.Stones[i].X * dx; double sy = position.Stones[i].Y * dy; canvas.Children.Add(this.CreateFilledRectangle(sx + 7, sy + 7, dx - 14, dy - 14, blueBrush)); } }