Доброе время суток. Мой русский очень плохой поетому на ошибки не обращайте внимания. Я только начал изучать с++ и столкнулся с проблемой. Пишу игру, и на даном етапе хочу реализовать ИИ бота по волновому алгоритму Лии, ну и собственно у меня ето не получается. Постараюсь максимально всьо розписать чтоб читателю стало понятно что я хочу. Дано екземпляр класа block игрового поля в виде масива grid[HEIGHT][WIDTH] #define WIDTH 80 #define HEIGHT 45 мне нужно от екземпляра класа piton проложить путь к targ. a вот собственно функция которая не работает
int AI::search() {
float targ; float delta; int deltaX; int deltaY; int n=15;
int i; for (i=0;i<10;++i){ //вичисление координат самай ближней точки m[i] deltaX=piton[0].x-m[i].x; deltaY=piton[0].y-m[i].y; delta=((deltaX*deltaX)+(deltaY*deltaY)); targ = sqrt(delta);
const int WALL = -1; // непроходимая ячейка const int BLANK = -2; // свободная непомеченная ячейка int ax,ay,bx,by;
int px[WIDTH * HEIGHT], py[WIDTH * HEIGHT]; // координаты ячеек, входящих в путь int len; // длина пути //int grid[HEIGHT][WIDTH]; // рабочее поле
for(int j=0; j<HEIGHT;++j) // питаюсь заполнить массив grid значениями WALL и BLANK { for (int n=0;n<WIDTH;++n) { if(grid[j][n]==block[piton[j].x] && block[piton[j].y])//piton ето ещьо один екземпляр класа block { grid [j][n]=grid[WALL][WALL]; } else grid[j][n]=grid[BLANK][BLANK]; } }
// Перед вызовом lee() массив grid заполнен значениями WALL и BLANK
bool lee(ax,ay,bx,by); // поиск пути из ячейки (ax, ay) в ячейку (bx, by) { int dx[4] = {1, 0, -1, 0}; // смещения, соответствующие соседям ячейки int dy[4] = {0, 1, 0, -1}; // справа, снизу, слева и сверху int d, x, y, k; bool stop;
// распространение волны d = 0; grid[ay][ax] = 0; // стартовая ячейка помечена 0 do { stop = true; // предполагаем, что все свободные клетки уже помечены for ( y = 0; y < HEIGHT; ++y ) for ( x = 0; x < WIDTH; ++x ) if ( grid[y][x] == d ) // ячейка (x, y) помечена числом d { for ( k = 0; k < 4; ++k ) // проходим по всем непомеченным соседям if ( grid[y + dy[k]][x + dx[k]] == BLANK ) { stop = false; // найдены непомеченные клетки grid[y + dy[k]][x + dx[k]] = d + 1; // распространяем волну } } d++; } while ( !stop && grid[by][bx] == BLANK );
if (grid[by][bx] == BLANK) return false; // путь не найден
// восстановление пути len = grid[by][bx]; // длина кратчайшего пути из (ax, ay) в (bx, by) x = bx; y = by; d = len; while ( d > 0 ) { px[d] = x; py[d] = y; // записываем ячейку (x, y) в путь d--; for (k = 0; k < 4; ++k) if (grid[y + dy[k]][x + dx[k]] == d) { x = x + dx[k]; y = y + dy[k]; // переходим в ячейку, которая на 1 ближе к старту break; } } px[0] = ax; py[0] = ay; // теперь px[0..len] и py[0..len] - координаты ячеек пути return true; } } }
Хочу ещьо раз подметить что с++ я начал учить 4 месяца назад, и много чего самому непонятно поетому не смейтесь если чтото не так сказал. Ну и спс за помощьо.