Что-то не работает алгоритм на складывание картинки

238
02 мая 2017, 03:54

У меня получается приложение мозайка, но вот что-то алгоритм плохо работает. Выдаёт сообщение о складывании картинки даже тогда, когда картинка не сложена

Вот код складывания и проверку на полное совпадение:

void PB_Click(object sender, EventArgs e)
    {
        PictureBox pb = (PictureBox)sender;
        for (int i = 0; i < PB.Length; i++)
        {
            // Сначала определим пустое место на области рисования картинки.
            if (PB[i].Visible == false)
            {
                // Затем проверим кликнутый прямоугольник и
                // если у него совпадают координаты по X или Y,
                // (откидываем из вычисления прямоугольники расположеннные по диагонали)
                // но при этом он на ближайшем расстоянии от пустого
                // прямоугольника
                // (откидываем прямоугольники расположенные через прямоугольник от пустого)
                if ((pb.Location.X == PB[i].Location.X && Math.Abs(pb.Location.Y - PB[i].Location.Y) == PB[i].Height) || (pb.Location.Y == PB[i].Location.Y &&  
                    Math.Abs(pb.Location.X - PB[i].Location.X) == PB[i].Width))
                {
                    // После успешной проверки
                    // меняем местами пустой и кликнутый прямоугольники.
                    Point pt = PB[i].Location;
                    PB[i].Location = pb.Location;
                    pb.Location = pt;
                    // После каждого хода проверка на полную сборку картинки.
                    //*************** блок проверки ***********************
                    // Если хоть у одного прямоугольника не совпадают
                    // реальные координаты и первичные выходим из функции.
                    for (int j = 0; j < PB.Length; j++)
                    {
                        Point point = (Point)PB[i].Tag;
                        if (PB[j].Location != point)
                        {
                            //MessageBox.Show(this, point + "x" + PB[j].Location.ToString(), "Data");
                            Debug.WriteLine(point + "x" + PB[j].Location.ToString());
                            return;
                        }
                    }
                    // Если у всех прямоугольников совпали реальные и первичные 
                    // координаты - картинка собрана!
                    for (int m = 0; m < PB.Length; m++)
                    {
                        PB[m].Visible = true;
                        PB[m].BorderStyle = BorderStyle.None; // убираем обрамление прямоугольников
                        Properties.Settings.Default.LevelCompleted = true;
                        MessageBox.Show(this, "Картинка собрана!", "Победа", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    //************** окончание блока проверки *************
                }
                break;
            }
        }
    }
READ ALSO
Звук при нажатии горячих клавиш

Звук при нажатии горячих клавиш

Создал сочетание клавиш Ctrl+O и Ctrl+АПри нажатии все работает, как я хотел, но проигрывается стандартный звук «Восклицание»

264
Делать ссылки кликабельными в тексте

Делать ссылки кликабельными в тексте

Использую ListView для отображения логовИногда в логе бывают ссылки (напимер, "Некорректная ссылка: http://example

320
Рекурсия. Как происходит вход в условие

Рекурсия. Как происходит вход в условие

Имеется такая функция, которая вызывает сама себя, то есть рекурсивнаяДопустим n = 5

248