我目前正在开发一个C ++项目来制作PacMan克隆。基本上我几乎完成了游戏所做的一切。但我还没有想出如何实现广度优先搜索,以便鬼魂追逐pacman。在过去的几天里,我已经阅读了很多关于BFS的内容。我知道它是什么以及它做了什么。我也知道我必须为此目的使用队列。但是,我仍然无法在游戏中实际使用此算法。我有一个36 * 28瓷砖的2d网格。但我真的不确定如何在我的xy坐标系中实现它,推送到队列的内容以及如何操作相邻的tile。我陷入了困境。我不是要求实际代码。我只需要一个关于BFS实际实现的清晰简单的解释,以及在这个2D游戏网格中处理BFS时需要注意的事项。 您的解释将非常有用。感谢。
答案 0 :(得分:1)
我假设你每次幽灵都要移动时都要做BFS。你能做的就是从PacMan开始一个BFS,直到找到所有鬼魂。请注意,您实际上并不需要幽灵将采取的完整路线,您只需要下一步。在进行BFS时,您可以为每个细胞存储从PacMan到该细胞的距离。 BFS完成后,所有鬼魂都可以查看相邻的单元格,选择编号最小的单元格。请注意,您应该使用大数字初始化所有单元格。
要做你的BFS,你可以做一些技巧,比如将你的(x,y)坐标映射到一个数字。这个号码可以放在你的队列中。请注意,在将某些内容放入队列之前,应检查墙壁。当你从队列中拉出一些东西时,运行一个长度为4的for循环(相邻单元的数量)。
int dx[] = {0, 1, 0, -1};
int dy[] = {1, 0, -1, 0};
void do_bfs() {
std::queue<int> queue;
// initialize grid
// add starting position of pacman to queue
while(!queue.empty()) {
// remove and access first element
cur_place = queue.front(); queue.pop();
map_to_coordinate(cur_x, cur_y, cur_place);
cur_distance = grid[cur_x][cur_y];
for (int i = 0; i < 4; i++) {
if (cur_x + dx[i] >= 0 && /* more checks */) {
queue.push_back(map_to_number(cur_x + dx[i], cur_y + dy[i]));
grid[cur_x + dx[i]][cur_y + dy[i]] = cur_distance + 1;
}
}
}
// now grid is filled, so now you should find out for each ghost how to move
}
作为读者的练习,我试图在表达自己观点的同时保持开放。