Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
2 / 2 / 0
Регистрация: 24.06.2018
Сообщений: 27
1

Сапер

27.11.2018, 20:38. Показов 2599. Ответов 2

Пишу игру "сапер" на C++. Появилась небольшая проблемка. Всё поле храню в массиве. Бомбы разбрасываю случайно по полю, а после этого расставляю числа, определяющие количество бомб в радиусе 1 клетки. Но некоторые числа по краям поля некорректны. Вот код:
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
#include <iostream>
#include <string>
#include <ctime>
#include <cmath>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
    srand(time(0));
 
    const int width = 10;
    const int height = 10;
    const int bombs = 25;
    int field[height][width] = {};
    int num_of_bombs_around_cell = 0;
 
    //расстановка бомб
    for (int i = 0; i < bombs; i++)
    {
        field[0 + rand() % height][0 + rand() % width] = 9;
    }
    //расстановка цифр на поле
    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            if (field[i][j] != 9)
            {
                for (int k = i - 1; k <= i + 1; k++)
                {
                    for (int l = j - 1; l <= j + 1; l++)
                    {
                        if (k < 0 || k > height || l < 0 || l > width)
                        {
                            continue;
                        }
                        else
                        {
                            if (field[k][l] == 9)
                            {
                                num_of_bombs_around_cell++;
                            }
                        }
                    }
                }
                field[i][j] = num_of_bombs_around_cell;
                num_of_bombs_around_cell = 0;
            }
        }
    }
    //вывод поля
    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            cout << field[i][j] << "  ";
        }
        cout << endl << endl;
    }
    cin.get();
    return 0;
}
Сначала я подумал, что проблема заключается в том, что я обращаюсь к несуществующим элементам массива (например, для заполнения клетки [0][0] требуется проверить окружающие ее клетки на наличие бомб. А координаты этих клеток [-1][-1], [0][-1], [1][-1], [-1][0] и т. д.), поэтому я добавил эту строку:
C++
1
2
3
4
if (k < 0 || k > height || l < 0 || l > width)
                        {
                            continue;
                        }
...таким образом избежав возможных сбоев. Но некоторые числа все равно некорректны.
Пример вывода:
0 0 1 9 9 4 9 9 9 2

0 0 1 4 9 9 3 3 4 9

0 0 1 3 9 3 1 0 2 9

0 0 1 9 3 2 1 1 2 2

1 2 2 3 9 1 2 9 2 1

9 2 9 2 1 1 2 9 2 1

1 2 1 1 0 0 1 2 3 2

0 0 0 0 0 0 0 1 9 9

1 1 0 1 1 2 1 2 2 3

9 1 0 1 9 2 9 1 0 1
Правое нижнее число - 1, хотя по логике вещей должно быть 0.
Вопрос: почему так происходит и как исправить сие недоразумение?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
1
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.11.2018, 20:38
Ответы с готовыми решениями:

Сапер
Доброго времени суток! Подскажите пожалуйста, где я налажал в коде? Я запутался:( Ругается на...

Сапер на С++
Помогите написать программу. Вводим размерность поля,задаем координаты мин и соответственно их...

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

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

2
36 / 28 / 9
Регистрация: 11.11.2018
Сообщений: 163
27.11.2018, 21:29 2
Лучший ответ Сообщение было отмечено Oleg Likh как решение

Решение

C++
1
if (k < 0 || k > height-1 || l < 0 || l > width-1)
1
2 / 2 / 0
Регистрация: 24.06.2018
Сообщений: 27
28.11.2018, 05:51  [ТС] 3
weterok, действительно глупая ошибка, спасибо)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.11.2018, 05:51

Сапер на C++
Народ хочу попробовать написать игру сапер. Не могу понять как мне расставить программно 100 кнопок...

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

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

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


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.