poprawiony movement oraz maxFloat
This commit is contained in:
parent
1bf1dc50b9
commit
8faa04ecb5
68
Main.cpp
68
Main.cpp
@ -9,6 +9,8 @@
|
|||||||
#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;
|
||||||
@ -19,9 +21,9 @@ struct cell
|
|||||||
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,
|
||||||
|
Loading…
Reference in New Issue
Block a user