private int FloodFill(Point node, Element.Direction kierunek, int szukanaKrawedz)
{
int numberOfShield = 0;
Element target = _board[node.X][node.Y];
if (target.additional == 1) // jesli jest katedrą
return 5;
bool first = true;
Queue<Point> Q = new Queue<Point>();
List<Point> policzone = new List<Point>();
if (szukanaKrawedz == (int)Element.Edges.EndRoad) szukanaKrawedz = (int)Element.Edges.Road;
if (szukanaKrawedz == (int)Element.Edges.EndTown) szukanaKrawedz = (int)Element.Edges.Town;
Q.Enqueue(node);
while (Q.Count != 0)
{
Point n = Q.Dequeue();
if (_board[n.X][n.Y].additional == 2 && !policzone.Contains(new Point(n.X, n.Y)))
numberOfShield += 1;
if (first)
{
if (n.X < _board.Length - 1 && n.Y < _board[0].Length - 1 && n.X >= 1 && n.Y >= 1)
{
policzone.Add(n);
target = _board[n.X][n.Y];
if (!policzone.Contains(new Point(n.X - 1, n.Y)) && (target.leftEdge == szukanaKrawedz || target.leftEdge == szukanaKrawedz + 1) && _board[n.X - 1][n.Y].rightEdge != -10)
{
Q.Enqueue(new Point(n.X - 1, n.Y));
}
if (!policzone.Contains(new Point(n.X + 1, n.Y)) && (target.rightEdge == szukanaKrawedz || target.rightEdge == szukanaKrawedz + 1) && _board[n.X + 1][n.Y].leftEdge != -10)
{
Q.Enqueue(new Point(n.X + 1, n.Y));
}
if (!policzone.Contains(new Point(n.X, n.Y + 1)) && (target.upEdge == szukanaKrawedz || target.upEdge == szukanaKrawedz + 1) && _board[n.X][n.Y + 1].bottomEdge != -10)
{
Q.Enqueue(new Point(n.X, n.Y + 1));
}
if (!policzone.Contains(new Point(n.X, n.Y - 1)) && (target.bottomEdge == szukanaKrawedz || target.bottomEdge == szukanaKrawedz + 1) && _board[n.X][n.Y - 1].upEdge != -10)
{
Q.Enqueue(new Point(n.X, n.Y - 1));
}
first = false;
}
}
else
{
if (n.X < _board.Length - 1 && n.Y < _board[0].Length - 1 && n.X >= 1 && n.Y >= 1)
{
policzone.Add(n);
target = _board[n.X][n.Y];
if (!policzone.Contains(new Point(n.X - 1, n.Y)) && (target.leftEdge == szukanaKrawedz) && _board[n.X - 1][n.Y].rightEdge != -10)
{
Q.Enqueue(new Point(n.X - 1, n.Y));
}
if (!policzone.Contains(new Point(n.X + 1, n.Y)) && (target.rightEdge == szukanaKrawedz) && _board[n.X + 1][n.Y].leftEdge != -10)
{
Q.Enqueue(new Point(n.X + 1, n.Y));
}
if (!policzone.Contains(new Point(n.X, n.Y + 1)) && (target.upEdge == szukanaKrawedz) && _board[n.X][n.Y + 1].bottomEdge != -10)
{
Q.Enqueue(new Point(n.X, n.Y + 1));
}
if (!policzone.Contains(new Point(n.X, n.Y - 1)) && (target.bottomEdge == szukanaKrawedz) && _board[n.X][n.Y - 1].upEdge != -10)
{
Q.Enqueue(new Point(n.X, n.Y - 1));
}
}
}
}
if (numberOfShield != 0)
{
int sum = 0;
sum = policzone.Count * (numberOfShield *2);
return sum;
}
else
return policzone.Count;
}