Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 1
Регистрация: 02.03.2015
Сообщений: 37
1

Составить алгоритм игры нахождения одинаковых соседних картинок

02.02.2016, 04:37. Показов 965. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!
Пытаюсь написать игру, в которой надо убрать парные картинки. По горизонтали и вертикали, а также по бокам убрать получается. Никак не могу понять как убирать их буквой Г или Z, например. Код, что-то слишком мудренный получается.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
void __fastcall TGlav_Form::panelimageclick(TObject *Sender)
{
    if (!picturedown) {
        picturedown = true;
        picturecaption = ((TPanel*)Sender)->Caption;
        picturetag = ((TPanel*)Sender)->Tag;
        picturetop_ = ((TPanel*)Sender)->Top;
        pictureleft_ = ((TPanel*)Sender)->Left;
    }
    else {
        picturedown = false;
        String picturecaption_ = ((TPanel*)Sender)->Caption;
        int picturetag_ = ((TPanel*)Sender)->Tag;
        if ((picturecaption_ == picturecaption) && (picturetag_ != picturetag)){
            //-------------Обработка события нажатия-------------------------
            int picturetop_1 = ((TPanel*)Sender)->Top;
            int pictureleft_1 = ((TPanel*)Sender)->Left;
 
            int oldrow = picturetop_ / 60;
            int oldcolumn = (pictureleft_ - 5) / 60 + 1;
 
            int newrow = picturetop_1 / 60;
            int newcolumn = (pictureleft_1 - 5) / 60 + 1;
 
            if (((newrow == 1) && (oldrow == 1)) || ((newcolumn == 1) && (oldcolumn == 1)) ||
                ((newrow == 7) && (oldrow == 7)) || ((newcolumn == 12) && (oldcolumn == 12))) {
 
                if ((newrow == oldrow) || (newcolumn == oldcolumn)){
                    for(int p = 0; p < ControlCount; p++) {
                        Application->ProcessMessages();
                        if (Controls[p]->Tag == picturetag) {
                            delete Controls[p];
                            break;
                        }
                    }
                    for(int q = 0; q < ControlCount; q++) {
                        Application->ProcessMessages();
                        if (Controls[q]->Tag == picturetag_) {
                            delete Controls[q];
                            break;
                        }
                    }
                    matrix_x [newcolumn] [newrow] = 0;
                    matrix_x [oldcolumn] [oldrow] = 0;
                }
            }
            else {
                bool topgo = false;
                bool bottomgo = false;
                bool leftgo = false;
                bool rightgo = false;
                //Фишка вторая ниже первой
                if (newrow > oldrow) {
                    //Ряд фишек совпадает
                    if (newcolumn == oldcolumn) {
                        int raznistrok = newrow - oldrow;
                        if (raznistrok == 1) {
                            for(int p = 0; p < ControlCount; p++) {
                                Application->ProcessMessages();
                                if (Controls[p]->Tag == picturetag) {
                                    delete Controls[p];
                                    break;
                                }
                            }
                            for(int q = 0; q < ControlCount; q++) {
                                Application->ProcessMessages();
                                if (Controls[q]->Tag == picturetag_) {
                                    delete Controls[q];
                                    break;
                                }
                            }
                            matrix_x [newcolumn] [newrow] = 0;
                            matrix_x [oldcolumn] [oldrow] = 0;
                        }
                        else {
                            for (int i = oldrow + 1; i < newrow; i++) {
                                Application->ProcessMessages();
                                if (matrix_x [newcolumn] [i] != 0) {
                                    bottomgo = false;
                                    break;
                                }
                                else bottomgo = true;
                            }
                            if (bottomgo) {
                                for(int p = 0; p < ControlCount; p++) {
                                    Application->ProcessMessages();
                                    if (Controls[p]->Tag == picturetag) {
                                        delete Controls[p];
                                        break;
                                    }
                                }
                                for(int q = 0; q < ControlCount; q++) {
                                    Application->ProcessMessages();
                                    if (Controls[q]->Tag == picturetag_) {
                                        delete Controls[q];
                                        break;
                                    }
                                }
                                matrix_x [newcolumn] [newrow] = 0;
                                matrix_x [oldcolumn] [oldrow] = 0;
                            }
                        }
                    }
                    else
                    //Фишка вторая левее первой
                    if (newcolumn < oldcolumn) {
                        for (int i = newrow; i < oldrow; i++) {
                            Application->ProcessMessages();
 
                        }
                    }
                    else
                    //Фишка вторая правее первой
                    if (newcolumn > oldcolumn) {
 
                    }
                }
                else
                //Фишка вторая выше первой
                if (newrow < oldrow) {
                    int raznistrok;
                    //Ряд фишек совпадает
                    if (newcolumn == oldcolumn) {
                        int raznistrok = oldrow - newrow;
                        if (raznistrok == 1) {
                            for(int p = 0; p < ControlCount; p++) {
                                Application->ProcessMessages();
                                if (Controls[p]->Tag == picturetag) {
                                    delete Controls[p];
                                    break;
                                }
                            }
                            for(int q = 0; q < ControlCount; q++) {
                                Application->ProcessMessages();
                                if (Controls[q]->Tag == picturetag_) {
                                    delete Controls[q];
                                    break;
                                }
                            }
                            matrix_x [newcolumn] [newrow] = 0;
                            matrix_x [oldcolumn] [oldrow] = 0;
                        }
                        else {
                            for (int i = newrow + 1; i < oldrow; i++) {
                                Application->ProcessMessages();
                                if (matrix_x [newcolumn] [i] != 0) {
                                    bottomgo = false;
                                    break;
                                }
                                else bottomgo = true;
                            }
                            if (bottomgo) {
                                for(int p = 0; p < ControlCount; p++) {
                                    Application->ProcessMessages();
                                    if (Controls[p]->Tag == picturetag) {
                                        delete Controls[p];
                                        break;
                                    }
                                }
                                for(int q = 0; q < ControlCount; q++) {
                                    Application->ProcessMessages();
                                    if (Controls[q]->Tag == picturetag_) {
                                        delete Controls[q];
                                        break;
                                    }
                                }
                                matrix_x [newcolumn] [newrow] = 0;
                                matrix_x [oldcolumn] [oldrow] = 0;
                            }
                        }
                    }
                }
                else
                if (newrow == oldrow) {//Фишка на уровне первой
                    //Фишка вторая левее первой
                    if (newcolumn < oldcolumn) {
                        int raznicolumn = oldcolumn - newcolumn;
                        if (raznicolumn == 1) {
                            for(int p = 0; p < ControlCount; p++) {
                                Application->ProcessMessages();
                                if (Controls[p]->Tag == picturetag) {
                                    delete Controls[p];
                                    break;
                                }
                            }
                            for(int q = 0; q < ControlCount; q++) {
                                Application->ProcessMessages();
                                if (Controls[q]->Tag == picturetag_) {
                                    delete Controls[q];
                                    break;
                                }
                            }
                            matrix_x [newcolumn] [newrow] = 0;
                            matrix_x [oldcolumn] [oldrow] = 0;
                        }
                        else {
                            for (int i = newcolumn + 1; i < oldcolumn; i++) {
                                Application->ProcessMessages();
                                if (matrix_x [i] [newrow] != 0) {
                                    rightgo = false;
                                    break;
                                }
                                else rightgo = true;
                            }
                            if (rightgo) {
                                for(int p = 0; p < ControlCount; p++) {
                                    Application->ProcessMessages();
                                    if (Controls[p]->Tag == picturetag) {
                                        delete Controls[p];
                                        break;
                                    }
                                }
                                for(int q = 0; q < ControlCount; q++) {
                                    Application->ProcessMessages();
                                    if (Controls[q]->Tag == picturetag_) {
                                        delete Controls[q];
                                        break;
                                    }
                                }
                                matrix_x [newcolumn] [newrow] = 0;
                                matrix_x [oldcolumn] [oldrow] = 0;
                            }
                        }
                    }
                    else
                    //Фишка вторая правее первой
                    if (newcolumn > oldcolumn) {
                        int raznicolumn = newcolumn - oldcolumn;
                        if (raznicolumn == 1) {
                            for(int p = 0; p < ControlCount; p++) {
                                Application->ProcessMessages();
                                if (Controls[p]->Tag == picturetag) {
                                    delete Controls[p];
                                    break;
                                }
                            }
                            for(int q = 0; q < ControlCount; q++) {
                                Application->ProcessMessages();
                                if (Controls[q]->Tag == picturetag_) {
                                    delete Controls[q];
                                    break;
                                }
                            }
                            matrix_x [newcolumn] [newrow] = 0;
                            matrix_x [oldcolumn] [oldrow] = 0;
                        }
                        else {
                            for (int i = oldcolumn + 1; i < newcolumn; i++) {
                                Application->ProcessMessages();
                                if (matrix_x [i] [newrow] != 0) {
                                    leftgo = false;
                                    break;
                                }
                                else leftgo = true;
                            }
                            if (leftgo) {
                                for(int p = 0; p < ControlCount; p++) {
                                    Application->ProcessMessages();
                                    if (Controls[p]->Tag == picturetag) {
                                        delete Controls[p];
                                        break;
                                    }
                                }
                                for(int q = 0; q < ControlCount; q++) {
                                    Application->ProcessMessages();
                                    if (Controls[q]->Tag == picturetag_) {
                                        delete Controls[q];
                                        break;
                                    }
                                }
                                matrix_x [newcolumn] [newrow] = 0;
                                matrix_x [oldcolumn] [oldrow] = 0;
                            }
                        }
                    }
                }
            }
            //---------------------------------------------------------------
        }
    }
}
Миниатюры
Составить алгоритм игры нахождения одинаковых соседних картинок  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.02.2016, 04:37
Ответы с готовыми решениями:

Составьте алгоритм и программу нахождения двузначных чисел, в записи которых нет одинаковых цифр
Помогите пожалуйста:: Составьте алгоритм и программу нахождения двузначных чисел, в записи которых...

Найти число пар одинаковых соседних (соседних только в одной строке) элементов в двумерном массиве
Дан двумерный массив в файле ‘array.txt’. Найти число пар одинаковых соседних (соседних только в...

Игра "Нахождение одинаковых картинок". Зависает при старте новой игры
запускаю нажимаю на новая игра не работает (зависает) игра должна находить одинаковые картинки...

Составить алгоритм нахождения суммы
Составить алгоритм нахождения суммы. S=1/3*3+1/5*5+1/7*7+1/(2n+1)*(2n+1); Добавлено через 31...

14
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
02.02.2016, 08:38 2
ДмитрийЛАСТ, гораздо легче поменять концепцию открытия поля вообще. переписать ее с точки зрения ооп.
Создать класс "картинка", содержащий битмап для загрузки картинки и координаты угла. Создать массив таких классов. А потом просто запоминать в какие элементы вы ткнули и сравнивать их.
0
32 / 32 / 21
Регистрация: 22.09.2013
Сообщений: 378
02.02.2016, 18:25 3
Правильнее наверное было бы сделать все через классы, но я накидал тебе не большой пример без них.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
// создаем массив указателей
TImage **img = new TImage*[5];
short int test=0;
const int size = 64;
int tagn, tago;
 
//---------------------------------------------------------------------------
void __fastcall TForm2::ImgClick(TObject *Sender)
{
 test++;
 //Получаме тег выбранного изображения для индетификации
 tago = ((TImage*)Sender)->Tag;
 if (test == 2) {
   tago = 0;
   tagn = 0;
   test = 0;
 if (tago == tagn) {
   ShowMessage("Выбрано два одинаковых изображения!");
 }
 else
 {
  ShowMessage("Выбранные изображения не совпадают!");
 }
 }
else
 {
  tagn = ((TImage*)Sender)->Tag;
 }
}
 
void __fastcall TForm2::FormShow(TObject *Sender)
{
randomize();
// создаем объект присваеваем каждой ячейки массива адресс созданного изображения
for (int i=0; i<5; i++)
{
 img[i] = new TImage(Form2);
 img[i]->Parent = Form2;
 int name = rand() % 9 + 1;
 //Задаем тег изображения
 img[i]->Tag=name;
 img[i]->Left = i*size;
 img[i]->Top = 0;
 img[i]->AutoSize = true;
 //Тут я рандомно загружаю изображения(цифры от 1 до 9)
 img[i]->Picture->LoadFromFile( ExtractFilePath( Application->ExeName ) + "img\\"+IntToStr(name)+".bmp");
 img[i]->OnClick = ImgClick;
}
}
//---------------------------------------------------------------------------
 
 
void __fastcall TForm2::FormDestroy(TObject *Sender)
{
delete[] img;
}
//---------------------------------------------------------------------------
Миниатюры
Составить алгоритм игры нахождения одинаковых соседних картинок  
Вложения
Тип файла: rar game.rar (77.0 Кб, 6 просмотров)
0
0 / 0 / 1
Регистрация: 02.03.2015
Сообщений: 37
04.02.2016, 11:22  [ТС] 4
С классами я раньше не работал. Попробовал:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class gPicture
{
    private:
        String Name;
        String m;
    public:
        void Show();
        void Hide();
        void Move();
        void PicturePatch(String Patch);
        int xb;
        int yb;
        int tag;
    public:
        gPicture(int x0, int y0, String Name_T);
        ~gPicture();
};
//---------------------------------------------------------------------------
Вот здесь все равно приходится создавать panel
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
gPicture::gPicture(int x0, int y0, String Name_T)
{
    try {
        Name = Name_T;
        panelimage = new TPanel(Glav_Form);
        panelimage->Parent = Glav_Form;
        panelimage->Top = x0 * 60 + 60;
        panelimage->Left = y0 * 60 + 5;
        panelimage->Height = 60;
        panelimage->Width = 60;
        panelimage->Caption = Name;
        panelimage->Visible = true;
    } catch (...) {
    }
}
//---------------------------------------------------------------------------
Вопрос теперь в том, как привязать картинку? И правильно ли я начал?
Если вот так я создал двумерный массив
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    try {
        //Создание матрицы картинок
        int ob = 1;
        for (int col = 0; col < colim; col++) {
            Application->ProcessMessages();
            for (int row = 0; row < rowim; row++) {
                Application->ProcessMessages();
                matrix_x [col] [row] = (String)ob;
                ob++;
            }
        }
        //Микширование матрицы картинок
        MixerPicture(4);
        //Создание класса картинок
        for (int col = 0; col < colim; col++) {
            Application->ProcessMessages();
            for (int row = 0; row < rowim; row++) {
                Application->ProcessMessages();
                gPicture_R = new gPicture(col, row, matrix_x [col] [row]);
            }
        }
    } catch (...) {
    }
И, собственно микширование:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
    try {
        TTime tekvrem = Now();
        Word h, m, sec, msec;
        DecodeTime(tekvrem, h, m, sec, msec);
        int indexpanelall, res_p;
        for (int kolpest = 0; kolpest < sec; kolpest++) {
            Application->ProcessMessages();
            Randomize();
            for (int col = 0; col < colim; col++) {
                Application->ProcessMessages();
                for (int row = 0; row < rowim; row++) {
                    Application->ProcessMessages();
                    res_p = StrToInt(matrix_x [col] [row]);
                    indexpanelall = random(84) + 1;
                    for (int col_ = 0; col_ < colim; col_++) {
                        Application->ProcessMessages();
                        for (int row_ = 0; row_ < rowim; row_++) {
                            Application->ProcessMessages();
                            if (matrix_x [col_] [row_] == IntToStr(indexpanelall)) {
                                matrix_x [col_] [row_] = IntToStr(res_p);
                                break;
                            }
                        }
                        matrix_x [col] [row] = IntToStr(indexpanelall);
                    }
                }
            }
        }
    } catch (...) {
    }
0
32 / 32 / 21
Регистрация: 22.09.2013
Сообщений: 378
04.02.2016, 16:28 5
Цитата Сообщение от ДмитрийЛАСТ Посмотреть сообщение
С классами я раньше не работал
А чем же вам тогда не угодил мой пример без классов? Вроде бы картинку выводит, определяет какую выбрали, сравнивает и выдает сообщение схожи картинки или нет.
1
0 / 0 / 1
Регистрация: 02.03.2015
Сообщений: 37
06.02.2016, 03:30  [ТС] 6
За пример большое спасибо.
Тема классов для меня новая, но попробую изучить.
0
0 / 0 / 1
Регистрация: 02.03.2015
Сообщений: 37
07.02.2016, 05:43  [ТС] 7
Создал я класс
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class TgPictureCard
{
    private:
        String name;
        int x0;
        int y0;
        int tag;
        String picturename;
        //TgPictureCard *gPictureCard[total];
    public:
        void Show();
        void Hide();
        void Move();
    public:
        TgPictureCard(int x0_T, int y0_T, String name_T, int tag_T, String picturename_T);
        ~TgPictureCard();
};
Реализация
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        int ob = 1;
        int col_m = 1;
        for (int col = 0; col < colim; col++) {
            Application->ProcessMessages();
            for (int row = 0; row < rowim; row++) {
                Application->ProcessMessages();
                if (col_m > 22) col_m = 1;
                gPictureCard[ob] = new TgPictureCard(col,
                                                     row,
                                                     IntToStr(ob),
                                                     col_m,
                                                     ExtractFilePath(Application->ExeName) + "Picture\\i" + col_m + ".bmp");
                //gPictureCard[ob]->Show(); [COLOR="Red"]Почему, если здесь снять комментарий показываются все карты[/COLOR]
                ob++;
                col_m++;
            }
        }
Если же так:
C++
1
2
3
4
        for (int i = 1; i <= kol_card; i++) {
            Application->ProcessMessages();
            gPictureCard[i]->Show();
        }
То одна карта не показывается.
Ну и почему-то не срабатывает функция:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void __fastcall TGlav_Form::MixerPicture(int kolpara)
{
    try {
        TTime tekvrem = Now();
        Word h, m, sec, msec;
        DecodeTime(tekvrem, h, m, sec, msec);
        int indexpanelall, res_p;
        TgPictureCard *gPictureCard_;
        for (int kolpest = 0; kolpest < sec; kolpest++) {
            Application->ProcessMessages();
            Randomize();
            for (int i = 1; i <= kol_card; i++) {
                gPictureCard_ = gPictureCard[i];
                indexpanelall = random(84) + 1;
                gPictureCard[i] = gPictureCard[indexpanelall];
                gPictureCard[indexpanelall] = gPictureCard_;
            }
        }
    } catch (...) {
    }
}
//---------------------------------------------------------------------------
0
32 / 32 / 21
Регистрация: 22.09.2013
Сообщений: 378
07.02.2016, 21:00 8
Перебор массива надаиначинать с 0 а не с 1.
0
0 / 0 / 1
Регистрация: 02.03.2015
Сообщений: 37
08.02.2016, 05:01  [ТС] 9
Если начинаю с нуля - виснет программа.
0
32 / 32 / 21
Регистрация: 22.09.2013
Сообщений: 378
08.02.2016, 06:31 10
Цитата Сообщение от ДмитрийЛАСТ Посмотреть сообщение
Если начинаю с нуля - виснет программа.
Тогда вам нужно показать весь ваш код. Потому что где определяется значение переменной kol_card не известно, что вы написали в функциях Show, Hide, Move тоже не известно.
0
0 / 0 / 1
Регистрация: 02.03.2015
Сообщений: 37
08.02.2016, 09:53  [ТС] 11
Выкладываю код.
Вложения
Тип файла: 7z Новый архив.7z (1.5 Кб, 6 просмотров)
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
08.02.2016, 11:07 12
То есть, форму мы должны сами изобрести заново? Может, проще было бы заархивировать весь проект (без мусора в виде obj и exe-файлов), и прикрепить его?
0
737 / 527 / 130
Регистрация: 31.05.2013
Сообщений: 2,975
Записей в блоге: 3
08.02.2016, 11:46 13
На всяк
0
Практикантроп
4826 / 2718 / 526
Регистрация: 23.09.2011
Сообщений: 5,777
08.02.2016, 11:47 14
volvo, а там все равно альфа-скины подключены. Переносимость "1 к 1" под вопросом.
0
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
13.02.2016, 23:01 15
Сделал базовую логику аркадки, вроде работает ))

Проект и проч


Код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
typedef void __fastcall( __closure * t_cell_action )( int c, int r, TStringGrid * sg ); // сигнатура метода класса, предназначенного для действия над одной ячейкой
 
void do_for_each_cell( TStringGrid * sg, t_cell_action act ) // идем по всем ячейкам грида, для каждой выполняем переданный метод
{
    for ( int c( 0 ), c_limit( sg->ColCount ); c < c_limit; ++c )
    {
        for ( int r( 0 ), r_limit( sg->RowCount ); r < r_limit; ++r )
        {
            act( c, r, sg );
        }
    }
}
 
// ---------------------------------------------------------------------------
class Tform_game_field : public TForm
{
__published: // IDE-managed Components
 
    TStringGrid * sgrid_game_field;
    TTimer * tmr_animate;
 
    void __fastcall FormResize( TObject * Sender );
    void __fastcall sgrid_game_fieldClick( TObject * Sender );
    void __fastcall tmr_animateTimer( TObject * Sender );
 
public: // User declarations
 
    void __fastcall fill_empty_cells( TStringGrid * sg ) // смотрим все ячейки, пустые заполняем рандомно
    {
        do_for_each_cell( sg, & do_fill_empty_cells );
    }
 
    void __fastcall do_fill_empty_cells( int c, int r, TStringGrid * sg )
    {
        if ( sg->Cells[ c ][ r ].IsEmpty( ) )
        {
            sg->Cells[ c ][ r ] = IntToStr( Random( 6 ) );
            sg->Objects[ c ][ r ] = NULL;
        }
    }
 
    bool __fastcall mark_cells_chain( int c, int r, TStringGrid * sg ) // cмотрим всех соседей начальной ячейки, одинаковых помечаем визуально и через Objects; если одинаковых соседей нет, возвращаем false
    {
        return do_mark_cells_chain( c, r, sg->Cells[ c ][ r ], sg, true );
    }
 
    bool __fastcall do_mark_cells_chain( int c, int r, String val, TStringGrid * sg, bool is_first_cell = false ) // рекурсивно смотрим всех соседей начальной ячейки, одинаковых помечаем визуально и через Objects
    {
        if ( sg->Cells[ c ][ r ] == val && !sg->Objects[ c ][ r ] )
        {
            if ( !is_first_cell )
            {
                sg->Objects[ c ][ r ] = reinterpret_cast < TObject * > ( 1 );
                sg->Cells[ c ][ r ] = "-" + sg->Cells[ c ][ r ];
            }
 
            if ( c + 1 < sg->ColCount )
            {
                do_mark_cells_chain( c + 1, r, val, sg );
            }
            if ( c - 1 >= 0 )
            {
                do_mark_cells_chain( c - 1, r, val, sg );
            }
            if ( r + 1 < sg->RowCount )
            {
                do_mark_cells_chain( c, r + 1, val, sg );
            }
            if ( r - 1 >= 0 )
            {
                do_mark_cells_chain( c, r - 1, val, sg );
            }
            return true;
        }
        return false;
    }
 
