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

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

Восстановить пароль Регистрация
 
SavoninDima
0 / 0 / 0
Регистрация: 22.03.2012
Сообщений: 5
23.03.2012, 14:20     Алгоритм обхода поля #1
Игра, Сапер, когда нажимаешь на пустую клетку, то открывается поле, состоящее из пустых клеток, так вот, проблема именно в этом алгоритме.

Суть в общем такова, смотрим 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++ алгоритм обхода поля кубиком
Жадный алгоритм для определения последовательности обхода городов. C++
Алгоритм рандомизации поля C++
Алгоритм обхода лабиринта C++
Разработать алгоритм и написать программу прошивания дерева при симметричном порядке обхода его C++
Алгоритм обхода диагонали параллельной главной диагонали матрицы C++
C++ Составить алгоритм обхода игрового поля
C++ Необходимо написать программу обхода конем всего шахматного поля

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

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

Текущее время: 12:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru