我目前正在建立一个吃pacman迷宫上所有食物的程序。但是,我的程序在每次Pacman进行新动作时调用,因此程序结束时不会保存任何内存,它只返回一个移动:L,R,U或Down。我是AI的新手,也是java编程的新手。我知道,通过在Google上搜索,最好的方法是使用BFS。问题是:我该怎么做?我是否必须为我访问的每个位置创建一个LinkedList,其中包含带我去的路径?例如:UULLDDLRRL。
我的另一个疑问是,我如何让pacman寻找最近的食物?
这是我的代码,我删除了代码的输入部分,这对我的问题并不重要。我将这张地图从Pacman保存在char [] []上。
class position{
int pX=0;
int pY=0;
char direction;
Boolean visited = false;
position(int pY, int pX, char direcao,Boolean visited)
{
this.pX=pX;
this.pY=pY;
this.direcao=direction;
this.direction=direction;
}
position()
{
pX=0;
pY=0;
direction='N';
visited=false;
}
}
position current = new position(pacmany,pacmanx,'N',false);
LinkedList<position> analise = new LinkedList<position>();
analise.addLast(current);
while(!analise.isEmpty())
{
if(m[current.pY-1][current.pX]!='#')
{
analise.addLast(new position(current.pY-1,current.pX,'U',false));
}
if(m[current.pY][current.pX+1]!='#')
{
analise.addLast(new position(current.pY,current.pX+1,'R',false));
}
if(m[current.pY+1][current.pX]!='#')
{
analise.addLast(new position(current.pY+1,current.pX,'D',false));
}
if(m[current.pY][current.pX-1]!='#')
{
analise.addLast(new position(current.pY,current.pX-1,'L',false));
}
analise.get(i).visited=true;
current=analise.get(i);
analise.remove();
}
}
}
答案 0 :(得分:0)
你需要处理的一个小问题很多问题是&#34;循环检查&#34;功能。
循环检查
你怎么知道你的迷宫是否包含一个循环?例如,您的应用程序可能会在迷宫中找到一个循环,并且永远不会终止或者需要很长时间才能找到路径,计算机将耗尽内存。
启发式功能
您可能需要一个启发式功能来帮助您找到最佳的下一步动作,并使您的算法更快。你应该再次了解什么是启发式函数,什么是可接受的启发式等等。
一般来说,当您是AI和编码新手时,开始编码搜索问题有点复杂。但这并不意味着放弃。但你应该开始阅读一些书籍,先了解Graph Theory
然后不同的Graph Traversal Algorithms
(即BFS,DFS,A-Star等)的概念,然后你会发现自己更容易思考问题
我认为提出并实施这些问题的更好方法是首先从理论上学习这个概念,然后尝试将其付诸实践。
我找到了一个非常有用的资源来玩here。
最后,使用this可能有助于了解多种搜索算法的工作原理。您可以使用鼠标创建自己的迷宫,然后运行所需的算法,您将看到算法执行方式的直观方式。
了解如何更改每个搜索算法的设置(包括启发式函数)并观察性能差异。