Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
SavoninDima
0 / 0 / 0
Регистрация: 22.03.2012
Сообщений: 5
#1

Алгоритм обхода поля - C++

23.03.2012, 14:20. Просмотров 638. Ответов 0
Метки нет (Все метки)

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

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

Описание функций:

Check - описана ниже. Смотрит пустая ли наша клетка или нет. Если да, то правда, иначе ложь.
OpenTrue - просто открывает клетку. Её код не особо важен.
Open - в принципе рекурсивная функция.

Нужны просто идеи как это запихать в двумерный массив, а так все реализовано на BGI.

Игровой класс:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class GameClass
{
      private:
             bool bomb[10][10];
             int count[10][10];
             bool flags[10][10];
             bool open[10][10];
             int gamemode;
      public:
             GameClass(int);
             void Game();
             void Open(int, int);
             bool Check(int, int);
             void InitCount();
             void BombFound();
             void OpenTrue(int, int);
             void FlagsTrue(int, int);
             void Pointer(int, int,int, int);
             void Run();
             void BuildMap();
};
Сам код:

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
bool GameClass::Check(int xCheck, int yCheck)
{
     bool BombCheck = false;
     bool CountCheck = false;
     bool FlagsCheck = false;
     bool MapCheck = false;
     
     OpenTrue(xCheck, yCheck);
     if (xCheck >= 0 && xCheck <= 9 || yCheck >= 0 && yCheck <= 9) MapCheck = true;
     if (!MapCheck) return false;
     if (bomb[xCheck][yCheck] == false) BombCheck = true;
     if (count[xCheck][yCheck] == 0 && open[xCheck][yCheck] == false) CountCheck = true;
     if (flags[xCheck][yCheck] == false) FlagsCheck = true;
     open[xCheck][yCheck] = true;
     
     if (BombCheck == true && CountCheck == true && FlagsCheck == true && MapCheck == true)
        return true;
     else
        return false;
}
 
void GameClass::Open(int xPos, int yPos)
{
     if (Check(xPos - 1, yPos))
        Open(xPos - 1, yPos);
     
     if (Check(xPos - 1, yPos - 1))
        Open(xPos - 1, yPos - 1);
     
     if (Check(xPos, yPos - 1))
        Open(xPos, yPos - 1);
     
     if (Check(xPos + 1, yPos - 1))
        Open(xPos + 1, yPos - 1);
     
     if (Check(xPos + 1, yPos))
        Open(xPos + 1, yPos);
     
     if (Check(xPos + 1, yPos + 1))
        Open(xPos + 1, yPos + 1);
     
     if (Check(xPos, yPos + 1))
        Open(xPos, yPos + 1);
     
     if (Check(xPos - 1, yPos + 1))
        Open(xPos - 1, yPos + 1);
     
     if (!Check(xPos,yPos))
        return;
}
Добавлено через 44 минуты
Измененная функция Check:

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
bool GameClass::Check(int xCheck, int yCheck)
{
     bool BombCheck = false;
     bool CountCheck = false;
     bool FlagsCheck = false;
     bool MapCheck = false;
     
     if (xCheck >= 0 && xCheck <= 9 || yCheck >= 0 && yCheck <= 9)
        MapCheck = true;
     else return false;
     
     if (bomb[xCheck][yCheck] == false)
        BombCheck = true;
     else return false;
     
     if (flags[xCheck][yCheck] == false)
        FlagsCheck = true;
     else return false;
     
     if (count[xCheck][yCheck] == 0 && open[xCheck][yCheck] == false)
        CountCheck = true;
     else
     {
                               OpenTrue(xCheck, yCheck);
                               return false;
     }
     
     open[xCheck][yCheck] = true;
     
     if (BombCheck == true && CountCheck == true && FlagsCheck == true && MapCheck == true)
     {
                   OpenTrue(xCheck, yCheck);
                   return true;
     }
     else
        return false;
}
+ скриншоты поля:

[IMG]http://s019.***********/i621/1203/9e/4cb28e42de0a.jpg[/IMG]
[IMG]http://s019.***********/i609/1203/aa/e0c5c694e851.jpg[/IMG]
1-я матрица - массив count, содержит информацию о клетках
2-я матрица - массив open, содержи информацию об открытых клетках

Добавлено через 14 часов 50 минут
сам уже сделал
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.03.2012, 14:20     Алгоритм обхода поля
Посмотрите здесь:

алгоритм обхода поля кубиком - C++
народ - никому не попадалась задачка такого вида: есть поле n*n - начало в координате 0*0(верхний левый угол). есть кубик с 1 красной...

Составить алгоритм обхода игрового поля - C++
Вобщем, такая тема: Дан двумерный массив чисел 12х12, который содержит числа от 0 до 5. 0 - дырка 1 - мое местоположение( при...

Алгоритм обхода лабиринта - C++
Помогите реализовать алгоритм обхода лабиринта, на примере матрицы nxn, где 1 (единицы) это проходимые элементы, а 0 (нули) это...

Необходимо написать программу обхода конем всего шахматного поля - C++
Доброго времени суток! Необходимо написать программу обхода конем всего шахматного поля. Конь должен посещать каждую клетку только...

Жадный алгоритм для определения последовательности обхода городов. - C++
Здравствуйте! Изучаю разные транспортные алгоритмы и возник следующий вопрос. На основе данных, полученных из txt-файла формирую...

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

Алгоритм обхода диагонали параллельной главной диагонали матрицы - C++
Как обработать каждый элемент матрицы, находящийся на диагонали параллельной главной диагонали? Понимаю, что надо ввести какую-то...

Алгоритм рандомизации поля - C++
Вот я нашел алгоритм, но тупо вставлять в проект я его не хочу, если вам не составит труда помогите понять алгоритм рандомизации. Задача о...

Варианты обхода графа - C++
подскажите пожалуйста сколько путей существует для такого графа, чтобы проходить через каждую Добавлено через 44 секунды или...

Методы обхода графов - C++
Всем привет! Есть задание : Обойти граф, используя заданный алгоритм ( Обход в глубину по матрице инцидентности ). Все что касается...

Реализация алгоритма обхода лабиринта - C++
Определение границ перколяционного кластера: реализация алгоритма обхода лабиринта. Буду очень благодарен за помощь.

Вывод обхода дерева в файл - C++
Есть бинарное дерево, не могу реализовать в нем вывод обхода дерева в файл из функции show(Node *&amp;der), вроде как-то можно забить данные из...


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

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

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