    void __fastcall clear_marked_chains( TStringGrid * sg ) // чистим помеченные цепочки, вставляя пустые строки в ячейки
    {
        do_for_each_cell( sg, & do_clear_marked_chains );
    }
 
    void __fastcall do_clear_marked_chains( int c, int r, TStringGrid * sg )
    {
        if ( sg->Objects[ c ][ r ] )
        {
            sg->Cells[ c ][ r ] = "";
        }
    }
 
    void __fastcall shift_cells_down( TStringGrid * sg ) // двигаем верхние непустые(непомеченные) ячейки вниз, а все пустые(помеченные) перемещаем вверх колонки; объекты Objects, ассоциированные с перемещаемыми ячейками остаются связаны с ними же но на новом месте
    {
        std::auto_ptr < TStringList > sl( new TStringList( ) );
 
        for ( int c( 0 ), c_limit( sg->ColCount ); c < c_limit; ++c )
        {
            sl->Assign( sg->Cols[ c ] );
 
            for ( int i( 0 ), i_limit( sl->Count ); i < i_limit; ++i )
            {
                if ( sl->Objects[ i ] )
                {
                    sl->Move( i, 0 );
                }
            }
            sg->Cols[ c ]->Assign( sl.get( ) );
        }
    }
 
    __fastcall Tform_game_field( TComponent * Owner );
} ;
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
__fastcall Tform_game_field::Tform_game_field( TComponent * Owner )
    :
    TForm( Owner )
{
    Randomize( );
    fill_empty_cells( sgrid_game_field );
}
 
void __fastcall Tform_game_field::FormResize( TObject * Sender )
{
    TStringGrid * sg( sgrid_game_field );
 
    sg->DefaultColWidth = ( ClientWidth - sg->GridLineWidth * sg->ColCount ) / sg->ColCount;
    sg->DefaultRowHeight = ( ClientHeight - sg->GridLineWidth * sg->RowCount ) / sg->RowCount;
}
 
// ---------------------------------------------------------------------------
void __fastcall Tform_game_field::sgrid_game_fieldClick( TObject * Sender )
{
    if ( !tmr_animate->Enabled )
    {
        tmr_animate->Enabled = true;
    }
}
 
// ---------------------------------------------------------------------------
void __fastcall Tform_game_field::tmr_animateTimer( TObject * Sender )
{
    TStringGrid * sg( sgrid_game_field );
    enum
    {
        mark, clear, shift, refill
    } ;
    static int stage( mark );
 
    switch ( stage )
    {
    case mark:
        if ( !mark_cells_chain( sg->Col, sg->Row, sg ) )
        {
            tmr_animate->Enabled = false;
            return;
        }
        tmr_animate->Interval = 500;
        break;
    case clear:
        clear_marked_chains( sg );
        break;
    case shift:
        shift_cells_down( sg );
        break;
    case refill:
        fill_empty_cells( sg );
        break;
    }
    if ( ++stage > refill )
    {
        stage = mark;
        tmr_animate->Enabled = false;
        tmr_animate->Interval = 50;
    }
}
2
13.02.2016, 23:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.02.2016, 23:01
Помогаю со студенческими работами здесь

Составить алгоритм нахождения суммы
3) и с циклом do/while; Дано целое число N (&gt; 0). Найти сумму N2 + (N + 1)2 + (N + 2)2 + … +...

Составить алгоритм нахождения суммы бесконечного ряда
помогите,пожалуйста) срочно нуждаюсь в вашей помощи) задано натуральное н. необходимо составить...

Составить алгоритм нахождения суммы цифр числа
Используя циклические конструкции

Составить рекурсивный алгоритм нахождения N-го числа Фибоначчи
Составить рекурсивный алгоритм нахождения N-го числа Фибоначчи: 0,1, 1,2,3,5,8.. то есть каждое...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru