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;
        }