Advertisement
Guest User

Untitled

a guest
Aug 8th, 2016
206
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 8.51 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4.  
  5. namespace Astar_Implementation
  6. {
  7.     class Program
  8.     {
  9.         public class Node
  10.         {
  11.             public int PositionX, PositionY;
  12.  
  13.             public int FCost
  14.             {
  15.                 get
  16.                 {
  17.                     return GCost + HCost; //suma
  18.                 }
  19.             }
  20.  
  21.             public int GCost; // koszt do punktu startowego
  22.             public int HCost; // koszt do mety
  23.  
  24.             public Node Parent;
  25.  
  26.             public Node(int PositionX, int PositionY)
  27.             {
  28.                 this.PositionX = PositionX;
  29.                 this.PositionY = PositionY;
  30.             }
  31.         }
  32.  
  33.         public class Map
  34.         {
  35.             public int Width, Height;
  36.  
  37.             public Map(int Width, int Height)
  38.             {
  39.                 this.Width = Width;
  40.                 this.Height = Height;
  41.             }
  42.         }
  43.  
  44.         public class Blockade
  45.         {
  46.             public int x, y;
  47.  
  48.             public Blockade(int x, int y)
  49.             {
  50.                 this.x = x;
  51.                 this.y = y;
  52.             }
  53.         }
  54.  
  55.         static public int CalculateG(Node child, Node Parent)
  56.         {
  57.             if (child.PositionX != Parent.PositionX && child.PositionY == Parent.PositionY || child.PositionX == Parent.PositionX && child.PositionY != Parent.PositionY) return Parent.GCost += 10;
  58.             else return Parent.GCost + 14;
  59.         }
  60.  
  61.         static public int CalculateH(int x, int y, int x2, int y2)
  62.         {
  63.             /*
  64.             int X = x - x2;
  65.             int Y = y - y2;
  66.             return (int)Math.Sqrt(X * X + Y * Y);
  67.             */
  68.             int cost=0;
  69.             while(x != x2 || y != y2)
  70.             {
  71.                 if (x != x2 && y == y2 || x == x2 && y != y2) cost += 10;
  72.                 else cost += 14;
  73.  
  74.                 if (x > x2) x++;
  75.                 else if (x < x2) x--;
  76.  
  77.                 if (y > y2) y++;
  78.                 else if (y < y2) y--;
  79.             }
  80.             return cost;
  81.         }
  82.  
  83.         public static List<Node> AllNodes = new List<Node>();
  84.         public static List<Node> Open = new List<Node>();
  85.         public static List<Node> Closed = new List<Node>();
  86.         public static List<Blockade> Blockades = new List<Blockade>();
  87.  
  88.         static void Main(string[] args)
  89.         {
  90.             Map m = new Map(20, 10);
  91.             Blockades.Add(new Blockade(2, 2));
  92.             Blockades.Add(new Blockade(3, 2));
  93.             Blockades.Add(new Blockade(4, 2));
  94.  
  95.             Node StartNode = new Node(1, 5);
  96.             Node EndNode = new Node(20, 5);
  97.             Node CurrNode;
  98.  
  99.             //Add nodes
  100.             for (int y = 1; y <= m.Height; y++)
  101.             {
  102.                 for (int x = 1; x <= m.Width; x++)
  103.                 {
  104.                     if (!BlockadeHavePos(x, y))
  105.                     {
  106.                         AllNodes.Add(new Node(x, y));
  107.                     }
  108.                 }
  109.             }
  110.  
  111.             StartNode.HCost = CalculateH(StartNode.PositionX, StartNode.PositionY, EndNode.PositionX, EndNode.PositionY);
  112.             StartNode.GCost = 0;
  113.  
  114.             Open.Add(StartNode);
  115.  
  116.             while (Open.Count > 0)
  117.             {
  118.                 CurrNode = Open[0];
  119.        
  120.                 for (int y = CurrNode.PositionY - 1; y <= CurrNode.PositionY + 1; y++)
  121.                 {
  122.                     for (int x = CurrNode.PositionX - 1; x <= CurrNode.PositionX + 1; x++)
  123.                     {
  124.                         if (x <= m.Width && x > 0 && y <= m.Height && y > 0)
  125.                         {
  126.                             if (!BlockadeHavePos(x, y))
  127.                             {
  128.                                 if (AllNodes.Find(item => item.PositionX == x && item.PositionY == y) != null)
  129.                                 {
  130.                                     Node n = AllNodes.Find(item => item.PositionX == x && item.PositionY == y);
  131.                                     if (!Closed.Contains(n))
  132.                                     {
  133.                                         #region finish
  134.                                         if (x == EndNode.PositionX && y == EndNode.PositionY)
  135.                                         {
  136.                                             Console.WriteLine("Found it!");
  137.  
  138.                                             List<Node> Path = new List<Node>();
  139.                                             EndNode.Parent = CurrNode;
  140.                                             Path.Add(EndNode);
  141.                                             Node ActualNode = EndNode;
  142.  
  143.                                             while (ActualNode.Parent != null)
  144.                                             {
  145.                                                 Path.Add(ActualNode.Parent);
  146.                                                 ActualNode = ActualNode.Parent;
  147.                                             }
  148.  
  149.                                             for (int Y = 1; Y <= m.Height; Y++)
  150.                                             {
  151.                                                 for (int X = 1; X <= m.Width; X++)
  152.                                                 {
  153.                                                     if (!BlockadeHavePos(X, Y))
  154.                                                     {
  155.                                                         Node n2 = AllNodes.Find(item => item.PositionX == X && item.PositionY == Y);
  156.                                                         if (X == StartNode.PositionX && Y == StartNode.PositionY) Console.Write("[S]");
  157.                                                         else if (X == EndNode.PositionX && Y == EndNode.PositionY) Console.Write("[E]");
  158.                                                         else if (Path.Contains(n2)) Console.Write("[P]");
  159.                                                         else
  160.                                                             Console.Write("[ ]");
  161.                                                     }
  162.                                                     else
  163.                                                     {
  164.                                                         Console.Write("[B]");
  165.                                                     }
  166.                                                 }
  167.                                                 Console.Write("\n");
  168.                                             }
  169.                                             Console.Read();
  170.                                             return;
  171.                                         }
  172.                                         #endregion
  173.                                         else {
  174.  
  175.                                             if (Open.Find(item => item.PositionX == n.PositionX && item.PositionY == n.PositionY) == null)
  176.                                             {
  177.                                                 n.GCost = CalculateG(n, CurrNode);
  178.                                                 n.HCost = CalculateH(x, y, EndNode.PositionX, EndNode.PositionY);
  179.                                                 n.Parent = CurrNode;
  180.                                                 Open.Add(n);
  181.                                             }
  182.                                             else
  183.                                             {
  184.                                                 if (n.GCost < CurrNode.GCost)
  185.                                                 {
  186.                                                     Open.Clear();
  187.                                                     Closed.Clear();
  188.                                                     Closed.Add(CurrNode);
  189.                                                     Open.Add(StartNode);
  190.                                                     continue;
  191.                                                 }
  192.                                             }
  193.                                         }
  194.                                     }
  195.                                 }
  196.                             }
  197.                         }
  198.                     }
  199.                 }
  200.                 Closed.Add(CurrNode);
  201.                 Open.RemoveAt(0);
  202.                 Open = Open.OrderBy(item => item.FCost).ToList();
  203.             }
  204.         }
  205.  
  206.         static bool BlockadeHavePos(int x, int y)
  207.         {
  208.             foreach (Blockade bl in Blockades)
  209.             {
  210.                 if (bl.x == x && bl.y == y) return true;
  211.             }
  212.             return false;
  213.         }
  214.     }
  215. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement