void AddOpen(PathFinder* pf, int x, int y, Node* parent) { if (x < 0 || x >= pf->map->width) return; if (y < 0 || y >= pf->map->height) return; // Ignore if the node isn't walkable if (GetTile(pf->map, x, y) == Wall) return; // Ignore if the node has already been checked before. if (pf->nodeMap[x][y].open == OnClosedList) return; if (pf->nodeMap[x][y].open == NoList) { pf->nodeMap[x][y].parent = parent; pf->nodeMap[x][y].g = ComputeG(pf, x, y, parent); pf->nodeMap[x][y].h = ComputeH(pf, x, y); pf->nodeMap[x][y].f = ComputeF(pf, x, y); pf->nodeMap[x][y].open = OnOpenList; QueueAdd(pf->openList, &pf->nodeMap[x][y]); } else if (pf->nodeMap[x][y].open == OnOpenList) { int g = ComputeG(pf, x, y, parent); // If this path we're currently searching is better, use it instead if (pf->nodeMap[x][y].g > g) { pf->nodeMap[x][y].parent = parent; pf->nodeMap[x][y].g = ComputeG(pf, x, y, parent); pf->nodeMap[x][y].h = ComputeH(pf, x, y); pf->nodeMap[x][y].f = ComputeF(pf, x, y); int index = QueueSearch(pf->openList, &pf->nodeMap[x][y]); PercolateUp(pf->openList, index, &pf->nodeMap[x][y]); } } }
int main(int argc, const char * argv[]) { int x,choice; struct CircularQueue cq; cq.front = CRICULARQUEUESIZE-1; cq.rear = CRICULARQUEUESIZE-1; do{ menu(); scanf("%d", &choice); switch (choice) { case 1: printf("Enter elements to enqueue\n"); scanf("%d", &x); enqueue(&cq, x); break; case 2: x = dequeue(&cq); printf("\n%d is dequeue\n",x); break; case 3: display(&cq); break; case 4: clearQ(&cq); break; case 5: printf("Enter element you need to search for \n"); scanf("%d",&x); int pos = QueueSearch(&cq, x); printf("The key element %d found at index %d\n", x, pos); break; default: printf("\nWrong entry, Try again !\n"); break; } }while (choice != 6); return 0; }