generated from sigonasr2/CPlusPlusProjectTemplate
A* implemented!
Co-authored-by: sigonasr2 <sigonasr2@gmail.com>
This commit is contained in:
parent
fcdbb1e8b4
commit
a7f729d41a
Binary file not shown.
61
main.cpp
61
main.cpp
@ -1,20 +1,31 @@
|
||||
#define OLC_PGE_APPLICATION
|
||||
#include "pixelGameEngine.h"
|
||||
#include "olcutils.h"
|
||||
#include <vector>
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <cmath>
|
||||
|
||||
using namespace olc;
|
||||
struct vi2d{
|
||||
int x,y;
|
||||
friend std::ostream&operator<<(std::ostream&out,vi2d&rhs){
|
||||
out<<"("<<rhs.x<<","<<rhs.y<<")";
|
||||
return out;
|
||||
}
|
||||
};
|
||||
|
||||
struct node{
|
||||
private:
|
||||
char elevation='a';
|
||||
public:
|
||||
bool visited=false;
|
||||
std::vector<node*>connections;
|
||||
int myDist=INFINITY;
|
||||
int storedDist=INFINITY;
|
||||
vi2d pos;
|
||||
node*parent=nullptr;
|
||||
node(char elevation){
|
||||
this->elevation=elevation;
|
||||
};
|
||||
char getElevation(){
|
||||
return elevation=='S'?'a':elevation=='E'?'z'+1:elevation;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@ -26,7 +37,7 @@ node*endNode;
|
||||
|
||||
int main()
|
||||
{
|
||||
std::ifstream file("testinput2");
|
||||
std::ifstream file("input");
|
||||
while (file.good()){
|
||||
std::string line;
|
||||
std::getline(file,line);
|
||||
@ -48,18 +59,18 @@ int main()
|
||||
std::cout<<"================"<<std::endl;
|
||||
for (int y=0;y<grid.size();y++){
|
||||
for (int x=0;x<grid[y].size();x++){
|
||||
std::cout<<grid[y][x].elevation;
|
||||
std::cout<<grid[y][x].getElevation();
|
||||
grid[y][x].pos={x,y};
|
||||
if (x>0){
|
||||
if (x>0&&grid[y][x-1].getElevation()-1<=grid[y][x].getElevation()){
|
||||
grid[y][x].connections.push_back(&grid[y][x-1]);
|
||||
}
|
||||
if (x<grid[y].size()-1){
|
||||
if (x<grid[y].size()-1&&grid[y][x+1].getElevation()-1<=grid[y][x].getElevation()){
|
||||
grid[y][x].connections.push_back(&grid[y][x+1]);
|
||||
}
|
||||
if (y>0){
|
||||
if (y>0&&grid[y-1][x].getElevation()-1<=grid[y][x].getElevation()){
|
||||
grid[y][x].connections.push_back(&grid[y-1][x]);
|
||||
}
|
||||
if (y<grid.size()-1){
|
||||
if (y<grid.size()-1&&grid[y+1][x].getElevation()-1<=grid[y][x].getElevation()){
|
||||
grid[y][x].connections.push_back(&grid[y+1][x]);
|
||||
}
|
||||
if (x==playerPos.x&&y==playerPos.y){
|
||||
@ -76,38 +87,26 @@ int main()
|
||||
|
||||
std::vector<node*>searchNodes;
|
||||
searchNodes.push_back(startNode);
|
||||
startNode->myDist=0.0f;
|
||||
while (searchNodes.size()>0){
|
||||
node*currentNode=searchNodes.front();
|
||||
if (currentNode==startNode){
|
||||
currentNode->myDist=pow(currentNode->pos.x-endNode->pos.x,2)+pow(currentNode->pos.y-endNode->pos.y,2);
|
||||
if (currentNode->visited){
|
||||
searchNodes.erase(searchNodes.begin());
|
||||
continue;
|
||||
}
|
||||
currentNode->visited=true;
|
||||
if (currentNode->elevation=='S'){
|
||||
currentNode->elevation='a'-1;
|
||||
}
|
||||
if (currentNode->elevation=='E'){
|
||||
currentNode->elevation='z'+1;
|
||||
}
|
||||
for (int i=0;i<currentNode->connections.size();i++){
|
||||
node*neighbor=currentNode->connections[i];
|
||||
if (neighbor==endNode){
|
||||
//We can't go any higher.
|
||||
endNode->parent=currentNode;
|
||||
break;
|
||||
}
|
||||
if (neighbor->elevation-1<=currentNode->elevation){
|
||||
if (neighbor->parent==nullptr||currentNode->myDist<neighbor->storedDist){
|
||||
neighbor->parent=currentNode;
|
||||
neighbor->storedDist=currentNode->myDist;
|
||||
neighbor->myDist=pow(neighbor->pos.x-endNode->pos.x,2)+pow(neighbor->pos.y-endNode->pos.y,2);
|
||||
if (!neighbor->visited){
|
||||
searchNodes.push_back(neighbor);
|
||||
}
|
||||
float lowerGoal=currentNode->myDist+pow(neighbor->pos.x-currentNode->pos.x,2)+pow(neighbor->pos.y-currentNode->pos.y,2);
|
||||
if (lowerGoal<neighbor->myDist){
|
||||
neighbor->parent=currentNode;
|
||||
neighbor->myDist=lowerGoal;
|
||||
}
|
||||
}
|
||||
}
|
||||
searchNodes.erase(searchNodes.begin());
|
||||
}
|
||||
|
||||
node*searchNode=endNode;
|
||||
int jumps=0;
|
||||
|
2
sig
2
sig
@ -3,7 +3,7 @@ export AUTO_UPDATE=true
|
||||
source utils/define.sh
|
||||
|
||||
define PROJECT_NAME "C++ProjectTemplate"
|
||||
define CUSTOM_PARAMS "-std=c++17 -lX11 -lGL -lpthread -lpng -lstdc++fs -lpulse -lpulse-simple -I/usr/include/lua5.3"
|
||||
define CUSTOM_PARAMS "-std=c++17 -lX11 -lpthread -lpng -lstdc++fs -I/usr/include/lua5.3"
|
||||
define LANGUAGE "C++"
|
||||
|
||||
source utils/main.sh
|
||||
|
Loading…
x
Reference in New Issue
Block a user