private bool runForSquares(int startx, int starty, int x, int y) { int timer = 0; Ball[] balls = (Ball[])Balls.Clone(); List<Point> peremeter = new List<Point>(); peremeter.Add(new Point(startx, starty)); foos: peremeter.Add(new Point(x, y)); Ball[] b = new Ball[4]; #if DONTDRAW #else current[(y + SIDEPAD) * W + (x + SIDEPAD)] = 'M'; // WriteChar(current, x + SIDEPAD, y + SIDEPAD, 'M'); Thread.Sleep(timer); #endif for (Direction d = Direction.Up; d <= Direction.Right; d++) { var moved = GetMovedXY(d, new Point(x, y)); b[(int)d] = balls[moved.Y * W + moved.X]; } if (b.All(a => a == Ball.Blue)) { return false; } if (b.Count(a => a == Ball.Blue) == b.Length - 1) { return false; } int m = b.ToList().IndexOf(Ball.Red); if (m == -1) { return false; } var o = getOpposite((Direction)m); if (b[(int)o] == Ball.Blue) { balls[y * W + x] = Ball.Red; var l = GetMovedXY(o, new Point(x, y)); x = l.X; y = l.Y; goto foos; } var perp = GetPerp((Direction)m); if (b[(int)perp] == Ball.Blue) { balls[y * W + x] = Ball.Red; var l = GetMovedXY(o, new Point(x, y)); x = l.X; y = l.Y; goto foos; } for (int index = 0; index < b.Length; index++) { var ball = b[index]; if (ball != Ball.Red) { continue; } var l3 = GetMovedXY(o, new Point(x, y)); if (l3.X == startx && l3.Y == starty) { var vm = peremeter;//.OrderBy(a => a.Y).OrderBy(a => a.X); bool run = true; foreach (var point in vm.GroupBy(a => a.Y).OrderBy(a => a.Key)) { var f = point.OrderBy(a => a.X).First().X; var l = point.OrderBy(a => a.X).Last().X; foreach (var g in peremeter.Where(a => a.X >= f && a.X <= l).GroupBy(a => a.X).OrderBy(a => a.Key)) { if (!(Balls[point.Key * W + g.Key] == Ball.Blue || Balls[point.Key * W + g.Key] == Ball.Red)) { run = false; } } } if (run) { foreach (var point in vm.GroupBy(a => a.Y).OrderBy(a => a.Key)) { var f = point.OrderBy(a => a.X).First().X; var l = point.OrderBy(a => a.X).Last().X; foreach (var g in peremeter.Where(a => a.X >= f && a.X <= l).GroupBy(a => a.X).OrderBy(a => a.Key)) { Balls[point.Key * W + g.Key] = Ball.Empty; //Draw(startx, starty); #if DONTDRAW #else Thread.Sleep(timer); #endif } } } else { foreach (var point in peremeter) { Balls[point.Y * W + point.X] = Ball.Red; // Draw(startx, starty); #if DONTDRAW #else Thread.Sleep(timer); #endif } } } else continue; Moves += peremeter.Count; return true; } o = getOpposite(perp); if (b[(int)o] == Ball.Blue) { balls[y * W + x] = Ball.Red; var l = GetMovedXY(o, new Point(x, y)); x = l.X; y = l.Y; goto foos; } // Draw(startx, starty); return false; }