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

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

Восстановить пароль Регистрация
 
lenarano
1 / 1 / 0
Регистрация: 12.04.2014
Сообщений: 75
01.11.2015, 09:31     Алгоритм поиска пути и прорисовка его #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
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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4297 / 3718 / 1251
Регистрация: 14.04.2014
Сообщений: 14,540
01.11.2015, 09:32     Алгоритм поиска пути и прорисовка его #2
Почему не сделать этот levelsMap членом класса, чтобы у всех был доступ без передачи параметра? Почему он внутри функции-то оказался?
lenarano
1 / 1 / 0
Регистрация: 12.04.2014
Сообщений: 75
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
4297 / 3718 / 1251
Регистрация: 14.04.2014
Сообщений: 14,540
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?
Yandex
Объявления
01.11.2015, 15:30     Алгоритм поиска пути и прорисовка его
Ответ Создать тему
Опции темы

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