С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.71/190: Рейтинг темы: голосов - 190, средняя оценка - 4.71
4 / 4 / 0
Регистрация: 09.05.2019
Сообщений: 72

Консольный сапер

29.09.2019, 18:43. Показов 41136. Ответов 34
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вожусь уже долго, разобраться с этой консольной игрой, выход за пределы массива,вот мой код:
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
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
#include <iostream>
#include <time.h>
//#include <windows.h>
#include <iomanip>
#include <time.h>
#include <stdio.h>
#include <conio.h>
using namespace std;
#define BOOM 10 //количество бомб на поле
 
//  1
void show_of_mines()
{
    cout << "* ";
}
void print_array_2D(int **Playing_field, bool ** open, const int SIZE)
{
    char strLetters[30] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '\0' };
    cout << "  ";
    for (int i = 0; i < SIZE; i++)
    {
        
        cout << " " << strLetters[i];
    }   
    cout << endl;
 
 
    for (int x = 0; x <= SIZE; x++)
    {
        if (x < 10)
        {
            cout << x << " |";
        }
        else
        {
            cout << x << "|";
        }
    /////////////////////////////////////   
 
        for (int y = 0; y < SIZE; y++)
        {
            if (open[x][y])
            {
 
                if (Playing_field[x][y] == -1)      
                {
                    show_of_mines();
                }
                else if (Playing_field[x][y] == 0)
                {
                    cout << "* ";
                }
                else
                {
                    cout << Playing_field[x][y] << " ";
                }
            }
            else
            {
                cout << "& ";
            }
        }
        cout << endl;
    }
}
// проверяет ячейку на пустоту (true), выход за пределы массива возвращает false
bool empty(int **Playing_field, int i, int j, const int SIZE)
{
    if ((i >= 0) && (i < SIZE))
    {
        if ((j >= 0) && (j < SIZE))
        {
            if (Playing_field[i][j] == 0) return true;
        }
    }
    return false;
}
// рекурсивная функция, которая открывает поля в точке попадания
void clean(int **Playing_field, bool **open, int i, int j, const int SIZE)
{
    // проверим на выход за пределы массива
    if ((i >= 0) && (i < SIZE))
    {
        if ((j >= 0) && (j < SIZE))
        {
            // проверим, не было ли открыто поле раньше
            if (!open[i][j])
            {
                open[i][j] = true;  //откроем
                                    // если поле пустое (=0), просто пооткрываем всех его соседей
                if (Playing_field[i][j] == 0)
                {
                    clean(Playing_field, open, i - 1, j - 1, SIZE);
                    clean(Playing_field, open, i - 1, j, SIZE);
                    clean(Playing_field, open, i - 1, j + 1, SIZE);
                    clean(Playing_field, open, i, j - 1, SIZE);
                    clean(Playing_field, open, i, j + 1, SIZE);
                    clean(Playing_field, open, i + 1, j - 1, SIZE);
                    clean(Playing_field, open, i + 1, j, SIZE);
                    clean(Playing_field, open, i + 1, j + 1, SIZE);
                }
                // если не пустое (!=0) открываем только пустых (=0) соседей
                else
                {
                    if (empty(Playing_field, i - 1, j - 1, SIZE)) clean(Playing_field, open, i - 1, j - 1, SIZE);
                    if (empty(Playing_field, i - 1, j, SIZE)) clean(Playing_field, open, i - 1, j, SIZE);
                    if (empty(Playing_field, i - 1, j + 1, SIZE)) clean(Playing_field, open, i - 1, j + 1, SIZE);
                    if (empty(Playing_field, i, j - 1, SIZE)) clean(Playing_field, open, i, j - 1, SIZE);
                    if (empty(Playing_field, i, j + 1, SIZE)) clean(Playing_field, open, i, j + 1, SIZE);
                    if (empty(Playing_field, i + 1, j - 1, SIZE)) clean(Playing_field, open, i + 1, j - 1, SIZE);
                    if (empty(Playing_field, i + 1, j, SIZE)) clean(Playing_field, open, i + 1, j, SIZE);
                    if (empty(Playing_field, i + 1, j + 1, SIZE)) clean(Playing_field, open, i + 1, j + 1, SIZE);
                }
            }
        }
    }
}
 
// проверяет ячейку на мину ; выход за пределы возвращает false
bool mine(int **Playing_field, int i, int j, const int SIZE)
{
    if ((i >= 0) && (i < SIZE))
    {
        if ((j >= 0) && (j < SIZE))
        {
            if (Playing_field[i][j] == -1) return true;
        }
    }
    return false;
}
 
void empty_play_space(int **Playing_field, bool ** open, const int SIZE)
{
    for (int i = 0; i < SIZE; i++)
    {
        for (int j = 0; j < SIZE; j++)
        {
            if (Playing_field[i][j] == -1)
            {
                open[i][j] = true;
            }
        }
    }
}
 
bool win_or_lose(int **Playing_field, bool ** open, const int SIZE)
{
    for (int x = 0; x < SIZE; x++)
    {
        for (int y = 0; y < SIZE; y++)
        {
            if ((Playing_field[x][y] != -1) && (!open[x][y])) return false;
        }
    }
    return true;
}
 
// в случае проигрыша эта функция откроет все мины
void openmines(int **Playing_field, bool ** open, const int SIZE)
{
    for (int i = 0; i < SIZE; i++)
    {
        for (int j = 0; j < SIZE; j++)
        {
            if (Playing_field[i][j] == -1) open[i][j] = true;
        }
    }
}
 
void final(bool loser, int **Playing_field, bool ** open, const int SIZE)
{
    system("cls");
    print_array_2D(Playing_field, open, SIZE);
    if (loser)
    {
        cout << "ВЫ ПРОИРАЛИ!(";
    }
    else
    {
        cout << "ВЫ ВЫИГРАЛИ!)";
    }
    cout << endl;
}
void inputSize(int &size)   //запрос на ввод колиство элементов массива
{
    while (true)
    {
        cout << "ВВЕДИТЕ РАЗМЕР ПОЛЯ (10):" << endl << endl;
        cin >> size;
        if (cin.fail())
        {
            cout << "ОШИБКА, ВВЕДИТЕ МЕНЬШЕЕ ЗНАЧЕНИЕ" << endl;
            cin.clear();
            while (cin.get() != '\n');
        }
        else if (size > 0) break;
    }
}
 
//  2
void rules()
{
    cout << "\t\t\t\t\t\t\t\tСАПЕР: ПРАВИЛА И ОБЩИЕ СВЕДЕНИЯ" << endl << endl << endl << endl;
    cout << "\tНачните с открытия одной ячейки." << endl;
    cout << "\tЧисло в ячейке показывает, сколько мин скрыто вокруг данной ячейки. Это число поможет понять вам, где находятся безопасные ячейки, а где находятся бомбы." << endl;
    cout << "\tЕсли рядом с открытой ячейкой есть пустая ячейка, то она откроется автоматически." << endl;
    cout << "\tЕсли вы открыли ячейку с миной, то игра проиграна." << endl;
    cout << "\tЕсли в ячейке указано число, оно показывает, сколько мин скрыто в восьми ячейках вокруг данной. Это число помогает понять, где находятся безопасные ячейки." << endl;
    cout << "\tИгра продолжается до тех пор, пока вы не откроете все не заминированные ячейки." << endl << endl << endl;
    cout << "\tУдачной игры!)" << endl << endl << endl << endl << endl << endl;
}
 
 
 
 
 
 
 
int main()
{
    srand((unsigned int)time(NULL));
    setlocale(LC_ALL, "Russian");
 
    char choice{};
    while (true)
    {
        system("cls");
        cout << "1 - ИГРАТЬ " << endl;
        cout << "2 - ПРАВИЛА ИГРЫ << САПЕР >> " << endl;
        cout << "0 - ВЫХОД" << endl << endl << endl;
        cout << "СДЕЛАЙТЕ ВАШ ВЫБОР:" << endl << endl;
        cin >> choice;
        cout << endl;
        cin.ignore(100, '\n');
        if (choice == '0') break;
        switch (choice)
        {
        case '1':
        {
 
            int SIZE = 0;
            inputSize(SIZE);
            int **Playing_field = new int *[SIZE];
            bool **open = new bool *[SIZE];
 
            for (int i = 0; i < SIZE; i++)
            {
                *(Playing_field + i) = new int[SIZE];
            }
            for (int i = 0; i < SIZE; i++)
            {
                *(open + i) = new bool[SIZE];
            }
            int i{};
            int j{};
            for (int c = 0; c < 100; c++)
            {
                Playing_field[c / 10][c % 10] = 0;
                open[c / 10][c % 10] = false;
            }
            // заполняем массив поля минами
            for (int c = 0; c < BOOM; c++)
            {
                do
                {
                    i = rand() % SIZE;
                    j = rand() % SIZE;
                } 
                while (Playing_field[i][j] != 0);
                Playing_field[i][j] = -1;
            }
            // заполняем массив поля цифрами
            for (i = 0; i < SIZE; i++)
            {
                for (j = 0; j < SIZE; j++)
                {
                    if (Playing_field[i][j] != -1)
                    {
                        int quantity{};
                        if (mine(Playing_field, i - 1, j - 1, SIZE)) quantity++;
                        if (mine(Playing_field, i - 1, j, SIZE)) quantity++;
                        if (mine(Playing_field, i - 1, j + 1, SIZE)) quantity++;
                        if (mine(Playing_field, i, j - 1, SIZE)) quantity++;
                        if (mine(Playing_field, i, j + 1, SIZE)) quantity++;
                        if (mine(Playing_field, i + 1, j - 1, SIZE)) quantity++;
                        if (mine(Playing_field, i + 1, j, SIZE)) quantity++;
                        if (mine(Playing_field, i + 1, j + 1, SIZE)) quantity++;
                        Playing_field[i][j] = quantity;
                    }
                }
            }
            while (true)
            {
                system("cls");
                cout << "*****************************" << endl << endl;
                cout << "* САПЕР ОШИБАЕТЬСЯ ОДИН РАЗ *" << endl << endl;
                cout << "*****************************" << endl;
                cout << endl << endl;
                print_array_2D(Playing_field, open, SIZE);
                cout << endl;
                // запрашиваем координаты удара
                char input_coordinate[4]{ '\0' };
                cout << "Введите координаты удара (E7): ";
                cin >> input_coordinate;
                
                if ((input_coordinate[0] >= 65) && (input_coordinate[0] <= 90))
                {
                    j = input_coordinate[0] - 65;        // буква в промежутке от A до Z
                }
                else if ((input_coordinate[0] >= 97) && (input_coordinate[0] <= 122))
                {
                    j = input_coordinate[0] - 97;  // буква в промежутке от a до z
                }
                else continue;                              // если введены неверные значения, возврат в начало цикла
                if ((input_coordinate[1] >= 48) && (input_coordinate[0] <= 57))     //переводим координаты в цифровой вид от 0 до 9
                {
                    i = input_coordinate[1] - 48;
                }
                else continue;
                // далее проверяем все восемь окрестных полей на пустые клетки показываем некий кусок поля               
                clean(Playing_field, open, i, j, SIZE);
                if (mine(Playing_field, i, j, SIZE))
                {
                    openmines(Playing_field, open, SIZE); 
                    final(true, Playing_field, open, SIZE); break;
                }
                if (win_or_lose(Playing_field, open, SIZE))
                {
                    final(false, Playing_field, open, SIZE); break;
                }
            }
            for (int i = 0; i < SIZE; i++)
            {
                delete[] * (Playing_field + i);
            }
            for (int i = 0; i < SIZE; i++)
            {
                delete[] * (open + i);
            }
            //delete[] Playing_field;
        }
        break;
 
        case '2':
        {
            rules();
        }
        break;
 
        default: cout << "Ошибка, попробуйте еще раз, нажмите кнопку <Enter>, чтобы повторить попытку" << endl; break;
        }
        system("pause");
    }
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.09.2019, 18:43
Ответы с готовыми решениями:

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

Простой консольный "сапер"
Здравстсвуйте все мне нужно написать игру сапер консольную очень простым и понятным языком На языке c++.Консольное приложение.

Сапер
Сделать игру сапера: 1) нарисовать доску функция с 2 параметрами(доска и количество мин) 2) ввод в поле количества...

34
Just Do It!
 Аватар для XLAT
4201 / 2657 / 654
Регистрация: 23.09.2014
Сообщений: 8,955
Записей в блоге: 3
02.10.2019, 16:37
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Vladymyr_2020 Посмотреть сообщение
Дело в том, что я работаю не дома, а в компьютерном классе, и меня нет прав администратора на запуск сторонних приложений(антивирус) ((
ладно, тогда это чуть позже.
а в срок какой(...), а то у мя тут и другие развлечения есть


Добавлено через 16 минут
ок,
вот пока
github.com/BDOTimer/Saper
Цитата Сообщение от XLAT Посмотреть сообщение
типо если задал 14, то будет квадратное поле 14*14?)
это минута делов на закомментить пару строк.

дальше надо в игру уже вникать
1
4 / 4 / 0
Регистрация: 09.05.2019
Сообщений: 72
02.10.2019, 17:00  [ТС]
Срок сегодня, завтра

Добавлено через 16 минут
Увидел сорс файл, но дело в том что я забыл сказать...
Мне нужно без структур и без классов, чисто по последним кодам, не более
0
Just Do It!
 Аватар для XLAT
4201 / 2657 / 654
Регистрация: 23.09.2014
Сообщений: 8,955
Записей в блоге: 3
02.10.2019, 17:15
Цитата Сообщение от Vladymyr_2020 Посмотреть сообщение
Мне нужно без структур и без классов, чисто по последним кодам, не более
к сожалению так я не умею.
это программирование на другом языке из прошлого века.
я пробовал когда то кодить так, и это всё скатывалось в полный УГ.

если хотите, это же самое, как заниматься садомазо.

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

я имею ввиду результат за приемлемое время.
0
4 / 4 / 0
Регистрация: 09.05.2019
Сообщений: 72
02.10.2019, 17:21  [ТС]
Ну есть же еще время, ну можете просто взять прошлый код, сделать в нем подсчет жизней, очки и координаты чтобы были рабочие по всей площади игрового поля, пожалуйста
0
Just Do It!
 Аватар для XLAT
4201 / 2657 / 654
Регистрация: 23.09.2014
Сообщений: 8,955
Записей в блоге: 3
02.10.2019, 17:29
почему структуры данных?
я хочу прогать в терминах задачи, а не рыться в хаосе чисел по всему прожекту.


Добавлено через 5 минут
Цитата Сообщение от Vladymyr_2020 Посмотреть сообщение
сделать в нем подсчет жизней, очки и координаты чтобы были рабочие по всей площади игрового поля
сишники со своим сишным ооп сделают это за пару сек.

но, а я крестовик

я пишу на крестах, ну, пытаюсь по крайней мере.

Добавлено через 1 минуту
в ветке форума про СИ у меня почти(не помню что там я писал когда-либо) нет ни одного поста!

C++
1
Тут ветка форума про С++!
0
4 / 4 / 0
Регистрация: 09.05.2019
Сообщений: 72
02.10.2019, 18:12  [ТС]
Есть еще послезавтра
0
Just Do It!
 Аватар для XLAT
4201 / 2657 / 654
Регистрация: 23.09.2014
Сообщений: 8,955
Записей в блоге: 3
02.10.2019, 22:43
Vladymyr_2020,
посмотрите на гите, добавил счетчик жизней.
протестите как оно.

там щас только одна бомба по A0

чуть попозже гляну очки.

история изменений в сырце:
тут

Добавлено через 59 минут
+очки
0
4 / 4 / 0
Регистрация: 09.05.2019
Сообщений: 72
03.10.2019, 09:04  [ТС]
Почему там где я заполняю от 0 до N не могу фигачить по координатом, а могу только до 10?, как это можно исправить?
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
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
#include <iostream>
#include <time.h>
#include <stdio.h>
using namespace std;
 
#define N 26    //рамер поля
#define BOOM 10 //количество бомб на поле
 
int** Playing_field = nullptr;
bool** open = nullptr;
 
void createIntArr(int**& Playing_field)
{
    Playing_field = new int*[N];
    for (int i = 0; i < N; i++)
    {
        *(Playing_field + i) = new int[N] {};
    }
}
void createBoolArr(bool**& open)
{
    open = new bool*[N] {};
    for (int i = 0; i < N; i++)
    {
        *(open + i) = new bool[N] {};
    }
}
void deleteIntArr(int** Playing_field)
{
    for (int i = 0; i < N; i++)
    {
        delete[] * (Playing_field + i);
    }
    delete[] Playing_field;
    Playing_field = nullptr;
}
void deleteBoolArr(bool** open)
{
    for (int i = 0; i < N; i++)
    {
        delete[] * (open + i);
    }
    delete[] open;
    open = nullptr;
}
 
void rules();
void show_of_mines();
void openmines();
bool empty(int, int);
bool mine(int, int);
void print_array_2D();
void clean(int, int);
bool win_or_lose();
void final(bool);
 
int main()
{
    srand((unsigned int)time(NULL));
    setlocale(LC_ALL, "Russian");
 
    char choice{};
    while (true)
    {
        system("cls");
        cout << "САПЕР " << endl << endl << endl;
 
        cout << "1 - ИГРАТЬ " << endl;
        cout << "2 - ПРАВИЛА ИГРЫ << САПЕР >> " << endl;
        cout << "0 - ВЫХОД" << endl << endl << endl;
        cout << "СДЕЛАЙТЕ ВАШ ВЫБОР:" << endl << endl;
        cin >> choice;
        cout << endl;
        cin.ignore(100, '\n');
        if (choice == '0') break;
        switch (choice)
        {
        case '1':
        {
            createIntArr(Playing_field);
            createBoolArr(open);
            int i{};
            int j{};
            for (i = 0; i < 10; i++) // заполнение 0-ми
            {
                for (j = 0; j < 10; j++) // заполнение 0-ми
                {
                    *(*(Playing_field + i) + j) = 0;
                    *(*(open + i) + j) = false;
                }
            }
            for (int c = 0; c < BOOM; c++) // заполнение минами
            {
                do
                {
                    i = rand() % N;
                    j = rand() % N;
                }
                while (*(*(Playing_field + i) + j) != 0);
                *(*(Playing_field + i) + j) = -1;
            }
            for (i = 0; i < N; i++) // заполнение подсказками
            {
                for (j = 0; j < N; j++)
                {
                    if (*(*(Playing_field + i) + j) != -1)
                    {
                        int quantity{};
                        if (mine(i - 1, j - 1)) quantity++;
                        if (mine(i - 1, j)) quantity++;
                        if (mine(i - 1, j + 1)) quantity++;
                        if (mine(i, j - 1)) quantity++;
                        if (mine(i, j + 1)) quantity++;
                        if (mine(i + 1, j - 1)) quantity++;
                        if (mine(i + 1, j)) quantity++;
                        if (mine(i + 1, j + 1)) quantity++;
                        Playing_field[i][j] = quantity;
                    }
                }
            }
            while (true)
            {
                system("cls");
                cout << "*****************************" << endl << endl;
                cout << "* САПЕР ОШИБАЕТЬСЯ ОДИН РАЗ *" << endl << endl;
                cout << "*****************************" << endl;
                cout << endl << endl;
                print_array_2D();
                cout << endl;
 
 
                // запрашиваем координаты удара
                char input_coordinate[3]{ '\0' };
                cout << "Введите координаты удара (E7): ";
                cin >> input_coordinate;
                // переводим координаты в цифровой вид
                if ((input_coordinate[0] >= 65) && (input_coordinate[0] <= 74))
                {
                    j = input_coordinate[0] - 65;        // буква в промежутке от A до J
                }
                else if ((input_coordinate[0] >= 97) && (input_coordinate[0] <= 106))
                {
                    j = input_coordinate[0] - 97;  // буква в промежутке от a до j
                }
                else continue;                              // если введены неверные значения, возврат в начало цикла
                if ((input_coordinate[1] >= 48) && (input_coordinate[1] <= 57))
                {
                    i = input_coordinate[1] - 48;
                }
                else continue;
 
 
                // далее проверяем все восемь окрестных полей на пустые клетки показываем некий кусок поля               
                clean(i, j);
                if (mine(i, j))
                {
                    openmines();
                    final(true);
                    break;
                }
                if (win_or_lose())
                {
                    final(false);
                    break;
                }
            }
            deleteBoolArr(open);
            deleteIntArr(Playing_field);
        }
        break;
 
        case '2':
        {
            rules();
            system("pause");
        }
        break;
 
        default:
        {
            cout << "Ошибка, попробуйте еще раз, нажмите кнопку <Enter>, чтобы повторить попытку" << endl;
            break;
        }
        system("pause");
        }
    }
    return 0;
}
 
 
//  2
void rules()
{
    cout << "\t\t\t\t\t\t\t\tСАПЕР: ПРАВИЛА И ОБЩИЕ СВЕДЕНИЯ" << endl << endl << endl << endl;
    cout << "\tНачните с открытия одной ячейки." << endl;
    cout << "\tЧисло в ячейке показывает, сколько мин скрыто вокруг данной ячейки. Это число поможет понять вам, где находятся безопасные ячейки, а где находятся бомбы." << endl;
    cout << "\tЕсли рядом с открытой ячейкой есть пустая ячейка, то она откроется автоматически." << endl;
    cout << "\tЕсли вы открыли ячейку с миной, то игра проиграна." << endl;
    cout << "\tЕсли в ячейке указано число, оно показывает, сколько мин скрыто в восьми ячейках вокруг данной. Это число помогает понять, где находятся безопасные ячейки." << endl;
    cout << "\tИгра продолжается до тех пор, пока вы не откроете все не заминированные ячейки." << endl << endl << endl;
    cout << "\tУдачной игры!)" << endl << endl << endl << endl << endl << endl;
}
//  1
void print_array_2D()
{
 
 
    char strLetters[30] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '\0' };
    cout << "  ";
    for (int i = 0; i < N; i++)
    {
 
        cout << " " << strLetters[i];
    }
    cout << endl;
 
    for (int x = 0; x < N; x++)
    {
        if (x < 10)
        {
            cout << x << " |";
        }
        else
        {
            cout << x << "|";
        }
 
        for (int y = 0; y < N; y++)
        {
            if (open[x][y])
            {
 
                if (Playing_field[x][y] == -1)
                {
                    show_of_mines();
                }
                else if (Playing_field[x][y] == 0)
                {
                    show_of_mines();
                }
                else
                {
                    cout << Playing_field[x][y] << " ";
                }
            }
            else
            {
                cout << "& ";
            }
        }
        cout << "\n";
    }
}
 
void show_of_mines()
{
    cout << "* ";
}
// рекурсивная функция, которая открывает поля в точке попадания
void clean(int i, int j)
{
    if ((i >= 0) && (i<N))
    {
        if ((j >= 0) && (j<N))
        {
            if (!open[i][j])
            {
                open[i][j] = true;
                if (Playing_field[i][j] == 0)
                {
 
                    //clean(i - 1, j - 1);
                    clean(i - 1, j);
                    //clean(i - 1, j + 1);
                    clean(i, j - 1);
                    clean(i, j + 1);
                    //clean(i + 1, j - 1);
                    clean(i + 1, j);
                    //clean(i + 1, j + 1);
                }
            }
        }
    }
}
 
// проверяет ячейку на пустоту (true), выход за пределы массива возвращает false
bool empty(int i, int j)
{
    if ((i >= 0) && (i<N))
    {
        if ((j >= 0) && (j<N))
        {
            if (*(*(Playing_field + i) + j) == 0) return true;
        }
    }
    return false;
}
 
// проверяет ячейку на мину ; выход за пределы возвращает false
bool mine(int i, int j)
{
    if ((i >= 0) && (i<N))
    {
        if ((j >= 0) && (j<N))
        {
            if (*(*(Playing_field + i) + j) == -1) return true;
        }
    }
    return false;
}
 
bool win_or_lose()
{
    for (int x = 0; x < N; x++)
    {
        for (int y = 0; y < N; y++)
        {
            if ((*(*(Playing_field + x) + y) != -1) && (!*(*(open + x) + y))) return false;
        }
    }
    return true;
}
 
// в случае проигрыша эта функция откроет все мины
void openmines()
{
    for (int i = 0; i<N; i++)
    {
        for (int j = 0; j<N; j++)
        {
            if (*(*(Playing_field + i) + j) == -1) *(*(open + i) + j) = true;
        }
    }
}
 
void final(bool loser)
{
    system("cls");
 
    print_array_2D();
    if (loser)
    {
        cout << "\a" << endl;
        cout << "ВЫ ПРОИРАЛИ!(" << endl << endl;
    }
    else
    {
        cout << "\a" << endl;
        cout << "ВЫ ВЫИГРАЛИ!)" << endl << endl;
    }
    system("pause");
    cout << endl << endl;
}
0
Just Do It!
 Аватар для XLAT
4201 / 2657 / 654
Регистрация: 23.09.2014
Сообщений: 8,955
Записей в блоге: 3
03.10.2019, 10:46
Vladymyr_2020,

это:
Цитата Сообщение от Vladymyr_2020 Посмотреть сообщение
{ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '\0' };
и ещё в других местах.

Почему вы уже во второй раз поститите код в котором продолжают находиться
уже исправленные ошибки???


Сколько букв в латинском алфавите?
а сколько тут у вас?

Цитата Сообщение от Vladymyr_2020 Посмотреть сообщение
//Почему там где я заполняю от 0 до N не могу фигачить по координатом, а могу только до 10?, как это можно исправить?
как гляну, если будет что, отпишусь...

зы:
На гите см.свежак.

Добавлено через 14 минут
.
Цитата Сообщение от Vladymyr_2020 Посмотреть сообщение
как это можно исправить?
ещё раз:
смотрите гит!!!
напоминаю, что ссыль я вам дал, ищете в постах, если закладки в брузере не делаете.

Добавлено через 3 минуты
зы:
боже правый!
не иначе день сурка,
каждое утро начинается с одного и того же глючного кода, который нужно опять и снова править!
0
Just Do It!
 Аватар для XLAT
4201 / 2657 / 654
Регистрация: 23.09.2014
Сообщений: 8,955
Записей в блоге: 3
03.10.2019, 10:59
Vladymyr_2020, и про спойлеры вроде уже мы всё обсудили.
почему их не используете?
не разобрались.
почему до сих пор не разобрались?



Результат:
C++
1
2
3
4
int main()
{
    return 0;
}
0
4 / 4 / 0
Регистрация: 09.05.2019
Сообщений: 72
03.10.2019, 15:53  [ТС]
Можете мне последний раз скинуть полностью рабочий код!))),на почту или в личное сообщение и на этом пока все!)), если можно в ткст, то я был запускал то что вы присылали на гит, но нажимал B1 и был бесконечный цикл очистки экрана

Добавлено через 1 минуту
Если можете, скиньте пожалуйста мне на почту, дальше если что буду сам корректировать, я вам за вашу работу очень благодарен
0
Just Do It!
 Аватар для XLAT
4201 / 2657 / 654
Регистрация: 23.09.2014
Сообщений: 8,955
Записей в блоге: 3
03.10.2019, 15:58
Vladymyr_2020,
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
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
///----------------------------------------------------------------------------|
/// Консольный сапер.
/// Version 0.4.1
/// (нужен тест!)
///----------------------------------------------------------------------------:
#include <iostream>
#include <time.h>
#include <stdio.h>
//#include <cstdlib> atoi()
#include <conio.h>
using namespace std;
 
#define FORi(n)  for (int i = 0; i < n; ++i)
#define FORj(n)  for (int j = 0; j < n; ++j)
#define LOG(v)   Log (#v, v)
#define ENDL(v)  FORi(v)std::cout << "\n"
#define DEBUG(v) Log ("DEBUG: signal!", v); _getch();
 
const char* mode_win_for_base = "mode 64,48";
const char* mode_win_for_help = "mode 64,36";
struct smystart
{   smystart()
    {   setlocale(0, "");
        system(mode_win_for_base);
        srand((unsigned int)time(NULL));
    }
}mystart;
 
 
template<class T1, class T2>
void Log(T1 s, T2 v)
{   std::cout << s << " = " << v << "\n";
}
template<class T>
void Log(T v)
{   std::cout << v << "\n";
}
///----------------------------------------------------------------------------|
/// Двумерный динамический массив инкапсулированный в структуре.
///----------------------------------------------------------------------------:
template<class T>
class carr
{
public:
    carr(int _r, int _c) : arr(NULL), row(_r), column(_c)
    {   arr = create_arr(row, column);
    }
    
    carr() : arr(NULL), row(0), column(0)
    {   
    }
    
    carr(carr& _arr) : arr(NULL), row(0), column(0)
    {   resize(_arr.row, _arr.column);
        FORi(row)
            FORj(column)
                arr[i][j] = _arr[i][j];
    }
    
    carr(carr&& _arr) : arr(NULL), row(0), column(0)
    {   
    }
    
   ~carr()
    {   delete_arr(arr);
    }
    
    //------------------------------------------------------resize(int r, int c)
    void resize(int _r, int _c)
    {   
        if(arr != NULL) 
        {   
            delete_arr   (arr);
        }
        row    = _r;
        column = _c;
        arr = create_arr(row, column);
    }
    
    //-----------------------------------------------------------init_one(T val)
    void init_one(T _val)
    {   if(arr == NULL)
        {   std::cout << "Нет массива!\n";
            return;
        }
        FORi(row)
            FORj(column)
                arr[i][j] = _val;
    }
    
    int row_()
    {   return row;
    }
    int column_()
    {   return column;
    }
    
    //-------------------------------------------------------------------show():
    void show()
    {   //info();
        if(arr == NULL)
        {   std::cout << "Нет массива!\n";
            return;
        }
        FORi(row)
        {   FORj(column)
            {   std::cout << arr[i][j];
            }
            std::cout << "\n";
        }
        std::cout << "\n";
    }
    void info()
    {   Log(__FUNCTION__);
        LOG(row);
        LOG(column);
        LOG(arr);
        std::cout << "\n";
    }
    //-------------------------------------------Форматированный вывод на экран:
    void show_format()
    {   
    }
    
    T*  operator[](const int i)const  //noexcept
    {   return arr[i];
    }
 
    carr<T>& operator=(carr<T>& rhs) //noexcept ///-------------copy assignment:
    {   Log("copy assignment");
        if (this != &rhs)
        {   carr<T> tmp(rhs);
            swap (*this, tmp);
        }
        return *this;
    }
 
    carr<T>& operator=(carr<T>&& rhs) //noexcept ///------------move assignment:
    {   Log("move assignment");
        swap (*this, rhs);
        return *this;
    }
    
    void init_rand(int border_start, int border_end = 0)
    {   if(arr == NULL)
        {   std::cout << "Нет массива!\n";return;
        }
        if (border_start > border_end) std::swap(border_start, border_end);
        FORi(row)
            FORj(column)
                arr[i][j] = rrand(border_end, border_start);
    }
    
    static int rrand(int range_max, int range_min = 0)
    {   return rand() % (range_max - range_min + 1) + range_min;
    }
    
protected:
    T** arr;
    int row, column;
    
    //--------------------------------------------------------------create_arr()
    T** create_arr(int r, int c)
    {   //LOG(__PRETTY_FUNCTION__);
        T** _arr;
        _arr = new T*[r];
        FORi(r)
        {   _arr[i] = new T[c];
        }
        return _arr;
    }
    
    //--------------------------------------------------------------delete_arr()
    void delete_arr(T**& p)
    {   
        FORi(row)
        {   delete[] p[i];
        }
        delete[] p;
        p = NULL;
    }
    
    friend void swap (carr<T>& l, carr<T>& r) //noexcept
    {   using std::swap;
        swap (l.arr ,    r.arr);
        swap (l.row ,    r.row);
        swap (l.column , r.column);
    }
};
 
typedef  const char* CCR;
void rules          ();
void show_of_mines  ();
void openmines      ();
bool empty  (int, int);
bool is_mine(int, int);
void print_array_2D ();
void clean  (int, int);
bool is_win         ();
bool final      (bool);
void pause       (CCR);
void is_find_mine   ();
 
template<class T>
T input_user(const char* promt)
{   std::cout << promt << " ";
    T my;
        
    while(!(std::cin>>my) || std::cin.get() != '\n')
    {   std::cout << "Incorrect input!";
        std::cin.clear();
        std::cin.sync();
    }
    return my;
}
 
///----------------------------------------------------------------------------|
/// Глобалы.
///----------------------------------------------------------------------------:
const int SIZEE = 12; // Рамер поля по дефолту.
const int Bomba =  9; // Чтоб не тратиься на форматировние :)
 
carr<int>  Playing_field;
carr<bool> openn        ;
int        its_my_lifes ;
int        myrating     ;
int        prize        ;
int        steps        ;
 
 
class cConfig
{
public:
    cConfig() : NRow(SIZEE), NCol(SIZEE), BOOM(10)
    {   
    }
 
    int NRow, NCol;
    int BOOM;
 
    void init_start()
    {   NRow = SIZEE;
        NCol = SIZEE;
    
        Playing_field.resize(NRow, NCol);
        Playing_field.init_one       (0);
 
        openn.resize        (NRow, NCol);
        openn.init_one           (false);
 
        its_my_lifes = 3;
        myrating     = 0;
        prize        = 5;
        steps        = 0;
    }
}config;
 
int& NRow = config.NRow;
int& NCol = config.NCol;
int& BOOM = config.BOOM; // Количество бомб на поле.
 
 
///----------------------------------------------------------------------------|
/// GUI
///----------------------------------------------------------------------------:
class cGui_03
{
    carr<int>&  mi;
    carr<bool>& mb;
    cConfig&   cfg;
 
public:
    cGui_03(carr<int>& i, carr<bool>& b, cConfig& c) : mi(i), mb(b), cfg(c)
    {
    }
    
    void work()
    {   
        while(true)
        {   system("cls");
            cout << " Настройки\n\n\n"
                 << " 1 - РАЗМЕР ПОЛЯ.\n"
                 << " 2 - Количество БОМБ.\n"
                 << " ...\n"
                 //////////////////////
                 << " 0 - ВЫХОД.\n\n\n";
            char choice = 0;
            choice = input_user<char>(" СДЕЛАЙТЕ ВАШ ВЫБОР: "); ENDL(2);
            if(choice == '0') return;
 
            switch (choice)
            {   case '1':
                {
                    int   x = 0;
                    int   y = 0;
                    bool  b = true;
                    while(b)
                    {
                        x = input_user<int>(" Введите ШИРИНУ  поля: ");
                        b = (x < 4) || (x > 25);
                     if(b) continue;
                        y = input_user<int>(" Введите ВЫСОТУ поля: ");
                        b = (y < 4) || (y > 35);
                    }
                    mi.resize(x, y);
                    mb.resize(x, y);
                    cfg.NCol = x;
                    cfg.NRow = y;
                }
                break;
 
                case '2':
                    cfg.BOOM = input_user<int>(" Введите кол-во БОМБ: ");
                break;
 
                case '0':
                return;
 
                default:
                    ;
            }
        }
    }
}gui_03(Playing_field, openn, config);
 
void test_class_cGui_03(carr<int>& i, carr<bool>& b)
{   Log("test_class_cGui_03()");
    cGui_03 gui(i, b, config);
            gui.work();
    pause   ("Тест закончен!\n\n");
}
 
///--------------------------|
/// Тест всех классов.       |
///--------------------------:
void test_all()
{
    //test_class_cGui_03(Playing_field, openn);
}
///----------------------------------------------------------------------------|
/// main()
///----------------------------------------------------------------------------:
int main()
{   test_all();
    config.init_start();
 
    char choice;
    while (true)
    {   choice = 0;
        system("cls");
        cout << " САПЕР\n\n\n"
             << " 1 - ИГРАТЬ. \n"
             << " 2 - ПРАВИЛА ИГРЫ << САПЕР. >> \n"
             << " 3 - НАСТРОЙКИ. >> \n"
             << " 0 - ВЫХОД.\n\n\n";
 
           choice = input_user<char>(" СДЕЛАЙТЕ ВАШ ВЫБОР: "); ENDL(2);
        if(choice == '0') break;
 
        switch (choice)
        {   
            ///----------------------------------------------------------------|
            /// ИГРАТЬ.     |
            ///----------------------------------------------------------------:
            case '1':
            {   
start:          Playing_field.init_one (0);
                openn.init_one (false);
                
                ///------------------------|
                /// Заполнение минами.     |
                ///------------------------:
                int i,j;
 
                for (int c = 0; c < BOOM; c++)
                {   do
                    {   i = rand() % NRow;
                        j = rand() % NCol;
                    }
                    while (Playing_field[i][j] != 0);
                    Playing_field[i][j] = Bomba;
                }
 
//Playing_field[0][0] = Bomba;
//Playing_field[3][3] = Bomba;
 
                ///------------------------|
                /// Заполнение подсказками.|
                ///------------------------:
                FORi(NRow)
                {   FORj(NCol)
                    {   if (Playing_field[i][j] != Bomba)
                        {   int quantity = 0;
                            if (is_mine(i - 1, j - 1)) quantity++;
                            if (is_mine(i - 1, j    )) quantity++;
                            if (is_mine(i - 1, j + 1)) quantity++;
                            if (is_mine(i, j - 1    )) quantity++;
                            if (is_mine(i, j + 1    )) quantity++;
                            if (is_mine(i + 1, j - 1)) quantity++;
                            if (is_mine(i + 1, j    )) quantity++;
                            if (is_mine(i + 1, j + 1)) quantity++;
                            Playing_field[i][j]  =  quantity;
                        }
                    }
                }
                    
                while (true)
                {   system("cls");
                    cout << "*****************************\n"
                         << "* САПЕР ОШИБАЕТСЯ  ОДИН РАЗ *\n"
                         << "*****************************\n";
                    ENDL(3);
                    print_array_2D();
                    ENDL(1);
 
                    if(steps == 5)
                    {   steps = 0;
                        prize += 5;
                    }
                    std::cout << "\n\nМои жизни: " << its_my_lifes;
                    std::cout <<   "\nОчки     : " << myrating     << "\n\n";
 
Log("Я читер!");
Playing_field.show();
 
                    ///-----------------------------|
                    ///запрашиваем координаты удара.|
                    ///-----------------------------:
                    char input_coordinate[4] = {0};
                    cout << "Введите координаты удара (E7): ";
                    std::cin.clear();
                    std::cin.sync();
                    cin.get(input_coordinate, 4, '\n');
 
                int i, j;
                // Переводим координаты в цифровой вид ------------------------:
                j = (unsigned int)input_coordinate[0];
                if(j < 90 ) j = j - 65; // буква в промежутке от A до Z [65- 90]
                else        j = j - 97; // буква в промежутке от a до z [97-122]
 
                i = (input_coordinate[1] - 48);
                if(input_coordinate[2]) i = i *10 +(input_coordinate[2] - 48);
/*
///==================|
/// Отладочный код.  |
///------------------:
Log("\nDEBUGER:\n");
LOG(input_coordinate);
LOG(j);
LOG(i);
pause("дальше\n");
///==================|
*/
                if ((0 > j) && (j > NCol))
                {   std::cout << "Не пытайтесь жульничать!"; LOG(j);
                    _getch();
                    continue;
                }
                //i = atoi(input_coordinate+1);
                if( 0 > i  && i > NRow)
                {   std::cout << "Не пытайтесь жульничать!"; LOG(i);
                    _getch();
                    continue;
                }
                ///--------------
                /// Ход принят! |
                ///-------------:
                steps++;
 
                    ///--------------------------------------------------------|
                    /// Показываем окрестный кусок поля c пустыми клетками.    |
                    ///--------------------------------------------------------:
                    clean(i, j);
 
                    if (is_mine(i, j))
                    {   openmines();
                        
                        its_my_lifes--;
                        myrating  -= 5;
 
                        if(final(true))
                        {   prize = 5;
                            steps = 0;
                            goto start;
                        }
 
                        if(its_my_lifes == 0)
                        {   break;        /// Проигрыш!
                        }
                    }
                    else
                    {   if (is_win())
                        {   final(false); /// Выигрыш!
                            break;
                        }
                    }
 
                    is_find_mine();
                } /// loop
            }
            break;
 
            case '2':
            {   rules();
            }
            break;
                
 
            case '3':
            ////////////////////////////////////////////////////////////////////
            gui_03.work();
            ////////////////////////////////////////////////////////////////////
            break;
 
            default:
            {   cout <<
"Ошибка, попробуйте еще раз, нажмите кнопку <Enter>, чтобы повторить попытку" <<
                endl;
                break;
            }
            system("pause");
        }
    }
    return 0;
}
 
void rules()
{   system(mode_win_for_help);
    cout << "\t\t\t\t\t\t\t\tСАПЕР: ПРАВИЛА И ОБЩИЕ СВЕДЕНИЯ\n\n\n\n";
    cout << "\tНачните с открытия одной ячейки.\n"
         << "\tЧисло в ячейке показывает, сколько мин скрыто вокруг\n"
         << " данной ячейки. Это число поможет понять вам, где находятся\n"
         << " безопасные ячейки, а где находятся бомбы.\n\n";
         
    cout << "\tЕсли рядом с открытой ячейкой есть пустая ячейка,\n"
         << " то она откроется автоматически.\n\n";
    
    cout << "\tЕсли вы открыли ячейку с миной, то игра проиграна.\\nn";
    
    cout << "\tЕсли в ячейке указано число, оно показывает,\n"
         << " сколько мин скрыто в восьми ячейках вокруг данной.\n"
         << " Это число помогает понять, где находятся безопасные ячейки.\n\n";
    
    cout << "\tИгра продолжается до тех пор,\n"
         << " пока вы не откроете все не заминированные ячейки.\n\n\n";
         
    cout << "\tУдачной игры!)\n\n\n\n" << endl;
    
    pause("... продолжить: ENTER");
    system(mode_win_for_base);
}
 
///----------------------------------------------------------------------------|
/// Вывод минного поля на экран.
///----------------------------------------------------------------------------:
#define PRINT(v) FORi(v)std::cout << " "
#include <iomanip>
void print_array_2D()
{   
    char strLetters[30] = {"ABCDEFGHIJKLMNOPQRSTUVWXYZ"};
    cout << "    ";
    for (int i = 0; i < config.NCol; i++)
    {   cout << " " << strLetters[i];
    }
    cout << endl;
 
    cout << "     ";
    for (int i = 0; i < config.NCol-1; i++)
    {   cout << "--";
    }
    cout << "-\n";
 
    FORi(NRow)
    {   cout << std::setw(3) << i << " |";
        FORj(NCol)
        {   
            if (openn[i][j])
            {   switch(Playing_field[i][j])
                {   case Bomba:
                    show_of_mines();
                    break;
                    
                    case 0:
                    cout << "* ";
                    break;
                    
                    default:
                        cout << Playing_field[i][j] << " ";
                }
            }
            else
            {   cout << "& ";
            }
        }
        cout << "\n";
    }
}
 
void show_of_mines()
{   cout << "* ";
}
///----------------------------------------------------------------|
/// Рекурсивная функция, которая открывает поля в точке попадания. |
///----------------------------------------------------------------:
void clean(int i, int j)
{   if     ((i >= 0) && (i < NRow))
    {   if ((j >= 0) && (j < NCol))
        {   if (!openn[i][j])
            {   openn[i][j] = true;
                if (Playing_field[i][j] == 0)
                {   clean(i - 1, j - 1);
                    clean(i - 1, j    );
                    clean(i - 1, j + 1);
                    clean(i    , j - 1);
                    clean(i    , j + 1);
                    clean(i + 1, j - 1);
                    clean(i + 1, j    );
                    clean(i + 1, j + 1);
                }
            }
        }
    }
}
 
///----------------------------------------------------------------|
/// Проверяет ячейку на пустоту (true),                            |
/// выход за пределы массива возвращает false                      |
///----------------------------------------------------------------:
bool empty(int i, int j)
{   if     ((i >= 0) && (i<NRow))
    {   if ((j >= 0) && (j<NCol))
        {   if (Playing_field[i][j] == 0) return true;
        }
    }
    return false;
}
 
///----------------------------------------------------------------|
/// Проверяет ячейку на мину: выход за пределы возвращает false.   |
///----------------------------------------------------------------:
bool is_mine(int i, int j)
{   if    ((i >= 0) && (i<NRow))
    {   if((j >= 0) && (j<NCol))
        {   if(Playing_field[i][j] == Bomba) return true;
        }
    }
    return false;
}
 
bool is_win()
{   FORi(NRow)
    {   FORj(NCol)
        {   if ((Playing_field[i][j] == Bomba) && !openn[i][j])
                return false;
        }
    }
    return true;
}
 
// в случае проигрыша эта функция откроет все мины
void openmines()
{   FORi(NRow)
    {   FORj(NCol)
        {   if (Playing_field[i][j] == Bomba) openn[i][j] = true;
        }
    }
}
 
///----------------------------------------------------------------------------|
/// true - игра продолжается!
///----------------------------------------------------------------------------:
bool final(bool loser)
{   system("cls");
 
    print_array_2D();
    if (loser)
    {   cout << "\a\n" << "ВЫ ПРОИГРАЛИ...(:\n\n";
        if(its_my_lifes != 0)
        {
            cout << "НО У ВАС ЕЩЁ ЕСТЬ ШАНС!\n\n"
                 << "ОСТАЛОСЬ ЖИЗНЕЙ: " << its_my_lifes << "\n\n";
            pause("продолжить...");
            return true;
        }
        else
        {   cout << "ВЫ ПОКОЙНИК!(:\n\n"
                 << "ЖИЗНЕЙ БОЛЬШЕ НЕТ!\n";
            system("color 47");
        }
    }
    else
    {   cout << "\a\n" << "УРА! ВЫ ВЫИГРАЛИ!)))\n\n";
        system("color 70");
    }
 
    pause("продолжить...");
    system("color 07");
    config.init_start();
    return false;
}
 
///----------------------------------------------------------------------------|
/// Пауза.
///----------------------------------------------------------------------------:
void pause(const char* mess)
{   std::cout << "\nЖмите ENTER " << mess << " ";
    std::cin.clear();
    std::cin.sync();
    _getch();
}
 
///----------------------------------------------------------------------------|
/// Обезвредить мину.
///----------------------------------------------------------------------------:
bool is_open(int i, int j)
{   if    ((i >= 0) && (i<NRow))
    {   if((j >= 0) && (j<NCol))
        {   if(openn[i][j]) return true;
            else            return false;
        }
    }
    return true;
}
 
void is_find_mine()
{   FORi(NRow)
    {   FORj(NCol)
        {   if((!openn[i][j]) && (Playing_field[i][j] == Bomba) &&
                    is_open(i - 1, j - 1) &&
                    is_open(i - 1, j    ) &&
                    is_open(i - 1, j + 1) &&
                    is_open(i    , j - 1) &&
                    is_open(i    , j + 1) &&
                    is_open(i + 1, j - 1) &&
                    is_open(i + 1, j    ) &&
                    is_open(i + 1, j + 1) )
            {   /// Ёлы-палы!!! Тут мина!
                openn[i][j] = true;
                myrating += prize;
            }
        }
    }
}
пжлста сделайте тест,
всё ли работает, из того что планировали?

если да,
то преобразуйте в сырец очищенный от структур.
0
Just Do It!
 Аватар для XLAT
4201 / 2657 / 654
Регистрация: 23.09.2014
Сообщений: 8,955
Записей в блоге: 3
03.10.2019, 16:00
сам ехе
(VS2010)
Вложения
Тип файла: rar Saper-0.4.1.rar (79.1 Кб, 55 просмотров)
0
0 / 0 / 0
Регистрация: 22.10.2023
Сообщений: 1
24.10.2023, 17:02
XLAT, Добрый день понимаю что времени много прошло и возможно этого уже нет, но может быть у Вас остался код от Сапера, т.к. ехе на код разобрать не выйдет, а код который выше, запускает нескончаемый цикл, но мне хотелось бы подправить сам текст в сапере, если у Вас будет возможность предоставить код я буду очень благодарен
0
Just Do It!
 Аватар для XLAT
4201 / 2657 / 654
Регистрация: 23.09.2014
Сообщений: 8,955
Записей в блоге: 3
24.10.2023, 18:21
AndreiIlchenko,
https://github.com/BDOTimer/Sa... ter/Arhive
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.10.2023, 18:21
Помогаю со студенческими работами здесь

Сапер на С++
помогите пожалуйста переделать игру сапер, программа работает, осталось оформить ее с классом &quot;Field&quot;, помогите пожалуйста, а то...

сапёр
здравствуйте извините, если повторяюсь (видела, что подобная тема была, причём не одна, но не нашла там того, что надо), но мне срочно...

Сапер
На поле для игры в сапер клеточки с минами обозначаются символом “*”, а в каждой пустой клеточке записано число от 0 до 8, равное...

Сапер на С++
Здравствуйте, я начал делать сапера на С++, простого, без функций итд, просто в мейне... Пока я только на этапе прощета количества бомб, но...

Сапер
Пишу игру &quot;сапер&quot; на C++. Появилась небольшая проблемка. Всё поле храню в массиве. Бомбы разбрасываю случайно по полю, а после этого...


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

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru