Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 15.11.2021
Сообщений: 2

Сапер. Функция открытия ячеек

15.11.2021, 13:24. Показов 1403. Ответов 4

Студворк — интернет-сервис помощи студентам
Пишу курсовую. Задание сделать игру сапер на консоли. Как вы знаете, в сапере при открытии ячейки вокруг которой нет бомб, она открывает все соседние ячейки. И если среди тех ячеек тоже появиться такая "пустая ячейка" от вокруг нее тоже откроются. И так должно продолжаться пока не создаться поле пустых ячеек по краям которого ячейки со значениями(количеством бомб).
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
#include <iostream>
#include <time.h>
#include<Windows.h>
using namespace std;
 
int Count(int x, int y, int mas[9][9]);
 
void Null_unit(int x, int y, int mas[9][9]); //открытие пустых ячеек
 
void openUnits(int x, int y, int mas[9][9]);
 
void Bombs_define(int mas[9][9]);
 
void Print(int mas[9][9]);
 
 
int main()
{
    srand(time(0));
    int x, y;
    int mas[9][9];
    for (int i = 0; i < 9; i++) {
        for (int j = 0; j < 9; j++) {
            int a = 10;
            mas[i][j] = a;
        }
    }
    Bombs_define(mas);
    Print(mas);
    while (1) {
        cout << endl <<"Input x & y " << endl;
         do {
            cin >> y >> x;
            openUnits(x, y, mas);
            Print(mas);
         } while (x > 9 || x < 0 || y>9 || y < 0);
       
    }
}
int Count(int x, int y, int mas[9][9]) {
    int counter(0);
    //[x-1]
    if (x > 0 && y > 0 && mas[x - 1][y - 1] == 11)counter++;
    if (x > 0 && mas[x - 1][y] == 11)counter++;
    if (x > 0 && y < 9 && mas[x - 1][y + 1] == 11)counter++;
    //[x]
    if (y > 0 && mas[x][y - 1] == 11)counter++;
    if (y < 9 && mas[x][y + 1] == 11)counter++;
    //[x+1]
    if (x < 9 && y > 0 && mas[x + 1][y - 1] == 11)counter++;
    if (x < 9 && mas[x + 1][y] == 11)counter++;
    if (x < 9 && y < 9 && mas[x + 1][y + 1] == 11)counter++;
    return counter;
}
 
 
void Null_unit(int x, int y, int mas[9][9]) {//открытие пустых ячеек
    mas[x][y] = 100;
    if (x > 0) {
        if (y > 0) {
            //1
            mas[x - 1][y - 1] = Count(x - 1, y - 1, mas);
            
        }
        //2
        mas[x - 1][y] = Count(x - 1, y, mas);
        
        if (y < 9) {
            //3
            mas[x - 1][y + 1] = Count(x - 1, y + 1, mas);
           
        }
    }
    if (y < 8) {
        //4
        mas[x][y + 1] = Count(x, y + 1, mas);
       
    }
    if (y > 0) {
        //5
        mas[x][y - 1] = Count(x , y - 1, mas);
        
    }
    if (x < 8) {
        if (y > 0) {
            //6
            mas[x + 1][y - 1] = Count(x + 1, y - 1, mas);
            
        }
        //7
        mas[x + 1][y] = Count(x + 1, y, mas);
        //8
        if (y < 8) {
            mas[x + 1][y + 1] = Count(x + 1, y + 1, mas);
        }
 
    }
  if (x > 0) {
        if (y>0 && mas[x - 1][y - 1] == 0)Null_unit(x - 1, y - 1, mas);
        if (mas[x - 1][y] == 0)Null_unit(x - 1, y, mas);
        if (y<8 && mas[x - 1][y + 1] == 0)Null_unit(x - 1, y + 1, mas);
    }
   
  if (y>0 && (mas[x][y - 1] == 0))Null_unit(x, y - 1, mas);
  if (y<8 && (mas[x][y + 1] == 0))Null_unit(x, y + 1, mas);
  if (x < 8) {
        if (mas[x + 1][y] == 0)Null_unit(x + 1, y, mas);
        if (y>0 && mas[x + 1][y - 1] == 0)Null_unit(x + 1, y - 1, mas);
        if (y<8 && mas[x + 1][y + 1] == 0)Null_unit(x + 1, y + 1, mas);
  }
    
 
}
 
void openUnits(int x, int y, int mas[9][9]) {
    if(mas[x][y]==11){
        cout << "you lox" << endl;
        exit(EXIT_SUCCESS);
    }
    else if (Count(x, y, mas) == 0) {
        Null_unit(x, y, mas);
    }
    else
    {
        mas[x][y] = Count(x, y, mas);
    }
 
}
 
 
void Bombs_define(int mas[9][9]) {
    int bombs_x[10];
    int bombs_y[10];
    for (int i = 0; i < 10; i++)
    {
        do
        {
            bombs_x[i] = (rand() % 9);
            bombs_y[i] = (rand() % 9);
        } while (mas[bombs_x[i]][bombs_y[i]] == 11);
 
        int x = bombs_x[i];
        int y = bombs_y[i];
        mas[x][y] = 11;
    }
 
}
 
void Print(int mas[9][9]) {
    cout << "\n   0   1   2   3   4   5   6   7   8 \n";
    for (int i = 0; i < 9; i++) {
        cout << i << " ";
        for (int j = 0; j < 9; j++) {
            switch (mas[i][j])
            {
            case 11:cout << (char)176 << (char)176 << (char)176;//бомба
                break;
            case 10:cout << (char)219 << (char)219 << (char)219;//закрытая ячейка
                break;
            case 100:cout << "[" << 0 << "]";
                break;
            default:cout << "[" << mas[i][j] << "]";
                break;
            }
            cout << " ";
        }
        cout << endl << endl;;
    }
}
 
 
 
}
Выше то что пытался написать. Но при роботе программы выдает ошибку "Необработанное исключение по адресу 0x00BB2B19 в черновик.exe: 0xC00000FD: Stack overflow (параметры: 0x00000001, 0x01002F48).". Подскажите что я могу с этим сделать.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.11.2021, 13:24
Ответы с готовыми решениями:

Функция открытия файла
typedef char* Name; typedef FILE* File Name NameFile = new char File* file; Auto Pauto int flag = 0; void...

Функция для открытия папки
Нужно сделать так, что бы после ввода пароля открывалась папка c:\\Program Files. Целый день играюсь с этим, но так и не понял куда...

Пользовательская функция для создания/открытия файла
void CreatOpenFile(Name &amp;NameFile, int &amp;flag) // Создание,открытие файла базы данных { char YorN; flag = 0; cout &lt;&lt;...

4
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
15.11.2021, 15:21
За такой код два поставят.

Вообщем нарисовал тут немного, специально оставил автоматический массив (что бы не вводить вас в ужас).
Игровое поле (бомбы и пустые ячейки) и поле игрового процесса (открытые ячейки, найденные бомбы, цифры-указатели) надо было разделить. Я этого не сделал. От этого добавилось немного лишней работы.

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
#include <iostream>
#include <ctime>
using namespace std;
 
enum class FObj:uint8_t {Empty, Empty_Open, Bomb, M1, M2, M3, M4, M5, M6, M7, M8};
using field_t = FObj;
 
const int fsize=9;
const int shift_ad[8][2] = {{-1,-1},{0,-1},{+1,-1},{-1,0},{+1,0},{-1,+1},{0,+1},{+1,+1}};// сдвиги вокруг ячейки включая диагональные
 
void Null_unit(int x, int y, field_t mas[fsize][fsize]);
void Print(field_t mas[fsize][fsize]);
bool is_around_clear(int x, int y, field_t mas[fsize][fsize], FObj clear_from);
bool inField(int x, int y);
int Count(int x, int y, field_t mas[fsize][fsize], FObj elem);
FObj NumToFobj(int num);
 
int main()
{
    srand(time(0));
    field_t field[fsize][fsize];
 
    for(int i=0; i<fsize; ++i)  // заложим бомб
        for(int j=0; j<fsize; ++j)    
            field[i][j] = rand()%10 ? FObj::Empty : FObj::Bomb;
    Print(field);
    cout << endl << "Open at [3][3] : " << endl;
    field[3][3] = FObj::Empty; // для теста открытия
    Null_unit(3,3,field);
    Print(field);
    return 0;
}
int  Count(int x, int y, field_t mas[fsize][fsize], FObj elem){
    int lx,ly, res{};
    for(int i=0; i<8; ++i){
        lx = x + shift_ad[i][0];
        ly = y + shift_ad[i][1];
        if (inField(lx, ly) && mas[lx][ly]==elem)
            ++res;
    }
    return res;
}
void Null_unit(int x, int y, field_t mas[fsize][fsize]){
    if (is_around_clear(x,y, mas, FObj::Bomb))
         mas[x][y] = FObj::Empty_Open;
 
    else{
        mas[x][y] = NumToFobj(Count(x,y,mas,FObj::Bomb)) ; // открыли ячейку
        return;
    }
    if ( inField(x+1,y) && (mas[x+1][y]==FObj::Empty) )
        Null_unit(x+1, y, mas);
    if ( inField(x-1,y) && (mas[x-1][y]==FObj::Empty) )
        Null_unit(x-1, y, mas);
    if ( inField(x,y+1) && (mas[x][y+1]==FObj::Empty) )
        Null_unit(x, y+1, mas);
    if ( inField(x,y-1) && (mas[x][y-1]==FObj::Empty) )
        Null_unit(x, y-1, mas);
}
bool inField(int x, int y){
    return (x>=0 && x<fsize && y>=0 && y<fsize);
}
bool is_around_clear(int x, int y, field_t mas[fsize][fsize], FObj clear_from){
    int lx,ly;
    for(int i=0; i<8; ++i){
        lx = x + shift_ad[i][0];
        ly = y + shift_ad[i][1];
        if (inField(lx, ly) && mas[lx][ly]==clear_from)
                return false;
    }
    return true;
}
 
void Print(field_t mas[fsize][fsize]){
    char fview{};
    for(int i=0; i<fsize; ++i){  
        for(int j=0; j<fsize; ++j){
            switch(mas[i][j]){
                case FObj::Bomb       : fview = 'b'; break;
                case FObj::Empty      : fview = '0'; break;
                case FObj::Empty_Open : fview = 'X'; break;
                case FObj::M1         : fview = '1'; break;
                case FObj::M2         : fview = '2'; break;
                case FObj::M3         : fview = '3'; break;
                case FObj::M4         : fview = '4'; break;
                case FObj::M5         : fview = '5'; break;
                case FObj::M6         : fview = '6'; break;
                case FObj::M7         : fview = '7'; break;
                case FObj::M8         : fview = '8'; break;
                default : fview = '*';
            }
            cout << fview;
        }
        cout<<endl;
    }
}
FObj NumToFobj(int num){
    switch (num){
        case 0 : return FObj::Empty;
        case 1 : return FObj::M1;
        case 2 : return FObj::M2;
        case 3 : return FObj::M3;
        case 4 : return FObj::M4;
        case 5 : return FObj::M5;
        case 6 : return FObj::M6;
        case 7 : return FObj::M7;
        case 8 : return FObj::M8;
        default : return FObj::Empty;
    }
}
1
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
15.11.2021, 22:25
lyashyk, функция открывает не все клетки (она задумывалась другой)
Преобразовалась в такую :
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void Null_unit(int x, int y, field_t mas[fsize][fsize]){
    if (is_around_clear(x,y, mas, FObj::Bomb)){
        int lx,ly;
        mas[x][y] = FObj::Empty_Open;
        for(int i=0; i<8; ++i){
            lx = x + shift_ad[i][0];
            ly = y + shift_ad[i][1];
            if (inField(lx, ly) && mas[lx][ly]==FObj::Empty)
                Null_unit(lx, ly, mas);
        }
    }
    else{
        mas[x][y] = NumToFobj(Count(x,y,mas,FObj::Bomb)) ; // открыли ячейку
        return;
    }
}

Если будет желания использовать мой код, могу понемногу помогать/объяснять.

Добавлено через 1 минуту
зюыю lyashyk, вашу функцию Null_unit никто править не будет.
1
0 / 0 / 0
Регистрация: 15.11.2021
Сообщений: 2
15.11.2021, 23:25  [ТС]
Это черновик. Потом бы я привел код в нормальный вид(наверное). Плюс курсовая колледжа, требования не такие большие. Но конечно развитие не помешает. Спасибо.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
15.11.2021, 23:56
Цитата Сообщение от lyashyk Посмотреть сообщение
Плюс курсовая колледжа, требования не такие большие.
Колледжа или нет, это дело другое, решите что это для Вас.
Если это побочный предмет который вы желаете обходить стороной, ладно.
НО, как я написал выше, этот ваш код никто править не будет.
Цитата Сообщение от lyashyk Посмотреть сообщение
Потом бы я привел код в нормальный вид(наверное)
Такой черновик не переделаешь под нормально - не написавши все с нуля.

Выбор за вами, написать как нибудь самостоятельно.
Или принять помощь, задавать вопросы, учится, и написать уже хоть как то по С++.
Вот мой (функциональный) код можно в классы уже вписать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.11.2021, 23:56
Помогаю со студенческими работами здесь

Функция открытия файла по имени
Здравствуйте помогите разработать прикладную программу, осуществляющую выявление по содержимому в заданном каталоге на диске ПК всех...

Сапер. При открытии ячеек stackoverflow
Здравствуйте. Пишу сапера, и появилась проблема. Пытаюсь реализовать следующую фишку: при нажатии на пустую клетку открываются все пустые,...

Открытие ячеек в игре "Сапер"
Здравствуйте, пишу текстовый Сапер на паскале, не могу правильно написать рекурсивную функцию для проверку пустого от мин поля, думаю...

Функция открытия файла
Сделал функцию. Запутался с внешними и внутренними переменными. Мне надо сделать FILE *f в main или внешней чтобы после выполнения функции...

Функция открытия, и прицедура сохранения
В общем дело вот в чём, нужно создать функции открытия и сохранения в фаил, из мемо в dll. Больше часа попыток в конечном итоге не к...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru