poprawiony movement oraz maxFloat

This commit is contained in:
Tomasz Dzierzbicki 2020-04-26 22:57:03 +00:00
parent 1bf1dc50b9
commit 8faa04ecb5

View File

@ -9,19 +9,21 @@
#include<stack> #include<stack>
using namespace std; using namespace std;
const float maxFloat=FLT_MAX;
const int ROW = 27; const int ROW = 27;
const int COL = 27; const int COL = 27;
typedef pair<int, int> Pair; typedef pair<int, int> Pair;
typedef pair<double, pair<int, int> > pPair; typedef pair<double, pair<int, int>> pPair;
struct cell struct cell
{ {
int parent_i, parent_j; int parent_i, parent_j;
double f, g, h; double f, g, h;
}; };
char pole[27][27][2]; char pole[27][27][2];
int pozycjaTraktoraX = 1, pozycjaTraktoraY = 1; int pozycjaTraktoraX = 1, pozycjaTraktoraY = 1;
char currentWay = 'S';
void color(string foregroundColor, string backgroundColor) void color(string foregroundColor, string backgroundColor)
{ {
@ -153,6 +155,43 @@ void updatePola()
} }
} }
void correctMovement(char wantedWay)
{
while (currentWay != wantedWay)
{
switch (currentWay)
{
case 'N':
{
if (wantedWay == 'S')
currentWay = wantedWay;
else
currentWay = 'W';
}break;
case 'S':
{
if (wantedWay == 'N')
currentWay = wantedWay;
else
currentWay = 'W';
}break;
case 'W':
{
if (wantedWay == 'E')
currentWay = wantedWay;
else
currentWay = 'N';
}break;
case 'E':
{
if (wantedWay == 'W')
currentWay = wantedWay;
else
currentWay = 'N';
}break;
}
}
}
void Move(char kierunek) void Move(char kierunek)
{ {
switch (kierunek) switch (kierunek)
@ -162,10 +201,10 @@ void Move(char kierunek)
{ {
if (pole[pozycjaTraktoraY - 1][pozycjaTraktoraX][0] != '#') if (pole[pozycjaTraktoraY - 1][pozycjaTraktoraX][0] != '#')
{ {
correctMovement('N');
pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = '.'; pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = '.';
pozycjaTraktoraY--; pozycjaTraktoraY--;
pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = 'T'; pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = 'T';
} }
updatePola(); updatePola();
}break; }break;
@ -174,10 +213,10 @@ void Move(char kierunek)
{ {
if (pole[pozycjaTraktoraY + 1][pozycjaTraktoraX][0] != '#') if (pole[pozycjaTraktoraY + 1][pozycjaTraktoraX][0] != '#')
{ {
correctMovement('S');
pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = '.'; pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = '.';
pozycjaTraktoraY++; pozycjaTraktoraY++;
pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = 'T'; pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = 'T';
} }
updatePola(); updatePola();
}break; }break;
@ -186,10 +225,10 @@ void Move(char kierunek)
{ {
if (pole[pozycjaTraktoraY][pozycjaTraktoraX - 1][0] != '#') if (pole[pozycjaTraktoraY][pozycjaTraktoraX - 1][0] != '#')
{ {
correctMovement('W');
pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = '.'; pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = '.';
pozycjaTraktoraX--; pozycjaTraktoraX--;
pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = 'T'; pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = 'T';
} }
updatePola(); updatePola();
}break; }break;
@ -198,17 +237,16 @@ void Move(char kierunek)
{ {
if (pole[pozycjaTraktoraY][pozycjaTraktoraX + 1][0] != '#') if (pole[pozycjaTraktoraY][pozycjaTraktoraX + 1][0] != '#')
{ {
correctMovement('E');
pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = '.'; pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = '.';
pozycjaTraktoraX++; pozycjaTraktoraX++;
pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = 'T'; pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = 'T';
} }
updatePola(); updatePola();
}break; }break;
} }
} }
bool isValid(int x, int y) bool isValid(int x, int y)
{ {
if (pole[x][y][0] != '#') if (pole[x][y][0] != '#')
@ -217,7 +255,6 @@ bool isValid(int x, int y)
} }
return false; return false;
} }
bool isDestination(int x, int y,Pair dest) bool isDestination(int x, int y,Pair dest)
{ {
if (dest.first == x && dest.second == y) if (dest.first == x && dest.second == y)
@ -226,12 +263,10 @@ bool isDestination(int x, int y,Pair dest)
} }
return false; return false;
} }
double calculateHValue(int x, int y, Pair dest) double calculateHValue(int x, int y, Pair dest)
{ {
return abs(x - dest.first) + abs(y - dest.second); return abs(x - dest.first) + abs(y - dest.second);
} }
void tracePath(cell cellDetails[][COL], Pair dest) void tracePath(cell cellDetails[][COL], Pair dest)
{ {
//printf("\nThe Path is "); //----start info //printf("\nThe Path is "); //----start info
@ -270,7 +305,6 @@ void tracePath(cell cellDetails[][COL], Pair dest)
return; return;
} }
void aStarSearch(int grid[][COL],Pair src, Pair dest) void aStarSearch(int grid[][COL],Pair src, Pair dest)
{ {
bool closedList[ROW][COL]; bool closedList[ROW][COL];
@ -283,9 +317,9 @@ void aStarSearch(int grid[][COL],Pair src, Pair dest)
{ {
for (j = 0; j < COL; j++) for (j = 0; j < COL; j++)
{ {
cellDetails[i][j].f = FLT_MAX; cellDetails[i][j].f = maxFloat;
cellDetails[i][j].g = FLT_MAX; cellDetails[i][j].g = maxFloat;
cellDetails[i][j].h = FLT_MAX; cellDetails[i][j].h = maxFloat;
cellDetails[i][j].parent_i = -1; cellDetails[i][j].parent_i = -1;
cellDetails[i][j].parent_j = -1; cellDetails[i][j].parent_j = -1;
} }
@ -331,7 +365,7 @@ void aStarSearch(int grid[][COL],Pair src, Pair dest)
hNew = calculateHValue(i - 1, j, dest); hNew = calculateHValue(i - 1, j, dest);
fNew = gNew + hNew; fNew = gNew + hNew;
if (cellDetails[i - 1][j].f == FLT_MAX || if (cellDetails[i - 1][j].f == maxFloat ||
cellDetails[i - 1][j].f > fNew) cellDetails[i - 1][j].f > fNew)
{ {
openList.insert(make_pair(fNew, openList.insert(make_pair(fNew,
@ -364,7 +398,7 @@ void aStarSearch(int grid[][COL],Pair src, Pair dest)
gNew = cellDetails[i][j].g + waga; gNew = cellDetails[i][j].g + waga;
hNew = calculateHValue(i + 1, j, dest); hNew = calculateHValue(i + 1, j, dest);
fNew = gNew + hNew; fNew = gNew + hNew;
if (cellDetails[i + 1][j].f == FLT_MAX || if (cellDetails[i + 1][j].f == maxFloat ||
cellDetails[i + 1][j].f > fNew) cellDetails[i + 1][j].f > fNew)
{ {
openList.insert(make_pair(fNew, make_pair(i + 1, j))); openList.insert(make_pair(fNew, make_pair(i + 1, j)));
@ -394,7 +428,7 @@ void aStarSearch(int grid[][COL],Pair src, Pair dest)
gNew = cellDetails[i][j].g + waga; gNew = cellDetails[i][j].g + waga;
hNew = calculateHValue(i, j + 1, dest); hNew = calculateHValue(i, j + 1, dest);
fNew = gNew + hNew; fNew = gNew + hNew;
if (cellDetails[i][j + 1].f == FLT_MAX || if (cellDetails[i][j + 1].f == maxFloat ||
cellDetails[i][j + 1].f > fNew) cellDetails[i][j + 1].f > fNew)
{ {
openList.insert(make_pair(fNew, openList.insert(make_pair(fNew,
@ -425,7 +459,7 @@ void aStarSearch(int grid[][COL],Pair src, Pair dest)
gNew = cellDetails[i][j].g + waga; gNew = cellDetails[i][j].g + waga;
hNew = calculateHValue(i, j - 1, dest); hNew = calculateHValue(i, j - 1, dest);
fNew = gNew + hNew; fNew = gNew + hNew;
if (cellDetails[i][j - 1].f == FLT_MAX || if (cellDetails[i][j - 1].f == maxFloat ||
cellDetails[i][j - 1].f > fNew) cellDetails[i][j - 1].f > fNew)
{ {
openList.insert(make_pair(fNew, openList.insert(make_pair(fNew,