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

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

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

Алгоритм поиска пути и прорисовка его - C++

01.11.2015, 09:31. Просмотров 276. Ответов 3
Метки нет (Все метки)

Есть класс Карта
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
#ifndef MAP_H
#define MAP_H
#include <SFML\Graphics.hpp>
class Map{
private:
int m_level;
 
public: 
   enum { HEIGHT_MAP=25, WIDTH_MAP=28 };
   sf::String TileMap[HEIGHT_MAP];
 
 Map();
 
 int getLevel();
 
 void setLevel(int level);
 
};
 
 
#endif
 
 
 
#include "map.h"
 
Map::Map()
 {
    setLevel(0);
 }
 
 int Map:: getLevel() { return m_level; }
 
  void Map:: setLevel(int level)
 {
    static const char* levelsMap[][HEIGHT_MAP] = {
      { 
    "0000000000000000000000000000",/* Инициализация 0-го уровня */
    "0                          0",
    "0                          0",
    "0  0 s0   0      0   0s 0  0",
    "0  0000   0mmmmmm0   0000  0",
    "0  0mm0   00000000   0mm0  0",
    "0                          0",
    "0                          0",
    "0  0mm0   000  000   0mm0  0",
    "0  0000   0      0   0000  0",
    "0  0mm0   0      0   0mm0  0",
    "t         000  000         T",
    "t                          T",
    "t                          T",
    "0  0mm0   00000000   0mm0  0",
    "0  0000            S 0000  0",
    "0  0mm0              0mm0  0",
    "0         00000000         0",
    "0                          0",
    "0  0mm0G             0mm0  0",
    "0  0000   00000000   0000  0",
    "0  0 s0              0s 0  0",
    "0                          0",
    "0                          0",
    "0000000000000000000000000000", },
    {"0000000000000000000000000000", /* Инициализация 1-го уровня */ 
    "0                          0",
    "0                          0",
    "0  0                    0  0",
    "0  0000              0000  0",
    "0  0      000  000      0  0",
    "0         0      0         0",
    "0         0      0         0",
    "0  0mm    000  000    mm0  0",
    "0  0000              0000  0",
    "0  0                    0  0",
    "t         00000000         T",
    "t           m00m           T",
    "t           m00m           T",
    "0  0      00000000      0  0",
    "0  0000              0000  0",
    "0  0                    0  0",
    "0                          0",
    "0      0000      0000      0",
    "0  0      0s    s0      0  0",
    "0  0  0   00000000   0  0  0",
    "0  0  0   0mmmmmm0   0  0  0",
    "0                          0",
    "0                          0",
    "0000000000000000000000000000", },
      { /* Инициализация 2-го уровня */ },
        };
   int levelsCount = sizeof(levelsMap) / sizeof(levelsMap[0]);
   if (level < 0 || level >= levelsCount)
     level = 0;
   m_level = level;
   for(int i=0; i < HEIGHT_MAP; i++)
     TileMap[i] = levelsMap[level][i];
 }
хочу реализовать в другом классе алгоритм поиска пути. Выбрала этот-он рабочий, т.к. тестила его, но там код не ООП.

Добавила в этот класс возможность обращаться к элементам карты.
C++
1
2
3
4
5
6
Enemy (Map* map,sf::Image &image,sf::String Name,float X, float Y, float W, float H): Entity(image,Name,X,Y,W,H){
        m_map=map;
        zq=1;state=left;timer=0;CurrentFrame=0;
        if(name=="EasyEnemy"){
            sprite.setTextureRect(sf::IntRect(0,0,w,h));
        }
Первая функция должна прорисовывать мою карту до и после преобразований. Вместо этого отображаются другие символы
C++
1
2
3
4
5
6
7
8
9
10
11
12
void display_maze(void)
{
        int i;
 
        printf("MAZE:\n");
        for ( i = 0; i < m_map->HEIGHT_MAP; i++ )
                printf("%.s\n", m_map->WIDTH_MAP, m_map->TileMap[i]);
         
        printf("\n");
 
        return;
}
Как правильно передавать значения в эту функцию , чтобы отображался мой массив.

Добавлено через 6 часов 46 минут


Добавлено через 57 минут
Я смогла вывести свой массив в класса Map, добавив пару строчек кода в void Map:: setLevel(int level)

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
void Map:: setLevel(int level)
 {
    static const char* levelsMap[][HEIGHT_MAP] = {
      { 
    /* Инициализация 0-го уровня */
 ...............
    "0  0000              0000  0",
    "0  0                    0  0",
    "0                          0",
    "0      0000      0000      0",
    "0  0      0s    s0      0  0",
    "0  0  0   00000000   0  0  0",
    "0  0  0   0mmmmmm0   0  0  0",
    "0                          0",
    "0                          0",
    "0000000000000000000000000000", },
      { /* Инициализация 2-го уровня */ },
        };
   int levelsCount = sizeof(levelsMap) / sizeof(levelsMap[0]);
   if (level < 0 || level >= levelsCount)
     level = 0;
   m_level = level;
   for(int i=0; i < HEIGHT_MAP; i++)
     {TileMap[i] = levelsMap[level][i];
      std::cout<<levelsMap[level][i];
       printf("\n");
     }
 }
{TileMap[i] = levelsMap[level][i];
std::cout<<levelsMap[level][i];
printf("\n");
}

Но я все же хочу отдельную функцию. Как мне реализовать ее? И какие значения передать? Что тут изменить?
void display_maze(void)
{
int i;

printf("MAZE:\n");
{TileMap[i] = levelsMap[level][i];//ругается,что эти индивикаторы не определены
std::cout<<levelsMap[level][i];
printf("\n");
}

return;
}

Добавлено через 4 минуты
Мне нужно передать наверное значение по ссылке , но я не понимаю как

Добавлено через 11 минут
попробовала вот так, хотя не уверена-ошибку подчеркивает

C++
1
2
3
4
5
6
7
8
9
10
11
12
void display_maze( sf::String TileMap,char* levelsMap[])
{
        int i;
 
        printf("MAZE:\n");
       {TileMap[i] = levelsMap[level][i];//ругается,что level не определен
      std::cout<<levelsMap[level][i];
       printf("\n");
     }
 
        return;
}
Добавлено через 7 минут
void display_maze( sf::String TileMap,char* levelsMap[][],int level)//массив не может содержать элементы этого типа

Добавлено через 8 минут
Ребята, очень нужна помощь и разъяснения
C++
1
2
3
4
5
6
7
8
9
10
11
12
void display_maze( sf::String TileMap,int level,char*levelsMap[][Map::HEIGHT_MAP])
{
    int i;
    printf("MAZE:\n");
    for(int i=0; i < Map::HEIGHT_MAP; i++)
    {TileMap[i] = levelsMap[level][i];//pЗначения типа char*нельзя присвоить сущности типа sf::Uint32
    std::cout<<levelsMap[level][i];
    printf("\n");
    }
 
    return;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.11.2015, 09:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Алгоритм поиска пути и прорисовка его (C++):

Нужен алгоритм поиска пути в этом лабиринте (будь то волновой алгоритм или алгоритм правой/левой руки ) - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; void lab () { int s1 = 0; int s2 =...

Алгоритм поиска пути - C++
Ребята, помогите разобраться с кодом. Пробую реализовать преследование привидений пакмана. При этом использую алгоритм поиска пути и...

Волновой алгоритм поиска пути - C++
Добрый день. Реализую всем известный алгоритм поиска кратчайшего пути. Но не могу понять одну вещь. Пройдя волновым методам по...

Алгоритм поиска пути в лабиринте, заданном связным графом - C++
использовать алгоритм поиска пути в лабиринте, заданном связным графом. граф уже задан в самой программе. Пример: int mas = {...

Построить алгоритм поиска кратчайшего пути между двумя вершинами в графе - C++
Блин я уже так задолбался с этим заданием может кто нибудь поможет: Построить алгоритм поиска кратчайшего пути между двумя...

Алгоритм поиска пути A* - C++
использую библиотеку SFML только для окна пытался сделать алгоритм поиска пути от одной до другой точки(левая и правая кнопка мыши) окно...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
nmcf
5309 / 4629 / 1550
Регистрация: 14.04.2014
Сообщений: 18,437
01.11.2015, 09:32 #2
Почему не сделать этот levelsMap членом класса, чтобы у всех был доступ без передачи параметра? Почему он внутри функции-то оказался?
lenarano
1 / 1 / 0
Регистрация: 12.04.2014
Сообщений: 82
01.11.2015, 14:07  [ТС] #3
У меня изначально было все сделано структурно в Main
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
#include <SFML\Graphics.hpp>
const int HEIGHT_MAP=25;
const int WIDTH_MAP=28;
 sf::String TileMap[HEIGHT_MAP]={
    "0000000000000000000000000000",
    "0                          0",
    "0                          0",
    "0  0 s0   0      0   0s 0  0",
    "0  0000   0mmmmmm0   0000  0",
    "0  0  0   00000000   0  0  0",
    "0                          0",
    "0                          0",
    "0  0mm0   00000000   0mm0  0",
    "0  0000              0000  0",
    "0  0mm0              0mm0  0",
    "t         00000000         T",
    "t                          T",
    "t                          T",
    "0  0mm0   00000000   0mm0  0",
    "0  0000              0000  0",
    "0  0mm0              0mm0  0",
    "0         00000000         0",
    "0                          0",
    "0  0  0              0  0  0",
    "0  0000   00000000   0000  0",
    "0  0 s0              0s 0  0",
    "0                          0",
    "0                          0",
    "0000000000000000000000000000",
};
Потом начала разносить все по классам и понеслось((( С ООП мне сложно... Начала переносить, ребята посоветовали так... Я , если честно, особо не поняла -просто сделала, что бы работало. Если поможете, то буду рада.

Добавлено через 43 минуты
Я по совету nmcf попробовала levelsMap сделать поле, но возникли ошибки. Помогите их исправить.
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
#ifndef MAP_H
#define MAP_H
#include <SFML\Graphics.hpp>
class Map{
private:
int m_level;
 
public: 
   enum { HEIGHT_MAP=25, WIDTH_MAP=28 };
   sf::String TileMap[HEIGHT_MAP];
 static const char* levelsMap[][HEIGHT_MAP];
 Map();
 
 int getLevel();
 
 void setLevel(int level);
 
 
};
 
#include "map.h"
 
#include <iostream>
 
 
    static const char* levelsMap[][Map::HEIGHT_MAP] = {
        { 
                "0000000000000000000000000000",/* Инициализация 0-го уровня */
                "0   S                      0",
                "0                          0",
                "0  0 s0   0      0   0s 0 G0",
                "0  0000   0mmmmmm0   0000  0",
                "0  0mm0   00000000   0mm0  0",
                "0                          0",
                "0                          0",
                "0  0mm0   000  000   0mm0  0",
                "0  0000   0      0   0000  0",
                "0  0mm0   0      0   0mm0  0",
                "t         000  000         T",
                "t                          T",
                "t                          T",
                "0  0mm0   00000000   0mm0  0",
                "0  0000              0000  0",
                "0  0mm0              0mm0  0",
                "0         00000000         0",
                "0                          0",
                "0  0mm0              0mm0  0",
                "0  0000   00000000   0000  0",
                "0  0 s0              0s 0  0",
                "0                          0",
                "0                          0",
                "0000000000000000000000000000", },
            {"0000000000000000000000000000", /* Инициализация 1-го уровня */ 
            "0                          0",
            "0                          0",
            "0  0                    0  0",
            "0  0000              0000  0",
            "0  0      000  000      0  0",
            "0         0      0         0",
            "0         0      0         0",
            "0  0mm    000  000    mm0  0",
            "0  0000              0000  0",
            "0  0                    0  0",
            "t         00000000         T",
            "t           m00m           T",
            "t           m00m           T",
            "0  0      00000000      0  0",
            "0  0000              0000  0",
            "0  0                    0  0",
            "0                          0",
            "0      0000      0000      0",
            "0  0      0s    s0      0  0",
            "0  0  0   00000000   0  0  0",
            "0  0  0   0mmmmmm0   0  0  0",
            "0                          0",
            "0                          0",
            "0000000000000000000000000000", },
            { /* Инициализация 2-го уровня */ },
    };
 
Map::Map()
{
    setLevel(0);
}
 
int Map:: getLevel() { return m_level; }
 
void Map:: setLevel(int level)
{
    int levelsCount = sizeof(levelsMap) / sizeof(levelsMap[0]);//sizeof(levelsMap)-недопусимый неполный путь
    if (level < 0 || level >= levelsCount)
        level = 0;
    m_level = level;
    for(int i=0; i < HEIGHT_MAP; i++)
    {TileMap[i] = levelsMap[level][i];
    std::cout<<levelsMap[level][i];
    printf("\n");
    }
}
 
 
void display_maze( int level)
{
    int i;
    printf("MAZE:\n");
    for(int i=0; i < Map::HEIGHT_MAP; i++)
    {TileMap[i] = levelsMap[level][i];//TileMap[i] не определен
    std::cout<<levelsMap[level][i];
    printf("\n");
    }
 
    return;
}
Я закоментила, где ругается компилятор

Добавлено через 6 минут
передала по ссылке и на эту строчку уже не ругается. Правильно?
C++
1
int levelsCount = sizeof(&levelsMap) / sizeof(levelsMap[0]);
Добавлено через 4 минуты
все-таки не так
int levelsCount = sizeof(&levelsMap) / sizeof(levelsMap[0]);

Я закоментила свою функцию прорисовки и попробовала запустить -все равно ошибка

Добавлено через 7 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
void display_maze( int level)
{
    int i;
    printf("MAZE:\n");
    for(int i=0; i < Map::HEIGHT_MAP; i++)
    {TileMap[i] = levelsMap[level][i];//почему они не определены??
    std::cout<<levelsMap[level][i];
    printf("\n");
    }
 
    return;
}
Добавлено через 33 минуты
Нашла ошибки о которых стыдно говорить. На данный момент нужна помощь в том, что я не могу вывести levelsMap в поле класса, возникают ошибки. Если кто то покажет, как это будет-буду рада, может опять что-то упускаю. Если оставить как есть, то тогда естественно моя функция прорисовки void Map::display_maze( int level) его не видит. Подскажите пути исправления
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
#ifndef MAP_H
#define MAP_H
#include <SFML\Graphics.hpp>
class Map{
private:
int m_level;
 
public: 
   enum { HEIGHT_MAP=25, WIDTH_MAP=28 };
   sf::String TileMap[HEIGHT_MAP];
 
 Map();
 
 int getLevel();
 
 void setLevel(int level);
 
 void display_maze( int level);
};
 
 
 
#include "map.h"
 
#include <iostream>
 
 
 
Map::Map()
{
    setLevel(0);
    
}
 
int Map:: getLevel() { return m_level; }
 
void Map:: setLevel(int level)
{
    static const char* levelsMap[][HEIGHT_MAP] = {
        { 
                "0000000000000000000000000000",/* Инициализация 0-го уровня */
                "0   S                      0",
                "0                          0",
                "0  0 s0   0      0   0s 0 G0",
                "0  0000   0mmmmmm0   0000  0",
                "0  0mm0   00000000   0mm0  0",
                "0                          0",
                "0                          0",
                "0  0mm0   000  000   0mm0  0",
                "0  0000   0      0   0000  0",
                "0  0mm0   0      0   0mm0  0",
                "t         000  000         T",
                "t                          T",
                "t                          T",
                "0  0mm0   00000000   0mm0  0",
                "0  0000              0000  0",
                "0  0mm0              0mm0  0",
                "0         00000000         0",
                "0                          0",
                "0  0mm0              0mm0  0",
                "0  0000   00000000   0000  0",
                "0  0 s0              0s 0  0",
                "0                          0",
                "0                          0",
                "0000000000000000000000000000", },
            {"0000000000000000000000000000", /* Инициализация 1-го уровня */ 
            "0                          0",
            "0                          0",
            "0  0                    0  0",
            "0  0000              0000  0",
            "0  0      000  000      0  0",
            "0         0      0         0",
            "0         0      0         0",
            "0  0mm    000  000    mm0  0",
            "0  0000              0000  0",
            "0  0                    0  0",
            "t         00000000         T",
            "t           m00m           T",
            "t           m00m           T",
            "0  0      00000000      0  0",
            "0  0000              0000  0",
            "0  0                    0  0",
            "0                          0",
            "0      0000      0000      0",
            "0  0      0s    s0      0  0",
            "0  0  0   00000000   0  0  0",
            "0  0  0   0mmmmmm0   0  0  0",
            "0                          0",
            "0                          0",
            "0000000000000000000000000000", },
            { /* Инициализация 2-го уровня */ },
    };
    int levelsCount = sizeof(levelsMap) / sizeof(levelsMap[0]);
    if (level < 0 || level >= levelsCount)
        level = 0;
    m_level = level;
    for(int i=0; i < HEIGHT_MAP; i++)
    {TileMap[i] = levelsMap[level][i];
    std::cout<<levelsMap[level][i];
    printf("\n");
    }
}
 
 
void Map::display_maze( int level)
{
    int i;
    printf("MAZE:\n");
    for(int i=0; i < Map::HEIGHT_MAP; i++)
    {TileMap[i] = levelsMap[level][i];
    std::cout<<levelsMap[level][i];
    printf("\n");
    }
 
    return;
}
Добавлено через 2 часа 5 минут
nmcf
5309 / 4629 / 1550
Регистрация: 14.04.2014
Сообщений: 18,437
01.11.2015, 15:30 #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
class Map{
    int m_level;
public: 
    enum { HEIGHT_MAP=25, WIDTH_MAP=28 };
    static const char * levelsMap[][HEIGHT_MAP];
 Map();
 int getLevel();
 void setLevel(int level);
};
 
const char * Map::levelsMap[][Map::HEIGHT_MAP] = {
        { 
                "0000000000000000000000000000",/* Инициализация 0-го уровня */
                "0   S                      0",
                "0                          0",
                "0  0 s0   0      0   0s 0 G0",
                "0  0000   0mmmmmm0   0000  0",
                "0  0mm0   00000000   0mm0  0",
                "0                          0",
                "0                          0",
                "0  0mm0   000  000   0mm0  0",
                "0  0000   0      0   0000  0",
                "0  0mm0   0      0   0mm0  0",
                "t         000  000         T",
                "t                          T",
                "t                          T",
                "0  0mm0   00000000   0mm0  0",
                "0  0000              0000  0",
                "0  0mm0              0mm0  0",
                "0         00000000         0",
                "0                          0",
                "0  0mm0              0mm0  0",
                "0  0000   00000000   0000  0",
                "0  0 s0              0s 0  0",
                "0                          0",
                "0                          0",
                "0000000000000000000000000000"},
            {"0000000000000000000000000000", /* Инициализация 1-го уровня */ 
            "0                          0",
            "0                          0",
            "0  0                    0  0",
            "0  0000              0000  0",
            "0  0      000  000      0  0",
            "0         0      0         0",
            "0         0      0         0",
            "0  0mm    000  000    mm0  0",
            "0  0000              0000  0",
            "0  0                    0  0",
            "t         00000000         T",
            "t           m00m           T",
            "t           m00m           T",
            "0  0      00000000      0  0",
            "0  0000              0000  0",
            "0  0                    0  0",
            "0                          0",
            "0      0000      0000      0",
            "0  0      0s    s0      0  0",
            "0  0  0   00000000   0  0  0",
            "0  0  0   0mmmmmm0   0  0  0",
            "0                          0",
            "0                          0",
            "0000000000000000000000000000"}
    };
Количество уровней вычисляется так:
C++
1
int levelsCount = sizeof(levelsMap) / (Map::HEIGHT_MAP * sizeof(char *));
Зачем тебе понадобился массив древних строк, если всё равно переходишь на sf::String?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.11.2015, 15:30
Привет! Вот еще темы с ответами:

Волновой алгоритм поиска (Алгоритм A* / Алгоритм А стар) - C++
Хочу разработать алгоритм для решения головоломки с подвижными дисками (перестановочная головоломка). Определение. Перестано́вочные...

Объясните простые алгоритмы поиска пути. - C++
Объясните простые алгоритмы поиска пути. Подкиньте как-нибудь простенький типа волнового.

Написать программу поиска файла на ПК по его расширению, и отправки его на e-mail - C++
Я ищу человека который мне поможет написать программу для поиска файла на ПК по его расширению, и отправка его на e-mail , лучше бы чтобы...

Рекурсия (не могу из нее выйти) поиска пути в лабиринте - C++
Добрый день, друзья! Пытаюсь реализовать программу, которая бы находила путь в лабиринте(интовый массив, элемент =5 точка входа,...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
01.11.2015, 15:30
Ответ Создать тему
Опции темы

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